server: fix dropping column from a table that has update permissions

PR-URL: https://github.com/hasura/graphql-engine-mono/pull/4840
GitOrigin-RevId: cea142fe225315f4f4094f157d8a95df14273306
This commit is contained in:
Rakesh Emmadi 2022-06-27 15:30:54 +05:30 committed by hasura-bot
parent 3c33996e7d
commit 7634be3216
3 changed files with 102 additions and 5 deletions

View File

@ -49,6 +49,7 @@
### Bug fixes and improvements ### Bug fixes and improvements
- server: fix dropping column from a table that has update permissions (fix #8415)
- console: Hide TimescaleDB internal schema from data tab - console: Hide TimescaleDB internal schema from data tab
- console: support naming convention in source customization for postgres DB [CON-297] - console: support naming convention in source customization for postgres DB [CON-297]

View File

@ -489,7 +489,7 @@ buildUpdPermInfo source tn fieldInfoMap (UpdPerm colSpec set fltr check backendO
<<> " is not updatable and so cannot have update permissions defined" <<> " is not updatable and so cannot have update permissions defined"
) )
let updColDeps = map (mkColDep @b DRUntyped source tn) allUpdCols let updColDeps = map (mkColDep @b DRUntyped source tn) updCols
deps = mkParentDep @b source tn : beDeps ++ maybe [] snd checkExpr ++ updColDeps ++ setColDeps deps = mkParentDep @b source tn : beDeps ++ maybe [] snd checkExpr ++ updColDeps ++ setColDeps
depHeaders = getDependentHeaders fltr depHeaders = getDependentHeaders fltr
reqHeaders = depHeaders `HS.union` (HS.fromList setHeaders) reqHeaders = depHeaders `HS.union` (HS.fromList setHeaders)

View File

@ -4,9 +4,13 @@
module Test.RunSQLSpec (spec) where module Test.RunSQLSpec (spec) where
import Harness.Backend.BigQuery qualified as BigQuery import Harness.Backend.BigQuery qualified as BigQuery
import Harness.Backend.Postgres qualified as Postgres
import Harness.Constants qualified as Constants
import Harness.GraphqlEngine qualified as GraphqlEngine import Harness.GraphqlEngine qualified as GraphqlEngine
import Harness.Quoter.Yaml import Harness.Quoter.Yaml
import Harness.Test.Context qualified as Context import Harness.Test.Context qualified as Context
import Harness.Test.Permissions qualified as Permissions
import Harness.Test.Schema
import Harness.TestEnvironment (TestEnvironment) import Harness.TestEnvironment (TestEnvironment)
import Test.Hspec import Test.Hspec
import Prelude import Prelude
@ -14,7 +18,8 @@ import Prelude
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- Preamble -- Preamble
spec :: SpecWith TestEnvironment spec :: SpecWith TestEnvironment
spec = spec = do
-- BigQuery
Context.run Context.run
[ Context.Context [ Context.Context
{ name = Context.Backend Context.BigQuery, { name = Context.Backend Context.BigQuery,
@ -24,13 +29,61 @@ spec =
customOptions = Nothing customOptions = Nothing
} }
] ]
tests bigqueryTests
-- Postgres
Context.run
[ Context.Context
{ name = Context.Backend Context.Postgres,
mkLocalTestEnvironment = Context.noLocalTestEnvironment,
setup = postgresSetup,
teardown = postgresTeardown,
customOptions = Nothing
}
]
postgresTests
--------------------------------------------------------------------------------
-- Setup & Teardown
postgresSetup :: (TestEnvironment, ()) -> IO ()
postgresSetup (env, ()) = do
Postgres.setup [testTable] (env, ())
Postgres.setupPermissions [updatePermission] env
postgresTeardown :: (TestEnvironment, ()) -> IO ()
postgresTeardown (env, ()) = do
Postgres.teardownPermissions [updatePermission] env
Postgres.teardown [testTable] (env, ())
updatePermission :: Permissions.Permission
updatePermission =
Permissions.UpdatePermission
{ Permissions.permissionTable = "test",
Permissions.permissionSource = "postgres",
Permissions.permissionRole = "user",
Permissions.permissionColumns = ["age"]
}
testTable :: Table
testTable =
(table "test")
{ tableColumns =
[ column "id" TInt,
column "name" TStr,
column "age" TInt
],
tablePrimaryKey = ["id"],
tableData =
[ [VInt 1, VStr "Author 1", VInt 25],
[VInt 2, VStr "Author 2", VInt 30]
]
}
-------------------------------------------------------------------------------- --------------------------------------------------------------------------------
-- Tests -- Tests
tests :: Context.Options -> SpecWith TestEnvironment bigqueryTests :: Context.Options -> SpecWith TestEnvironment
tests opts = do bigqueryTests opts = do
it "BigQuery - running invalid SQL" \testEnvironment -> it "BigQuery - running invalid SQL" \testEnvironment ->
shouldReturnYaml shouldReturnYaml
opts opts
@ -61,3 +114,46 @@ path: "$"
error: Bigquery HTTP request failed with status code 400 and status message "Bad Request" error: Bigquery HTTP request failed with status code 400 and status message "Bad Request"
code: bigquery-error code: bigquery-error
|] |]
postgresTests :: Context.Options -> SpecWith TestEnvironment
postgresTests opts = do
-- Testing regression reported at https://github.com/hasura/graphql-engine/issues/8415
it "Drop column which is not referred in update permission" \testEnvironment -> do
let runSQL = "alter table " <> Constants.postgresDb <> ".test drop column name;"
shouldReturnYaml
opts
( GraphqlEngine.postV2Query
200
testEnvironment
[yaml|
type: run_sql
args:
source: postgres
sql: *runSQL
|]
)
[yaml|
result: null
result_type: CommandOk
|]
it "Drop column which is referred in update permission" \testEnvironment -> do
let runSQL = "alter table " <> Constants.postgresDb <> ".test drop column age;"
shouldReturnYaml
opts
( GraphqlEngine.postV2Query
400
testEnvironment
[yaml|
type: run_sql
args:
source: postgres
sql: *runSQL
|]
)
[yaml|
code: dependency-error
error: 'cannot drop due to the following dependent objects : permission hasura.test.user.update
in source "postgres"'
path: "$"
|]