From 9fd21ccd7a37334f9f29f2a6437274777219bb63 Mon Sep 17 00:00:00 2001 From: Karthikeyan Chinnakonda Date: Sat, 6 Jun 2020 00:28:06 +0530 Subject: [PATCH 1/9] fix bug when renaming a col which has a dependent remote relationship --- .../Hasura/RQL/DDL/RemoteRelationship.hs | 11 ++++ .../src-lib/Hasura/RQL/DDL/Schema/Rename.hs | 60 ++++++++++++++++++- 2 files changed, 68 insertions(+), 3 deletions(-) diff --git a/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs b/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs index 5e3dcdbfc7135..fa5754248577f 100644 --- a/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs +++ b/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs @@ -6,6 +6,7 @@ module Hasura.RQL.DDL.RemoteRelationship , persistRemoteRelationship , resolveRemoteRelationship , delRemoteRelFromCatalog + , getRemoteRelDefFromCatalog ) where import Hasura.EncJSON @@ -115,3 +116,13 @@ delRemoteRelFromCatalog (QualifiedObject sn tn) (RemoteRelationshipName relName) AND table_name = $2 AND remote_relationship_name = $3 |] (sn, tn, relName) True + +getRemoteRelDefFromCatalog :: RemoteRelationshipName -> Q.TxE QErr RemoteRelationshipDef +getRemoteRelDefFromCatalog relName = do + (Q.AltJ defn) <- (runIdentity . Q.getRow) <$> Q.withQE defaultTxErrorHandler + [Q.sql| + SELECT definition::json + FROM hdb_catalog.hdb_remote_relationship + WHERE remote_relationship_name = $1 + |] (Identity relName) False + return defn diff --git a/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs b/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs index ba6baced9a3da..c94f3a4ee84eb 100644 --- a/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs +++ b/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs @@ -1,3 +1,5 @@ +{-# LANGUAGE ViewPatterns #-} + -- | Functions for mutating the catalog (with integrity checking) to incorporate schema changes -- discovered after applying a user-supplied SQL query. None of these functions modify the schema -- cache, so it must be reloaded after the catalog is updated. @@ -20,10 +22,13 @@ import Hasura.Session import Hasura.SQL.Types import qualified Hasura.RQL.DDL.EventTrigger as DS +import qualified Hasura.RQL.DDL.RemoteRelationship as RR import qualified Data.HashMap.Strict as M import qualified Database.PG.Query as Q - +import qualified Data.Set as Set +import qualified Data.List.NonEmpty as NE +import qualified Language.GraphQL.Draft.Syntax as G import Data.Aeson data RenameItem a @@ -97,6 +102,8 @@ renameColInCatalog oCol nCol qt fieldInfo = do updateColInRel refQT rn $ RenameItem qt oCol nCol SOTableObj _ (TOTrigger triggerName) -> updateColInEventTriggerDef triggerName $ RenameItem qt oCol nCol + SOTableObj _ (TORemoteRel remoteRelName) -> + updateColInRemoteRelationship remoteRelName $ RenameItem qt oCol nCol d -> otherDeps errMsg d -- Update custom column names possiblyUpdateCustomColumnNames qt oCol nCol @@ -135,7 +142,6 @@ renameRelInCatalog qt oldRN newRN = do AND rel_name = $4 |] (newRN, sn, tn, oldRN) True - -- update table names in relationship definition updateRelDefs :: (MonadTx m, CacheRM m) @@ -147,7 +153,6 @@ updateRelDefs qt rn renameTable = do ObjRel -> updateObjRelDef qt rn renameTable ArrRel -> updateArrRelDef qt rn renameTable - updateObjRelDef :: (MonadTx m) => QualifiedTable -> RelName -> RenameTable -> m () @@ -348,6 +353,55 @@ updateColInRel fromQT rn rnCol = do updateColInArrRel fromQT toQT rnCol <$> decodeValue oldDefV liftTx $ updateRel fromQT rn newDefV +-- please refactor this function before submitting it for review +updateColInRemoteRelationship + :: (MonadTx m) + => RemoteRelationshipName -> RenameCol -> m () +updateColInRemoteRelationship remoteRelationshipName renameCol = do + let (RenameItem _ oldCol newCol) = renameCol + (RemoteRelationshipDef remoteSchemaName hasuraFlds remoteFields) <- + liftTx $ RR.getRemoteRelDefFromCatalog remoteRelationshipName + let oldColFieldName = FieldName $ getPGColTxt oldCol + let newColFieldName = FieldName $ getPGColTxt newCol + let modifiedHasuraFlds = Set.insert newColFieldName $ Set.delete oldColFieldName hasuraFlds + let fieldCalls = unRemoteFields remoteFields + let oldColName = G.Name $ getPGColTxt oldCol + let newColName = G.Name $ getPGColTxt newCol + let !bc = NE.map (\(FieldCall name args) -> + let remoteArgs = getRemoteArguments args + in FieldCall name $ RemoteArguments $ + map (\(G.ObjectFieldG key val) -> + G.ObjectFieldG key $ replaceVariableName oldColName newColName val + ) $ remoteArgs + ) $ fieldCalls + liftTx $ updateRemoteRelDefnInCatalog (RemoteRelationshipDef remoteSchemaName modifiedHasuraFlds (RemoteFields bc)) + where + -- definitely should use runUpdateRemoteRelationship + updateRemoteRelDefnInCatalog newDefn = + Q.unitQE defaultTxErrorHandler [Q.sql| + UPDATE hdb_catalog.hdb_remote_relationship + SET definition = $2::jsonb + WHERE remote_relationship_name = $1 + |] (remoteRelationshipName,Q.AltJ newDefn) True + + replaceVariableName :: G.Name -> G.Name -> G.Value -> G.Value + replaceVariableName oldColName newColName = \case + G.VVariable (G.Variable oldColName') -> + G.VVariable $ + if oldColName == oldColName' + then (G.Variable newColName) + else (G.Variable oldColName') + G.VList (G.unListValue -> values) -> G.VList $ G.ListValueG $ map (replaceVariableName oldColName newColName) values + G.VObject (G.unObjectValue -> values) -> + G.VObject $ G.ObjectValueG $ + map (\(G.ObjectFieldG key val) -> G.ObjectFieldG key $ replaceVariableName oldColName newColName val) values + G.VInt i -> G.VInt i + G.VFloat f -> G.VFloat f + G.VBoolean b -> G.VBoolean b + G.VNull -> G.VNull + G.VString s -> G.VString s + G.VEnum e -> G.VEnum e + -- rename columns in relationship definitions updateColInEventTriggerDef :: (MonadTx m) From 4f12099615eec59adf0932e3deaf05ecd94c50ef Mon Sep 17 00:00:00 2001 From: Karthikeyan Chinnakonda Date: Sun, 7 Jun 2020 16:28:19 +0530 Subject: [PATCH 2/9] refactor the updateColInRemoteRelationship function --- server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs | 2 +- .../src-lib/Hasura/RQL/DDL/Schema/Rename.hs | 42 ++++++++----------- server/src-lib/Hasura/RQL/DDL/Schema/Table.hs | 2 +- 3 files changed, 20 insertions(+), 26 deletions(-) diff --git a/server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs b/server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs index 43f43876a5ec1..8229479107f57 100644 --- a/server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs +++ b/server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs @@ -543,7 +543,7 @@ withMetadataCheck cascade action = do where reportFuncs = T.intercalate ", " . map dquoteTxt - processSchemaChanges :: (MonadTx m, CacheRM m) => SchemaDiff -> m () + processSchemaChanges :: (MonadTx m, CacheRWM m) => SchemaDiff -> m () processSchemaChanges schemaDiff = do -- Purge the dropped tables mapM_ delTableAndDirectDeps droppedTables diff --git a/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs b/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs index c94f3a4ee84eb..0929e3d60459a 100644 --- a/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs +++ b/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs @@ -85,7 +85,7 @@ renameTableInCatalog newQT oldQT = do |] (nsn, ntn, osn, otn) False renameColInCatalog - :: (MonadTx m, CacheRM m) + :: (MonadTx m, CacheRWM m) => PGCol -> PGCol -> QualifiedTable -> FieldInfoMap FieldInfo -> m () renameColInCatalog oCol nCol qt fieldInfo = do sc <- askSchemaCache @@ -353,37 +353,31 @@ updateColInRel fromQT rn rnCol = do updateColInArrRel fromQT toQT rnCol <$> decodeValue oldDefV liftTx $ updateRel fromQT rn newDefV --- please refactor this function before submitting it for review updateColInRemoteRelationship - :: (MonadTx m) + :: (MonadTx m, CacheRWM m) => RemoteRelationshipName -> RenameCol -> m () updateColInRemoteRelationship remoteRelationshipName renameCol = do - let (RenameItem _ oldCol newCol) = renameCol + let (RenameItem qt oldCol newCol) = renameCol (RemoteRelationshipDef remoteSchemaName hasuraFlds remoteFields) <- liftTx $ RR.getRemoteRelDefFromCatalog remoteRelationshipName - let oldColFieldName = FieldName $ getPGColTxt oldCol - let newColFieldName = FieldName $ getPGColTxt newCol + let oldColPGTxt = getPGColTxt oldCol + let newColPGTxt = getPGColTxt newCol + let oldColFieldName = FieldName $ oldColPGTxt + let newColFieldName = FieldName $ newColPGTxt let modifiedHasuraFlds = Set.insert newColFieldName $ Set.delete oldColFieldName hasuraFlds let fieldCalls = unRemoteFields remoteFields - let oldColName = G.Name $ getPGColTxt oldCol - let newColName = G.Name $ getPGColTxt newCol - let !bc = NE.map (\(FieldCall name args) -> - let remoteArgs = getRemoteArguments args - in FieldCall name $ RemoteArguments $ - map (\(G.ObjectFieldG key val) -> - G.ObjectFieldG key $ replaceVariableName oldColName newColName val - ) $ remoteArgs - ) $ fieldCalls - liftTx $ updateRemoteRelDefnInCatalog (RemoteRelationshipDef remoteSchemaName modifiedHasuraFlds (RemoteFields bc)) + let oldColName = G.Name $ oldColPGTxt + let newColName = G.Name $ newColPGTxt + let modifiedFieldCalls = NE.map (\(FieldCall name args) -> + let remoteArgs = getRemoteArguments args + in FieldCall name $ RemoteArguments $ + map (\(G.ObjectFieldG key val) -> + G.ObjectFieldG key $ replaceVariableName oldColName newColName val + ) $ remoteArgs + ) $ fieldCalls + RR.runUpdateRemoteRelationship (RemoteRelationship remoteRelationshipName qt modifiedHasuraFlds remoteSchemaName (RemoteFields modifiedFieldCalls)) + pure () where - -- definitely should use runUpdateRemoteRelationship - updateRemoteRelDefnInCatalog newDefn = - Q.unitQE defaultTxErrorHandler [Q.sql| - UPDATE hdb_catalog.hdb_remote_relationship - SET definition = $2::jsonb - WHERE remote_relationship_name = $1 - |] (remoteRelationshipName,Q.AltJ newDefn) True - replaceVariableName :: G.Name -> G.Name -> G.Value -> G.Value replaceVariableName oldColName newColName = \case G.VVariable (G.Variable oldColName') -> diff --git a/server/src-lib/Hasura/RQL/DDL/Schema/Table.hs b/server/src-lib/Hasura/RQL/DDL/Schema/Table.hs index 437e1ea62f6fa..5a0c8ea54faa3 100644 --- a/server/src-lib/Hasura/RQL/DDL/Schema/Table.hs +++ b/server/src-lib/Hasura/RQL/DDL/Schema/Table.hs @@ -200,7 +200,7 @@ runUntrackTableQ q = do unTrackExistingTableOrViewP1 q unTrackExistingTableOrViewP2 q -processTableChanges :: (MonadTx m, CacheRM m) => TableCoreInfo -> TableDiff -> m () +processTableChanges :: (MonadTx m, CacheRWM m) => TableCoreInfo -> TableDiff -> m () processTableChanges ti tableDiff = do -- If table rename occurs then don't replace constraints and -- process dropped/added columns, because schema reload happens eventually From e9e2bc64e1ee23c9cd7936b2f696bd776745514c Mon Sep 17 00:00:00 2001 From: Karthikeyan Chinnakonda Date: Mon, 8 Jun 2020 11:43:28 +0530 Subject: [PATCH 3/9] add a test to check renaming column behaviour with remote relationship --- ...rename_col_with_remote_rel_dependency.yaml | 35 +++++++++++++++++++ server/tests-py/test_remote_relationships.py | 4 +++ 2 files changed, 39 insertions(+) create mode 100644 server/tests-py/queries/remote_schemas/remote_relationships/rename_col_with_remote_rel_dependency.yaml diff --git a/server/tests-py/queries/remote_schemas/remote_relationships/rename_col_with_remote_rel_dependency.yaml b/server/tests-py/queries/remote_schemas/remote_relationships/rename_col_with_remote_rel_dependency.yaml new file mode 100644 index 0000000000000..6b7bcb292ad3a --- /dev/null +++ b/server/tests-py/queries/remote_schemas/remote_relationships/rename_col_with_remote_rel_dependency.yaml @@ -0,0 +1,35 @@ +- description: Rename the column of a table which is used in creating the remote relationship + url: /v1/query + status: 200 + query: + type: run_sql + args: + sql: ALTER TABLE profiles rename column id to profile_id + +- description: Check if the remote relationship works after renaming the column + url: /v1/graphql + status: 200 + response: + data: + profiles: + - profile_id: 1 + messagesNestedArgs: + - id: 1 + msg: You win! + - profile_id: 2 + messagesNestedArgs: [] + - profile_id: 3 + messagesNestedArgs: + - id: 3 + msg: Another alice + query: + query: | + query { + profiles { + profile_id + messagesNestedArgs(where: { name: { eq: "alice" } }) { + id + msg + } + } + } diff --git a/server/tests-py/test_remote_relationships.py b/server/tests-py/test_remote_relationships.py index 86a79f7679bf4..5927aa2430d1e 100644 --- a/server/tests-py/test_remote_relationships.py +++ b/server/tests-py/test_remote_relationships.py @@ -222,6 +222,10 @@ def test_with_scalar_relationship(self, hge_ctx): assert st_code == 200, resp check_query_f(hge_ctx, self.dir() + 'query_with_scalar_rel.yaml') + def test_renaming_column_with_remote_relationship_dependency(self, hge_ctx): + st_code, resp = hge_ctx.v1q_f(self.dir() + 'setup_remote_rel_nested_args.yaml') + assert st_code == 200, resp + check_query_f(hge_ctx, self.dir() + 'rename_col_with_remote_rel_dependency.yaml') class TestDeepExecution: From 26f9b6d53aad9cbfc876b6140fccc8fca60af63e Mon Sep 17 00:00:00 2001 From: Karthikeyan Chinnakonda Date: Mon, 8 Jun 2020 11:46:52 +0530 Subject: [PATCH 4/9] add changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 24fbd3b946d6a..2f3e5b6419699 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,6 +69,7 @@ Read more about the session argument for computed fields in the [docs](https://h - server: fix importing of allow list query from metadata (fix #4687) - server: flush log buffer during shutdown (#4800) - server: fix edge case with printing logs on startup failure (fix #4772) +- server: fix bug which arised when renaming a column if it was used to create the remote relationship (fix #4995) - console: allow entering big int values in the console (close #3667) (#4775) - console: avoid count queries for large tables (#4692) - console: add read replica support section to pro popup (#4118) From c060aa08e4c306b672828b9ba210f36949b0d9f3 Mon Sep 17 00:00:00 2001 From: Karthikeyan Chinnakonda Date: Mon, 8 Jun 2020 12:30:00 +0530 Subject: [PATCH 5/9] remote changelog --- CHANGELOG.md | 1 - 1 file changed, 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index fbeda0a680f50..7cbb942640434 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -69,7 +69,6 @@ Read more about the session argument for computed fields in the [docs](https://h - server: fix importing of allow list query from metadata (fix #4687) - server: flush log buffer during shutdown (#4800) - server: fix edge case with printing logs on startup failure (fix #4772) -- server: fix bug which arised when renaming a column if it was used to create the remote relationship (fix #4995) - console: allow entering big int values in the console (close #3667) (#4775) - console: add support for subscriptions analyze in API explorer (close #2541) (#2541) - console: avoid count queries for large tables (#4692) From 6e55e2c67890501fe3945554a3e58efcbaf96d46 Mon Sep 17 00:00:00 2001 From: Karthikeyan Chinnakonda Date: Mon, 8 Jun 2020 13:53:55 +0530 Subject: [PATCH 6/9] add a test to check remote relationship behaviour when table is renamed --- .../Hasura/RQL/DDL/RemoteRelationship.hs | 8 ++--- .../src-lib/Hasura/RQL/DDL/Schema/Rename.hs | 10 ++++-- ...name_table_with_remote_rel_dependency.yaml | 35 +++++++++++++++++++ .../remote_relationships/teardown.yaml | 8 ++++- server/tests-py/test_remote_relationships.py | 6 ++++ 5 files changed, 59 insertions(+), 8 deletions(-) create mode 100644 server/tests-py/queries/remote_schemas/remote_relationships/rename_table_with_remote_rel_dependency.yaml diff --git a/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs b/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs index fa5754248577f..11dfed564d238 100644 --- a/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs +++ b/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs @@ -117,12 +117,12 @@ delRemoteRelFromCatalog (QualifiedObject sn tn) (RemoteRelationshipName relName) AND remote_relationship_name = $3 |] (sn, tn, relName) True -getRemoteRelDefFromCatalog :: RemoteRelationshipName -> Q.TxE QErr RemoteRelationshipDef -getRemoteRelDefFromCatalog relName = do +getRemoteRelDefFromCatalog :: RemoteRelationshipName -> QualifiedTable -> Q.TxE QErr RemoteRelationshipDef +getRemoteRelDefFromCatalog relName (QualifiedObject schemaName tableName) = do (Q.AltJ defn) <- (runIdentity . Q.getRow) <$> Q.withQE defaultTxErrorHandler [Q.sql| SELECT definition::json FROM hdb_catalog.hdb_remote_relationship - WHERE remote_relationship_name = $1 - |] (Identity relName) False + WHERE remote_relationship_name = $1 and table_schema = $2 and table_name = $3 + |] (relName,schemaName,tableName) False return defn diff --git a/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs b/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs index 0929e3d60459a..2fb6a7390aecf 100644 --- a/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs +++ b/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs @@ -62,6 +62,9 @@ renameTableInCatalog renameTableInCatalog newQT oldQT = do sc <- askSchemaCache let allDeps = getDependentObjs sc $ SOTable oldQT + -- Update table name in hdb_catalog + liftTx $ Q.catchE defaultTxErrorHandler updateTableInCatalog + -- update all dependant schema objects forM_ allDeps $ \case SOTableObj refQT (TORel rn) -> @@ -70,9 +73,10 @@ renameTableInCatalog newQT oldQT = do updatePermFlds refQT rn pt $ RTable (oldQT, newQT) -- A trigger's definition is not dependent on the table directly SOTableObj _ (TOTrigger _) -> return () + -- A remote relationship's definition is not dependent on the table directly + SOTableObj _ (TORemoteRel _) -> return () + d -> otherDeps errMsg d - -- -- Update table name in hdb_catalog - liftTx $ Q.catchE defaultTxErrorHandler updateTableInCatalog where QualifiedObject nsn ntn = newQT QualifiedObject osn otn = oldQT @@ -359,7 +363,7 @@ updateColInRemoteRelationship updateColInRemoteRelationship remoteRelationshipName renameCol = do let (RenameItem qt oldCol newCol) = renameCol (RemoteRelationshipDef remoteSchemaName hasuraFlds remoteFields) <- - liftTx $ RR.getRemoteRelDefFromCatalog remoteRelationshipName + liftTx $ RR.getRemoteRelDefFromCatalog remoteRelationshipName qt let oldColPGTxt = getPGColTxt oldCol let newColPGTxt = getPGColTxt newCol let oldColFieldName = FieldName $ oldColPGTxt diff --git a/server/tests-py/queries/remote_schemas/remote_relationships/rename_table_with_remote_rel_dependency.yaml b/server/tests-py/queries/remote_schemas/remote_relationships/rename_table_with_remote_rel_dependency.yaml new file mode 100644 index 0000000000000..c4efdf4d698b8 --- /dev/null +++ b/server/tests-py/queries/remote_schemas/remote_relationships/rename_table_with_remote_rel_dependency.yaml @@ -0,0 +1,35 @@ +- description: Rename the table which is used in creating the remote relationship + url: /v1/query + status: 200 + query: + type: run_sql + args: + sql: ALTER TABLE profiles rename to user_profiles + +- description: Check if the remote relationship works after renaming the table + url: /v1/graphql + status: 200 + response: + data: + user_profiles: + - id: 1 + messagesNestedArgs: + - id: 1 + msg: You win! + - id: 2 + messagesNestedArgs: [] + - id: 3 + messagesNestedArgs: + - id: 3 + msg: Another alice + query: + query: | + query { + user_profiles { + id + messagesNestedArgs(where: { name: { eq: "alice" } }) { + id + msg + } + } + } diff --git a/server/tests-py/queries/remote_schemas/remote_relationships/teardown.yaml b/server/tests-py/queries/remote_schemas/remote_relationships/teardown.yaml index 02fbc057251c6..5f8b73db58862 100644 --- a/server/tests-py/queries/remote_schemas/remote_relationships/teardown.yaml +++ b/server/tests-py/queries/remote_schemas/remote_relationships/teardown.yaml @@ -3,7 +3,13 @@ args: - type: run_sql args: sql: | - drop table profiles + drop table if exists profiles + +- type: run_sql + args: + sql: | + drop table if exists user_profiles + # also drops remote relationship as direct dep - type: remove_remote_schema args: diff --git a/server/tests-py/test_remote_relationships.py b/server/tests-py/test_remote_relationships.py index d72457552472d..04bdb46027039 100644 --- a/server/tests-py/test_remote_relationships.py +++ b/server/tests-py/test_remote_relationships.py @@ -211,6 +211,12 @@ def test_renaming_column_with_remote_relationship_dependency(self, hge_ctx): assert st_code == 200, resp check_query_f(hge_ctx, self.dir() + 'rename_col_with_remote_rel_dependency.yaml') + def test_renaming_table_with_remote_relationship_dependency(self, hge_ctx): + st_code, resp = hge_ctx.v1q_f(self.dir() + 'setup_remote_rel_nested_args.yaml') + assert st_code == 200, resp + check_query_f(hge_ctx, self.dir() + 'rename_table_with_remote_rel_dependency.yaml') + + class TestDeepExecution: @classmethod From 73beccac13f89ef146fb52d39f015b35a8913b39 Mon Sep 17 00:00:00 2001 From: Karthikeyan Chinnakonda Date: Mon, 8 Jun 2020 14:00:42 +0530 Subject: [PATCH 7/9] don't use CacheRWM context in the processSchemaChanges action --- .../Hasura/RQL/DDL/RemoteRelationship.hs | 1 + server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs | 2 +- .../src-lib/Hasura/RQL/DDL/Schema/Rename.hs | 23 +++++++++---------- server/src-lib/Hasura/RQL/DDL/Schema/Table.hs | 2 +- 4 files changed, 14 insertions(+), 14 deletions(-) diff --git a/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs b/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs index 11dfed564d238..3b62a2a4efc8a 100644 --- a/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs +++ b/server/src-lib/Hasura/RQL/DDL/RemoteRelationship.hs @@ -3,6 +3,7 @@ module Hasura.RQL.DDL.RemoteRelationship ( runCreateRemoteRelationship , runDeleteRemoteRelationship , runUpdateRemoteRelationship + , updateRemoteRelInCatalog , persistRemoteRelationship , resolveRemoteRelationship , delRemoteRelFromCatalog diff --git a/server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs b/server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs index 8229479107f57..43f43876a5ec1 100644 --- a/server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs +++ b/server/src-lib/Hasura/RQL/DDL/Schema/Cache.hs @@ -543,7 +543,7 @@ withMetadataCheck cascade action = do where reportFuncs = T.intercalate ", " . map dquoteTxt - processSchemaChanges :: (MonadTx m, CacheRWM m) => SchemaDiff -> m () + processSchemaChanges :: (MonadTx m, CacheRM m) => SchemaDiff -> m () processSchemaChanges schemaDiff = do -- Purge the dropped tables mapM_ delTableAndDirectDeps droppedTables diff --git a/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs b/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs index 2fb6a7390aecf..f8b79074cb8c0 100644 --- a/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs +++ b/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs @@ -89,7 +89,7 @@ renameTableInCatalog newQT oldQT = do |] (nsn, ntn, osn, otn) False renameColInCatalog - :: (MonadTx m, CacheRWM m) + :: (MonadTx m, CacheRM m) => PGCol -> PGCol -> QualifiedTable -> FieldInfoMap FieldInfo -> m () renameColInCatalog oCol nCol qt fieldInfo = do sc <- askSchemaCache @@ -358,29 +358,28 @@ updateColInRel fromQT rn rnCol = do liftTx $ updateRel fromQT rn newDefV updateColInRemoteRelationship - :: (MonadTx m, CacheRWM m) + :: (MonadTx m) => RemoteRelationshipName -> RenameCol -> m () updateColInRemoteRelationship remoteRelationshipName renameCol = do let (RenameItem qt oldCol newCol) = renameCol (RemoteRelationshipDef remoteSchemaName hasuraFlds remoteFields) <- liftTx $ RR.getRemoteRelDefFromCatalog remoteRelationshipName qt let oldColPGTxt = getPGColTxt oldCol - let newColPGTxt = getPGColTxt newCol - let oldColFieldName = FieldName $ oldColPGTxt - let newColFieldName = FieldName $ newColPGTxt - let modifiedHasuraFlds = Set.insert newColFieldName $ Set.delete oldColFieldName hasuraFlds - let fieldCalls = unRemoteFields remoteFields - let oldColName = G.Name $ oldColPGTxt - let newColName = G.Name $ newColPGTxt - let modifiedFieldCalls = NE.map (\(FieldCall name args) -> + newColPGTxt = getPGColTxt newCol + oldColFieldName = FieldName $ oldColPGTxt + newColFieldName = FieldName $ newColPGTxt + modifiedHasuraFlds = Set.insert newColFieldName $ Set.delete oldColFieldName hasuraFlds + fieldCalls = unRemoteFields remoteFields + oldColName = G.Name $ oldColPGTxt + newColName = G.Name $ newColPGTxt + modifiedFieldCalls = NE.map (\(FieldCall name args) -> let remoteArgs = getRemoteArguments args in FieldCall name $ RemoteArguments $ map (\(G.ObjectFieldG key val) -> G.ObjectFieldG key $ replaceVariableName oldColName newColName val ) $ remoteArgs ) $ fieldCalls - RR.runUpdateRemoteRelationship (RemoteRelationship remoteRelationshipName qt modifiedHasuraFlds remoteSchemaName (RemoteFields modifiedFieldCalls)) - pure () + liftTx $ RR.updateRemoteRelInCatalog (RemoteRelationship remoteRelationshipName qt modifiedHasuraFlds remoteSchemaName (RemoteFields modifiedFieldCalls)) where replaceVariableName :: G.Name -> G.Name -> G.Value -> G.Value replaceVariableName oldColName newColName = \case diff --git a/server/src-lib/Hasura/RQL/DDL/Schema/Table.hs b/server/src-lib/Hasura/RQL/DDL/Schema/Table.hs index 5a0c8ea54faa3..437e1ea62f6fa 100644 --- a/server/src-lib/Hasura/RQL/DDL/Schema/Table.hs +++ b/server/src-lib/Hasura/RQL/DDL/Schema/Table.hs @@ -200,7 +200,7 @@ runUntrackTableQ q = do unTrackExistingTableOrViewP1 q unTrackExistingTableOrViewP2 q -processTableChanges :: (MonadTx m, CacheRWM m) => TableCoreInfo -> TableDiff -> m () +processTableChanges :: (MonadTx m, CacheRM m) => TableCoreInfo -> TableDiff -> m () processTableChanges ti tableDiff = do -- If table rename occurs then don't replace constraints and -- process dropped/added columns, because schema reload happens eventually From 07baad4bc91859fa3a49b2ecd48f8180ea13c55b Mon Sep 17 00:00:00 2001 From: Karthikeyan Chinnakonda Date: Mon, 8 Jun 2020 14:50:55 +0530 Subject: [PATCH 8/9] undo the change made in the previous commit --- server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs b/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs index f8b79074cb8c0..0c510a34ed6b0 100644 --- a/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs +++ b/server/src-lib/Hasura/RQL/DDL/Schema/Rename.hs @@ -62,8 +62,6 @@ renameTableInCatalog renameTableInCatalog newQT oldQT = do sc <- askSchemaCache let allDeps = getDependentObjs sc $ SOTable oldQT - -- Update table name in hdb_catalog - liftTx $ Q.catchE defaultTxErrorHandler updateTableInCatalog -- update all dependant schema objects forM_ allDeps $ \case @@ -77,6 +75,9 @@ renameTableInCatalog newQT oldQT = do SOTableObj _ (TORemoteRel _) -> return () d -> otherDeps errMsg d + -- Update table name in hdb_catalog + liftTx $ Q.catchE defaultTxErrorHandler updateTableInCatalog + where QualifiedObject nsn ntn = newQT QualifiedObject osn otn = oldQT From 16705a87f57d13f5e050ddaa69d58346da7eed11 Mon Sep 17 00:00:00 2001 From: Aleksandra Sikora Date: Mon, 8 Jun 2020 13:12:45 +0200 Subject: [PATCH 9/9] replace remote schema url in tests --- console/cypress/helpers/remoteSchemaHelpers.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/console/cypress/helpers/remoteSchemaHelpers.ts b/console/cypress/helpers/remoteSchemaHelpers.ts index 804f0a3e3851d..df8981b7af7c6 100644 --- a/console/cypress/helpers/remoteSchemaHelpers.ts +++ b/console/cypress/helpers/remoteSchemaHelpers.ts @@ -6,7 +6,7 @@ export const getRemoteSchemaName = (i: number, schemaName: string) => `test-remote-schema-${schemaName}-${i}`; export const getRemoteGraphQLURL = () => - 'https://hasura-sample-remote-schema.glitch.me/'; + 'https://hasura-console-test.herokuapp.com/v1/graphql/'; export const getRemoteGraphQLURLFromEnv = () => 'GRAPHQL_URL';