I just moved PostGIS extension (I have version 2.5) from public schema to another (mob) schema by following the docs at this official PostGIS page.
I did:
ALTER DATABASE mob_odm
SET search_path = public,mob;
UPDATE pg_extension
SET extrelocatable = TRUE
WHERE extname = 'postgis';
ALTER EXTENSION postgis
SET SCHEMA mob;
ALTER EXTENSION postgis
UPDATE TO "2.5.4";
Now GeoServer (version 2.17.2) seems to raise errors everytime I make getFeature requests to a WFS. This used to work just before this change. It fails with this exception:
<?xml version="1.0" encoding="UTF-8"?><ows:ExceptionReport xmlns:xs="http://www.w3.org/2001/XMLSchema" xmlns:ows="http://www.opengis.net/ows/1.1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0.0" xsi:schemaLocation="http://www.opengis.net/ows/1.1 http://localhost:8080/geoserver/schemas/ows/1.1.0/owsAll.xsd">
<ows:Exception exceptionCode="NoApplicableCode">
<ows:ExceptionText>java.lang.RuntimeException: java.io.IOException
java.io.IOExceptionERROR: operator does not exist: geometry public.&amp;&amp; geometry
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Where: SQL function &quot;st_intersects&quot; during inlining</ows:ExceptionText>
</ows:Exception>
</ows:ExceptionReport>
The query in the log is this one:
SELECT count(*) AS gt_result_ FROM (SELECT * FROM "mob"."signal_geo_outbound" WHERE ("level" IN ('level1', 'level2', 'level3') AND "level" IS NOT NULL AND "db" = 'XXX' AND "db" IS NOT NULL AND "freq" = 'daily' AND "freq" IS NOT NULL AND "isdiag" = 0 AND "isdiag" IS NOT NULL AND "geom" && ST_GeomFromText('POINT (1389121.0076528117 5486502.466631511)', 3857) AND ST_Intersects("geom", ST_GeomFromText('POINT (1389121.0076528117 5486502.466631511)', 3857)) AND "time" = '2020-09-20 00:00:00.0' AND "time" IS NOT NULL ) LIMIT 1000000) gt_limited_
The problem seems to be in the call to ST_Intersects:
Hint: No operator matches the given name and argument type(s). You might need to add explicit type casts.
Where: SQL function "st_intersects" during inlining
I am not that expert in using PostgreSQL, but from this answer I understand I would need to check that
PostGIS extension must be installed in a schema that must also be in the user search path
select e.extname,n.*
from pg_extension e, pg_namespace n
where e.extnamespace = n.oid and e.extname='postgis';
>>> extname | nspname | nspowner | nspacl
>>> postgis | mob | 16,384 | NULL
And you can check if the schema where it is installed is in the user search path by issuing
show search_path;
>>> search_path
>>> "$user",mob,public
I don't know if I am supposed to do anything else, or if I have to move postgis back to the public schema in order to make GeoServer work.
The reason why I did that is that I am performing spatial queries to the database with a JavaScript library called pg-promise that is initialized in my case to work in the mob schema and could not work before making this change (now it works).
I also tried to restart GeoServer after moving the postgis extension to the different schema, but it did not solve the problem.
sh startup.sh, where is it supposed to take the role from? – umbe1987 Sep 25 '20 at 10:37user– Ian Turton Sep 25 '20 at 10:40umbertoand so is the connection I am using (justchecked withselect * from pg_user). However, the query fails in dbeaver as well (my client), but not in my web app, so I must make sure the changes I performed to move the extension were applied correctly. Do I need to specify a user when moving the extension? – umbe1987 Sep 25 '20 at 10:45publicschema, and changed my web application defining themobschema everywhere and not initializing it inmobschema. Now everything works... thank you Ian for taking the time to giving me support, I really appreciate it! – umbe1987 Sep 25 '20 at 12:09