From f0a5857da8c43d3ef93e13114bc14cffb3e65f6a Mon Sep 17 00:00:00 2001 From: syj <904673462@qq.com> Date: Wed, 21 Oct 2020 20:11:19 +0800 Subject: [PATCH] Fixed syntax error when 'IF EXISTS' is used in 'ALTER POLICY [IF EXISTS] old_name ON table_a RENAME TO new_name' --- src/common/backend/parser/gram.y | 20 ++++++++++++++ .../optimizer/commands/sec_rls_cmds.cpp | 27 ++++++++++++------- .../regress/expected/rowlevelsecurity.out | 4 +++ src/test/regress/sql/rowlevelsecurity.sql | 2 ++ 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/src/common/backend/parser/gram.y b/src/common/backend/parser/gram.y index b86c8bb92..5a563d1df 100755 --- a/src/common/backend/parser/gram.y +++ b/src/common/backend/parser/gram.y @@ -10213,6 +10213,26 @@ RenameStmt: ALTER AGGREGATE func_name aggr_args RENAME TO name n->missing_ok = false; $$ = (Node *)n; } + | ALTER POLICY IF_P EXISTS name ON qualified_name RENAME TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_RLSPOLICY; + n->subname = $5; + n->relation = $7; + n->newname = $10; + n->missing_ok = true; + $$ = (Node *)n; + } + | ALTER ROW LEVEL SECURITY POLICY IF_P EXISTS name ON qualified_name RENAME TO name + { + RenameStmt *n = makeNode(RenameStmt); + n->renameType = OBJECT_RLSPOLICY; + n->subname = $8; + n->relation = $10; + n->newname = $13; + n->missing_ok = true; + $$ = (Node *)n; + } | ALTER SCHEMA name RENAME TO name { RenameStmt *n = makeNode(RenameStmt); diff --git a/src/gausskernel/optimizer/commands/sec_rls_cmds.cpp b/src/gausskernel/optimizer/commands/sec_rls_cmds.cpp index 86089d702..8e4079ae0 100755 --- a/src/gausskernel/optimizer/commands/sec_rls_cmds.cpp +++ b/src/gausskernel/optimizer/commands/sec_rls_cmds.cpp @@ -513,20 +513,27 @@ void RenameRlsPolicy(RenameStmt* renameStmt) rlsPolicyTuple = systable_getnext(scanDesc); /* Policy does not exists */ if (HeapTupleIsValid(rlsPolicyTuple) == false) { - ereport(ERROR, - (errcode(ERRCODE_UNDEFINED_OBJECT), - errmsg("row level security policy \"%s\" for relation \"%s\" does not exists", + if (renameStmt->missing_ok) { + ereport(NOTICE, + (errmsg("row level security policy \"%s\" for relation \"%s\" does not exist, skipping", renameStmt->subname, renameStmt->relation->relname))); + } else { + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_OBJECT), + errmsg("row level security policy \"%s\" for relation \"%s\" does not exist", + renameStmt->subname, + renameStmt->relation->relname))); + } + } else { + /* Copy tuple here, because of update index later */ + rlsPolicyTuple = heap_copytuple(rlsPolicyTuple); + /* Update RLS policy name */ + (void)namestrcpy(&(((Form_pg_rlspolicy)GETSTRUCT(rlsPolicyTuple))->polname), renameStmt->newname); + simple_heap_update(pg_rlspolicy, &rlsPolicyTuple->t_self, rlsPolicyTuple); + CatalogUpdateIndexes(pg_rlspolicy, rlsPolicyTuple); } - /* Copy tuple here, because of update index later */ - rlsPolicyTuple = heap_copytuple(rlsPolicyTuple); - /* Update RLS policy name */ - (void)namestrcpy(&(((Form_pg_rlspolicy)GETSTRUCT(rlsPolicyTuple))->polname), renameStmt->newname); - simple_heap_update(pg_rlspolicy, &rlsPolicyTuple->t_self, rlsPolicyTuple); - CatalogUpdateIndexes(pg_rlspolicy, rlsPolicyTuple); - /* * Invalidate relation's relcache entry so that other backends (and this * one too!) are sent SI message to make them rebuild relcache entries. diff --git a/src/test/regress/expected/rowlevelsecurity.out b/src/test/regress/expected/rowlevelsecurity.out index 559192e55..e9b050b26 100644 --- a/src/test/regress/expected/rowlevelsecurity.out +++ b/src/test/regress/expected/rowlevelsecurity.out @@ -815,7 +815,11 @@ select * from pg_shdepend where classid = 3254 and refclassid = 1260 and refobji DROP USER regress_rls_bob; ALTER POLICY p01 ON document_row USING (dauthor = current_user); ALTER POLICY p01 ON document_row RENAME TO p12; +ALTER POLICY IF EXISTS p01 on document_row RENAME to p13; +NOTICE: row level security policy "p01" for relation "document_row" does not exist, skipping ALTER POLICY p12 ON document_row RENAME TO p13; +ALTER ROW LEVEL SECURITY POLICY IF EXISTS p12 ON document_row RENAME TO p01; +NOTICE: row level security policy "p12" for relation "document_row" does not exist, skipping ALTER POLICY p13 ON document_row RENAME TO p01; SELECT * FROM pg_rlspolicies ORDER BY tablename, policyname; schemaname | tablename | policyname | policypermissive | policyroles | policycmd | policyqual diff --git a/src/test/regress/sql/rowlevelsecurity.sql b/src/test/regress/sql/rowlevelsecurity.sql index 5e80f561b..d8c7c25d6 100644 --- a/src/test/regress/sql/rowlevelsecurity.sql +++ b/src/test/regress/sql/rowlevelsecurity.sql @@ -331,7 +331,9 @@ select * from pg_shdepend where classid = 3254 and refclassid = 1260 and refobji DROP USER regress_rls_bob; ALTER POLICY p01 ON document_row USING (dauthor = current_user); ALTER POLICY p01 ON document_row RENAME TO p12; +ALTER POLICY IF EXISTS p01 on document_row RENAME to p13; ALTER POLICY p12 ON document_row RENAME TO p13; +ALTER ROW LEVEL SECURITY POLICY IF EXISTS p12 ON document_row RENAME TO p01; ALTER POLICY p13 ON document_row RENAME TO p01; SELECT * FROM pg_rlspolicies ORDER BY tablename, policyname; -- enable private object