3
votes

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
Paste the result of \dx+ and \dfS+ soundex in psqlEvan Carroll
@Evan Carrol Updateduser8666502
Ok, update with the results of \dxEvan Carroll
Have you solved this issue? I'm having the same problem here and there is no much more hair on my head...Marco Mannes

2 Answers

3
votes

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};
1
votes

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;