5

I am attempting to install the AWS "Approved" PostgreSql Extension on our on large RDS instance but every time I at the point I attempt to 'create extension postgis_tiger_geocoder' I get this:

SQL Error [42883]: ERROR: function soundex(character varying) does not exist

I have spent a good bit of time reading the AWS / postgis / postgresql forums but unfortunately haven't found the writing on the wall.

Steps Taken

Installed the POSTGIS extension

create EXTENSION postgis; 

Installed the FuzzyStrMatch Extension which contains the soundex function (verified)

create EXTENSION fuzzystrmatch; 

Finally when I run this create extension I get the error above

create extension postgis_tiger_geocoder;
SQL Error [42883]: ERROR: function soundex(character varying) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Position: 57558
org.postgresql.util.PSQLException: ERROR: function soundex(character varying) does not exist
Hint: No function matches the given name and argument types. You might need to add explicit type casts.
Position: 57558

Things I have tried:

set search_path = <schema_name>, public

Followed here: Installing PostgreSQL Extension to all schemas Dug deeply into postgis installation documentation Read through RDS documentation on adding Extensions...

If anyone has had to deal with this frustration on AWS I will happily swap a few of the remaining hairs left on my head as I have not been able to work around this.

Results of \dx+

                      Objects in extension "fuzzystrmatch"
                               Object Description
--------------------------------------------------------------------------------
 function <schema>.difference(...)
 function <schema>.dmetaphone_alt(...)
 function <schema>.dmetaphone(...)
 function <schema>.levenshtein_less_equal(...)
 function <schema>.levenshtein_less_equal(...)
 function <schema>.levenshtein(...)
 function <schema>.levenshtein(...)
 function <schema>.metaphone(...)
 function <schema>.soundex(...)
 function <schema>.text_soundex(...)
(10 rows)

Results of \dfS+ soundex

                                                                       List of functions
 Schema | Name | Result data type | Argument data types | Type | Volatility | Owner | Security | Access privileges | Language | Source code | Description
--------+------+------------------+---------------------+------+------------+-------+----------+-------------------+----------+-------------+-------------
(0 rows)

2 Answers2

3

Had the same problem, resolved it by altering search_path for database and reconnect before creating extension postgis_tiger_geocoder. Look for the FIX part :

-- Postgis Installation
------------------------------------------------------------------------------------------------------------------------------------------------
-- PostGIS AWS Configuration                                                                                                                  --
-- https://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/Appendix.PostgreSQL.CommonDBATasks.html#Appendix.PostgreSQL.CommonDBATasks.PostGIS  --
------------------------------------------------------------------------------------------------------------------------------------------------
-- On postgis schema
SET SCHEMA '${POSTGIS_SCHEMA_NAME}';
-- Step 2: Load the PostGIS Extensions
create extension postgis;
create extension fuzzystrmatch;
-- FIX : To avoid "ERROR:  function soundex(character varying) does not exist", change schema and reconnect
ALTER DATABASE ${DATABASE_NAME} SET search_path=${POSTGIS_SCHEMA_NAME};
\connect ${DATABASE_NAME};
-- End FIX
create extension postgis_tiger_geocoder;
create extension postgis_topology;
-- Step 3: Transfer Ownership of the Extensions to the rds_superuser Role
alter schema tiger owner to ${MASTER_USER};
alter schema tiger_data owner to ${MASTER_USER};
alter schema topology owner to ${MASTER_USER};
-- Step 4: Transfer Ownership of the Objects to the rds_superuser Role
CREATE FUNCTION exec(text) returns text language plpgsql volatile AS $f$ BEGIN EXECUTE $1; RETURN $1; END; $f$;
SELECT exec('ALTER TABLE ' || quote_ident(s.nspname) || '.' || quote_ident(s.relname) || ' OWNER TO ${MASTER_USER};')
  FROM (
    SELECT nspname, relname
    FROM pg_class c JOIN pg_namespace n ON (c.relnamespace = n.oid)
    WHERE nspname in ('tiger','topology') AND
    relkind IN ('r','S','v') ORDER BY relkind = 'S')
s;

-- Adding postgis to default schema
ALTER DATABASE ${DATABASE_NAME} SET search_path=${SCHEMA_NAME},${POSTGIS_SCHEMA_NAME};
Alexandre Hamon
  • 1,162
  • 12
  • 13
1

Had the same problem. Turns out that all the fuzzystrmatch's functions were created inside the wrong schema.

Connected with psql command line, I used the drop extension command to restart the process of creating the extensions:

drop extension postgis_topology;
drop extension postgis;
drop extension fuzzystrmatch;

Then, just to be sure, disconnected using \q.

Connected psql again.

Set the schema to public:

set schema 'public';

Then, follow the process described in AWS RDS Docs

create extension postgis;
create extension fuzzystrmatch;
create extension postgis_tiger_geocoder;
create extension postgis_topology;
Nick K9
  • 3,885
  • 1
  • 29
  • 62
Marco Mannes
  • 186
  • 8