[postgis-users] Re: Restoring db with indexes using PostGIS functions

Mike Leahy mgleahy at alumni.uwaterloo.ca
Tue Sep 30 16:37:56 PDT 2008


Hello Regina,

There's no problems with table constraints or anything like that...the 
only issue is with the indexes that use st_geometrytype.  I can give the 
compressed format a try...what version of PostgreSQL are you using? 
I've got 8.3 on the machines I'm using, and I think the dump format has 
changed slightly from one version to the next (though I'm not 100% sure 
about that).

I don't normally set the search path either.  As you recommend, I 
explicitly reference the schema.table names in all of the SQL that I've 
been writing myself.  It's only when restoring the database that I've 
encountered this.

Mike

Paragon Corporation wrote:
> Mike,
> 
> I'm a bit puzzled about your problem.  Are you saying that you use multiple
> schemas for tables and have your postgis functions in public and when you
> restore your indexes
> they are not being created because of the search path thing.  I use multiple
> table schemas too and as far as I can remember all my spatial constraints
> and indexes come back and I don't see any prefixing of public in the
> functions.
> 
> Although sounds like you are dumping to sql format and I always dump to
> compressed format.  Perhaps they behave differently.
> 
> Is it just your indexes that are missing or the constraints as well?  Your
> indexes seem a little out of the ordinary, but I would expect you would have
> the same issue
> With postgis generated constraints.  Do your table indexes actually show
> without the schema qualification on them when you look at them.
> 
> Mine always show as 
> CREATE INDEX sometable_idx
>   ON someschema.sometable  
> USING btree
>   (ST_GeometryType(the_geom));
> 
> But then again I always explicitly put in the schema prefix when creating
> indexes.  How would you be able to create the indexes otherwise unless you
> are setting the search path before you create your indexes
> 
> Set search_path = schemaname
> CREATE INDEX ... ON sometable
> 
> Is that how you create your indexes or do you explicitly reference the table
> schema name in the CREATE? 
> 
> 
> 
> Hope that helps,
> Regina
> 
> 
> 
> -----Original Message-----
> From: postgis-users-bounces at postgis.refractions.net
> [mailto:postgis-users-bounces at postgis.refractions.net] On Behalf Of Mike
> Leahy
> Sent: Tuesday, September 30, 2008 4:00 PM
> To: postgis-users at postgis.refractions.net
> Subject: [postgis-users] Re: Restoring db with indexes using PostGIS
> functions
> 
> Mark Cave-Ayland wrote:
>> Mike Leahy wrote:
>>> Hello list,
>>>
>>> I ran into a problem today when restoring a database of mine - I'm not 
>>> sure if this is anything new, or if I'm doing something I shouldn't be 
>>> doing.  I have in my db a variety of tables that are stored in separate 
>>> schemas.  Some of these tables have geometry columns that I am using to 
>>> store variable geometry types, but since most of the queries on these 
>>> tables generally focus on one geometry type at a time, I added indexes 
>>> to them as follows:
>>>
>>> CREATE INDEX mytable_geomtype_idx ON schemaname.mytable USING btree 
>>> (st_geometrytype(geom));
>>>
>>> However, when I dump the database, the resulting sql sets search paths 
>>> rather than explicitly naming schema.table in each statement. 
>>> Effectively, this is what happens when the dumped sql is loaded into a 
>>> new database:
>>>
>>> mydb=# SET search_path = schemaname, pg_catalog;
>>> SET
>>> mydb=# CREATE INDEX mytable_geomtype_idx ON mytable USING btree 
>>> (public.st_geometrytype(geom));
>>> ERROR:  function geometrytype(public.geometry) does not exist
>>> LINE 1: SELECT  geometrytype( $1 )
>>>                 ^
>>> HINT:  No function matches the given name and argument types. You might 
>>> need to add explicit type casts.
>>> QUERY:  SELECT  geometrytype( $1 )
>>> CONTEXT:  PL/pgSQL function "st_geometrytype" line 6 during statement 
>>> block local variable initialization
>>> mydb=#
>>>
>>> It seems that setting the search path has undesirable effects with the 
>>> st_geometrytype function (I don't know if the same happens with other 
>>> functions).  I suspect 'geometrytype( $1 )' would have to be substituted
> 
>>> with 'public.geometrytype( $1 )' for this to work.
>>>
>>> Is this just something I should be aware of?  It's not a show-stopper 
>>> for me at the moment, but it means that I'd have to manually recreate 
>>> any indexes like the one above if performance became an issue after 
>>> restoring the database (not in my current situation, but maybe down the 
>>> road).
>>>
>>> Regards,
>>> Mike
>>
>> Hi Mike,
>>
>> If you are using newer PostgreSQL releases, there was an issue a while 
>> back where the use of search_path within stored procedures was 
>> restricted to stop people from overriding in-built stored procedures. 
>> Otherwise it could simply be that the dump ordering is wrong, and 
>> altering the restore order so that geometrytype() is restored *before* 
>> ST_geometrytype should resolve the issue.
>>
>>
>> HTH,
>>
>> Mark.
> 
> Hello Mark,
> 
> I don't think it is a problem with the order of restoration of the 
> geometrytype() vs. st_geometrytype() functions, because those are loaded 
> and working fine before anything else happens in the restore script. 
> The problem is when indexes are being restored for the tables inside my 
> schemas - the dump script will set the search path for one schema, 
> create the indexes, then repeat for any other schemas.  It does this 
> throughout from what I can tell.
> 
> This problem, from what I can tell, is not limited to the restore 
> scripts.  The problem occurs just by setting the search path to 
> something other than 'public', then calling public.st_geometrytype(), 
> which in turn calls geometrytype().  Since st_geometrytype() isn't 
> calling public.geometrytype(), it can't find the function in the current 
> search path.  At least, this is what I think the issue is.
> 
> The only way for me to get around this as things are now would be to 
> edit the restore script so that it uses 'public' for the search path, 
> then rewrite all the create index statements to refer to schema.table.
> 
> Mike
> _______________________________________________
> postgis-users mailing list
> postgis-users at postgis.refractions.net
> http://postgis.refractions.net/mailman/listinfo/postgis-users
> 
> 
> 



More information about the postgis-users mailing list