这是indexloc提供的服务,不要输入任何密码
Skip to content
41 changes: 23 additions & 18 deletions server/src-lib/Hasura/RQL/DDL/Schema.hs
Original file line number Diff line number Diff line change
Expand Up @@ -32,6 +32,7 @@ module Hasura.RQL.DDL.Schema

, RunSQL(..)
, runRunSQL
, isSchemaCacheBuildRequiredRunSQL
) where

import Hasura.Prelude
Expand Down Expand Up @@ -86,15 +87,30 @@ instance ToJSON RunSQL where
Q.ReadWrite -> False
]

-- | see Note [Checking metadata consistency in run_sql]
isSchemaCacheBuildRequiredRunSQL :: RunSQL -> Bool
isSchemaCacheBuildRequiredRunSQL RunSQL {..} =
case rTxAccessMode of
Q.ReadOnly -> False
Q.ReadWrite -> fromMaybe (containsDDLKeyword rSql) rCheckMetadataConsistency
where
containsDDLKeyword :: Text -> Bool
containsDDLKeyword = TDFA.match $$(quoteRegex
TDFA.defaultCompOpt
{ TDFA.caseSensitive = False
, TDFA.multiline = True
, TDFA.lastStarGreedy = True }
TDFA.defaultExecOpt
{ TDFA.captureGroups = False }
"\\balter\\b|\\bdrop\\b|\\breplace\\b|\\bcreate function\\b|\\bcomment on\\b")

runRunSQL :: (MonadTx m, CacheRWM m, HasSQLGenCtx m) => RunSQL -> m EncJSON
runRunSQL RunSQL {..} = do
runRunSQL q@RunSQL {..}
-- see Note [Checking metadata consistency in run_sql]
let metadataCheckNeeded = case rTxAccessMode of
Q.ReadOnly -> False
Q.ReadWrite -> fromMaybe (containsDDLKeyword rSql) rCheckMetadataConsistency
if metadataCheckNeeded
then withMetadataCheck rCascade $ execRawSQL rSql
else execRawSQL rSql
| isSchemaCacheBuildRequiredRunSQL q
= withMetadataCheck rCascade $ execRawSQL rSql
| otherwise
= execRawSQL rSql
where
execRawSQL :: (MonadTx m) => Text -> m EncJSON
execRawSQL =
Expand All @@ -103,17 +119,6 @@ runRunSQL RunSQL {..} = do
rawSqlErrHandler txe =
(err400 PostgresError "query execution failed") { qeInternal = Just $ toJSON txe }

-- see Note [Checking metadata consistency in run_sql]
containsDDLKeyword :: Text -> Bool
containsDDLKeyword = TDFA.match $$(quoteRegex
TDFA.defaultCompOpt
{ TDFA.caseSensitive = False
, TDFA.multiline = True
, TDFA.lastStarGreedy = True }
TDFA.defaultExecOpt
{ TDFA.captureGroups = False }
"\\balter\\b|\\bdrop\\b|\\breplace\\b|\\bcreate function\\b|\\bcomment on\\b")

{- Note [Checking metadata consistency in run_sql]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL queries executed by run_sql may change the Postgres schema in arbitrary
Expand Down
6 changes: 1 addition & 5 deletions server/src-lib/Hasura/Server/Query.hs
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
{-# LANGUAGE NamedFieldPuns #-}

module Hasura.Server.Query where

import Control.Lens
Expand Down Expand Up @@ -259,10 +258,7 @@ queryModifiesSchemaCache (RQV1 qi) = case qi of
RQAddCollectionToAllowlist _ -> True
RQDropCollectionFromAllowlist _ -> True

RQRunSql RunSQL{rTxAccessMode, rCheckMetadataConsistency} ->
case rTxAccessMode of
Q.ReadOnly -> False
Q.ReadWrite -> fromMaybe True rCheckMetadataConsistency
RQRunSql q -> isSchemaCacheBuildRequiredRunSQL q

RQReplaceMetadata _ -> True
RQExportMetadata _ -> False
Expand Down