Revert "fix: geojson invalid query on unavailable PostGIS"

This reverts commit 0f1ca8faac.

Reverting for now as it adds one more query to the schema cache and
there's no clear way forward on how to integrate the fix with the
current schema cache queries.

See discussion on
https://github.com/PostgREST/postgrest/pull/4246#pullrequestreview-3093174224.
This commit is contained in:
steve-chavez
2025-08-13 14:54:53 -05:00
committed by Steve Chavez
parent c9272b0088
commit 1dce4a9321
4 changed files with 9 additions and 49 deletions
-1
View File
@@ -18,7 +18,6 @@ This project adheres to [Semantic Versioning](http://semver.org/).
- Fix OpenAPI broken docs link by @taimoorzaeem in #4080
- Fix OpenAPI specification incorrectly exposing GET methods for volatile functions by @joelonsql in #4174
- Fix empty spread embeddings return unexpected SQL error by @taimoorzaeem in #3887
- Fix `Accept: application/geo+json` generating an invalid query when PostGIS is not available by @steve-chavez in #4245
### Changed
+4 -36
View File
@@ -152,7 +152,6 @@ querySchemaCache conf@AppConfig{..} = do
reps <- SQL.statement conf $ dataRepresentations prepared
mHdlers <- SQL.statement conf $ mediaHandlers prepared
tzones <- SQL.statement mempty $ timezones prepared
hasPgis <- SQL.statement conf $ postgisFunc prepared
_ <-
let sleepCall = SQL.Statement "select pg_sleep($1 / 1000.0)" (param HE.int4) HD.noResult prepared in
whenJust configInternalSCSleep (`SQL.statement` sleepCall) -- only used for testing
@@ -165,7 +164,7 @@ querySchemaCache conf@AppConfig{..} = do
, dbRelationships = getOverrideRelationshipsMap rels cRels
, dbRoutines = funcs
, dbRepresentations = reps
, dbMediaHandlers = HM.union mHdlers $ initialMediaHandlers hasPgis -- the custom handlers will override the initial ones
, dbMediaHandlers = HM.union mHdlers initialMediaHandlers -- the custom handlers will override the initial ones
, dbTimezones = tzones
}
where
@@ -1049,14 +1048,12 @@ allViewsKeyDependencies =
having ncol = array_length(array_agg(row(col.attname, view_columns) order by pks_fks.ord), 1)
|]
initialMediaHandlers :: Bool -> MediaHandlerMap
initialMediaHandlers hasPostgisFunc =
initialMediaHandlers :: MediaHandlerMap
initialMediaHandlers =
HM.insert (RelAnyElement, MediaType.MTAny ) (BuiltinOvAggJson, MediaType.MTApplicationJSON) $
HM.insert (RelAnyElement, MediaType.MTApplicationJSON) (BuiltinOvAggJson, MediaType.MTApplicationJSON) $
HM.insert (RelAnyElement, MediaType.MTTextCSV ) (BuiltinOvAggCsv, MediaType.MTTextCSV) $
(if hasPostgisFunc
then HM.insert (RelAnyElement, MediaType.MTGeoJSON ) (BuiltinOvAggGeoJson, MediaType.MTGeoJSON)
else mempty)
HM.insert (RelAnyElement, MediaType.MTGeoJSON ) (BuiltinOvAggGeoJson, MediaType.MTGeoJSON)
HM.empty
mediaHandlers :: Bool -> SQL.Statement AppConfig MediaHandlerMap
@@ -1142,35 +1139,6 @@ timezones = SQL.Statement sql HE.noParams decodeTimezones
decodeTimezones :: HD.Result TimezoneNames
decodeTimezones = S.fromList <$> HD.rowList (column HD.text)
-- Find the postgis function that has the signature:
-- st_asgeojson(record,...) returns text
postgisFunc :: Bool -> SQL.Statement AppConfig Bool
postgisFunc = SQL.Statement sql params decoder
where
params =
(map escapeIdent . toList . configDbSchemas >$< arrayParam HE.text) <>
(map escapeIdent . toList . configDbExtraSearchPath >$< arrayParam HE.text)
decoder = HD.singleRow (column HD.bool)
sql = encodeUtf8 [trimming|
SELECT
exists(
SELECT
1
FROM pg_catalog.pg_proc AS p
JOIN pg_catalog.pg_depend AS d
ON d.objid = p.oid
AND d.deptype = 'e'
JOIN pg_catalog.pg_extension AS e
ON e.oid = d.refobjid
WHERE p.pronamespace = ANY($$1::regnamespace[] || $$2::regnamespace[])
AND p.proname = 'st_asgeojson'
AND e.extname = 'postgis'
AND p.proargtypes[0] = 'record'::regtype
AND pg_get_function_result(p.oid) = 'text'
);
|]
param :: HE.Value a -> HE.Params a
param = HE.param . HE.nonNullable
@@ -3,6 +3,11 @@
- - tag: BuiltinOvAggCsv
- tag: MTTextCSV
- - - tag: RelAnyElement
- tag: MTGeoJSON
- - tag: BuiltinOvAggGeoJson
- tag: MTGeoJSON
- - - tag: RelAnyElement
- tag: MTApplicationJSON
- - tag: BuiltinOvAggJson
-12
View File
@@ -1137,18 +1137,6 @@ def test_no_pool_connection_required_on_bad_embedding(defaultenv):
assert response.status_code == 400
def test_no_pool_connection_required_on_unavailable_postgis(defaultenv):
"no pool connection should be consumed when PostGIS is not available, the request should be quickly rejected at the plan level"
headers = {
"Accept": "application/geo+json",
}
with run(env=defaultenv, no_pool_connection_available=True) as postgrest:
response = postgrest.session.get("/projects", headers=headers)
assert response.status_code == 406
# https://github.com/PostgREST/postgrest/issues/2620
def test_notify_reloading_catalog_cache(defaultenv):
"notify should reload the connection catalog cache"