From 2ef36a59a6d144b76115a460cbfbca82915e0115 Mon Sep 17 00:00:00 2001 From: Zhenghua Lyu Date: Tue, 14 May 2019 11:15:40 +0800 Subject: [PATCH] Add deserialization method for lockingclause `create rule <...> do instead select * from t for update` will dispatch a query with lockingclause node. Add deserialization method for it to make things correct. --- src/backend/nodes/readfast.c | 15 +++++++++++++++ src/test/regress/expected/rules.out | 4 ++++ src/test/regress/sql/rules.sql | 5 +++++ 3 files changed, 24 insertions(+) diff --git a/src/backend/nodes/readfast.c b/src/backend/nodes/readfast.c index f1102e6873..e056b26992 100644 --- a/src/backend/nodes/readfast.c +++ b/src/backend/nodes/readfast.c @@ -2912,6 +2912,18 @@ _readLockRows(void) READ_DONE(); } +static LockingClause * +_readLockingClause(void) +{ + READ_LOCALS(LockingClause); + + READ_NODE_FIELD(lockedRels); + READ_ENUM_FIELD(strength, LockClauseStrength); + READ_BOOL_FIELD(noWait); + + READ_DONE(); +} + static Node * _readValue(NodeTag nt) { @@ -3851,6 +3863,9 @@ readNodeBinary(void) case T_AlterTableMoveAllStmt: return_value = _readAlterTableMoveAllStmt(); break; + case T_LockingClause: + return_value = _readLockingClause(); + break; default: return_value = NULL; /* keep the compiler silent */ elog(ERROR, "could not deserialize unrecognized node type: %d", diff --git a/src/test/regress/expected/rules.out b/src/test/regress/expected/rules.out index 557c22fb98..1b2f9d875a 100755 --- a/src/test/regress/expected/rules.out +++ b/src/test/regress/expected/rules.out @@ -2727,3 +2727,7 @@ SELECT pg_get_functiondef('func_with_set_params()'::regprocedure); (1 row) +-- test rule for select-for-update +create table t_test_rules_select_for_update (c int) distributed randomly; +create rule myrule as on insert to t_test_rules_select_for_update +do instead select * from t_test_rules_select_for_update for update; diff --git a/src/test/regress/sql/rules.sql b/src/test/regress/sql/rules.sql index 2bbd7411da..d055c7562e 100644 --- a/src/test/regress/sql/rules.sql +++ b/src/test/regress/sql/rules.sql @@ -1035,3 +1035,8 @@ CREATE FUNCTION func_with_set_params() RETURNS integer SET search_path TO PG_CATALOG, "Mixed/Case", 'c:/''a"/path', '', '0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789' IMMUTABLE STRICT; SELECT pg_get_functiondef('func_with_set_params()'::regprocedure); + +-- test rule for select-for-update +create table t_test_rules_select_for_update (c int) distributed randomly; +create rule myrule as on insert to t_test_rules_select_for_update +do instead select * from t_test_rules_select_for_update for update; -- GitLab