!319 Fixed syntax error when 'IF EXISTS' is used in 'ALTER POLICY [IF EXISTS] old_name ON table_a RENAME TO new_name'

Merge pull request !319 from Yuejia/master
This commit is contained in:
opengauss-bot
2020-10-22 17:01:48 +08:00
committed by Gitee
4 changed files with 43 additions and 10 deletions

View File

@ -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);

View File

@ -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.

View File

@ -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

View File

@ -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