From 1ace298a1a45d1d961612eb1a1f122317c4f30e8 Mon Sep 17 00:00:00 2001 From: steve-chavez Date: Wed, 3 Sep 2025 17:15:22 -0500 Subject: [PATCH] refactor: move schemaCacheDescription to SqlFragment This doesn't belong in the schema cache module, as it's unused there. It's only used on Query.hs. --- src/PostgREST/Query.hs | 19 +++++++++++++------ src/PostgREST/Query/SqlFragment.hs | 7 +++++++ src/PostgREST/SchemaCache.hs | 7 ------- 3 files changed, 20 insertions(+), 13 deletions(-) diff --git a/src/PostgREST/Query.hs b/src/PostgREST/Query.hs index 766b486a7..90c770db2 100644 --- a/src/PostgREST/Query.hs +++ b/src/PostgREST/Query.hs @@ -36,6 +36,7 @@ import qualified Hasql.Transaction.Sessions as SQL import qualified PostgREST.Error as Error import qualified PostgREST.Query.PreQuery as PreQuery import qualified PostgREST.Query.QueryBuilder as QueryBuilder +import qualified PostgREST.Query.SqlFragment as SqlFragment import qualified PostgREST.Query.Statements as Statements import qualified PostgREST.SchemaCache as SchemaCache @@ -205,18 +206,24 @@ actionQuery (MayUseDb plan@InspectPlan{ipSchema=tSchema}) AppConfig{..} _ sCache case configOpenApiMode of OAFollowPriv -> do tableAccess <- SQL.statement [tSchema] (SchemaCache.accessibleTables configDbPreparedStatements) + schDesc <- SQL.statement mempty (SQL.dynamicallyParameterized (SqlFragment.schemaDescription tSchema) decodeSchemaDesc configDbPreparedStatements) + MaybeDbResult plan . Just <$> ((,,) (HM.filterWithKey (\qi _ -> S.member qi tableAccess) $ SchemaCache.dbTables sCache) <$> SQL.statement ([tSchema], configDbHoistedTxSettings) (SchemaCache.accessibleFuncs configDbPreparedStatements) - <*> SQL.statement tSchema (SchemaCache.schemaDescription configDbPreparedStatements)) - OAIgnorePriv -> - (MaybeDbResult plan . Just) . (,,) - (HM.filterWithKey (\(QualifiedIdentifier sch _) _ -> sch == tSchema) $ SchemaCache.dbTables sCache) - (HM.filterWithKey (\(QualifiedIdentifier sch _) _ -> sch == tSchema) $ SchemaCache.dbRoutines sCache) - <$> SQL.statement tSchema (SchemaCache.schemaDescription configDbPreparedStatements) + <*> pure schDesc) + OAIgnorePriv -> do + schDesc <- SQL.statement mempty (SQL.dynamicallyParameterized (SqlFragment.schemaDescription tSchema) decodeSchemaDesc configDbPreparedStatements) + let tbls = HM.filterWithKey (\(QualifiedIdentifier sch _) _ -> sch == tSchema) (SchemaCache.dbTables sCache) + routs = HM.filterWithKey (\(QualifiedIdentifier sch _) _ -> sch == tSchema) (SchemaCache.dbRoutines sCache) + + pure $ MaybeDbResult plan (Just (tbls, routs, schDesc)) OADisabled -> pure $ MaybeDbResult plan Nothing + decodeSchemaDesc :: HD.Result (Maybe Text) + decodeSchemaDesc = join <$> HD.rowMaybe (nullableColumn HD.text) + -- Makes sure the querystring pk matches the payload pk -- e.g. PUT /items?id=eq.1 { "id" : 1, .. } is accepted, -- PUT /items?id=eq.14 { "id" : 2, .. } is rejected. diff --git a/src/PostgREST/Query/SqlFragment.hs b/src/PostgREST/Query/SqlFragment.hs index 6141be430..b8a6613d2 100644 --- a/src/PostgREST/Query/SqlFragment.hs +++ b/src/PostgREST/Query/SqlFragment.hs @@ -40,6 +40,7 @@ module PostgREST.Query.SqlFragment , setConfigWithConstantNameJSON , escapeIdent , escapeIdentList + , schemaDescription ) where import qualified Data.Aeson as JSON @@ -590,3 +591,9 @@ handlerF rout = \case BuiltinOvAggCsv -> asCsvF CustomFunc funcQi target -> customFuncF rout funcQi target NoAgg -> "''::text" + +schemaDescription :: Text -> SQL.Snippet +schemaDescription schema = + "SELECT pg_catalog.obj_description(" <> encoded <> "::regnamespace, 'pg_namespace')" + where + encoded = SQL.encoderAndParam (HE.nonNullable HE.unknown) $ encodeUtf8 schema diff --git a/src/PostgREST/SchemaCache.hs b/src/PostgREST/SchemaCache.hs index df21aede2..59d4bb480 100644 --- a/src/PostgREST/SchemaCache.hs +++ b/src/PostgREST/SchemaCache.hs @@ -23,7 +23,6 @@ module PostgREST.SchemaCache , querySchemaCache , accessibleTables , accessibleFuncs - , schemaDescription , showSummary ) where @@ -475,12 +474,6 @@ funcsSqlQuery = encodeUtf8 [trimming| AND prokind = 'f' AND p.pronamespace = ANY($$1::regnamespace[]) |] -schemaDescription :: Bool -> SQL.Statement Schema (Maybe Text) -schemaDescription = - SQL.Statement sql (param HE.text) (join <$> HD.rowMaybe (nullableColumn HD.text)) - where - sql = "SELECT pg_catalog.obj_description($1::regnamespace, 'pg_namespace')" - accessibleTables :: Bool -> SQL.Statement [Schema] AccessSet accessibleTables = SQL.Statement sql params decodeAccessibleIdentifiers