From 352a442c6fec640b99dbf968198c35cd22a94517 Mon Sep 17 00:00:00 2001 From: Nathan Bossart Date: Wed, 21 Mar 2018 21:31:22 +0000 Subject: [PATCH v1 1/2] Combine options for RangeVarGetRelidExtended() into a flags argument. --- src/backend/catalog/namespace.c | 11 ++++++----- src/backend/commands/cluster.c | 2 +- src/backend/commands/indexcmds.c | 4 ++-- src/backend/commands/lockcmds.c | 4 ++-- src/backend/commands/matview.c | 2 +- src/backend/commands/policy.c | 6 +++--- src/backend/commands/sequence.c | 3 +-- src/backend/commands/tablecmds.c | 15 +++++++-------- src/backend/commands/trigger.c | 2 +- src/backend/rewrite/rewriteDefine.c | 2 +- src/backend/tcop/utility.c | 2 +- src/include/catalog/namespace.h | 10 ++++++++-- 12 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/backend/catalog/namespace.c b/src/backend/catalog/namespace.c index 52dd400..edd229d 100644 --- a/src/backend/catalog/namespace.c +++ b/src/backend/catalog/namespace.c @@ -206,23 +206,24 @@ static bool MatchNamedCall(HeapTuple proctup, int nargs, List *argnames, * Given a RangeVar describing an existing relation, * select the proper namespace and look up the relation OID. * - * If the schema or relation is not found, return InvalidOid if missing_ok - * = true, otherwise raise an error. + * If the schema or relation is not found, return InvalidOid if the flags contain + * RELID_MISSING_OK, otherwise raise an error. * - * If nowait = true, throw an error if we'd have to wait for a lock. + * If the flags contain RELID_NOWAIT, throw an error if we'd have to wait for a lock. * * Callback allows caller to check permissions or acquire additional locks * prior to grabbing the relation lock. */ Oid RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode, - bool missing_ok, bool nowait, + int flags, RangeVarGetRelidCallback callback, void *callback_arg) { uint64 inval_count; Oid relId; Oid oldRelId = InvalidOid; bool retry = false; + bool missing_ok = ((flags & RELID_MISSING_OK) != 0); /* * We check the catalog name and then ignore it. @@ -361,7 +362,7 @@ RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode, */ if (!OidIsValid(relId)) AcceptInvalidationMessages(); - else if (!nowait) + else if ((flags & RELID_NOWAIT) == 0) LockRelationOid(relId, lockmode); else if (!ConditionalLockRelationOid(relId, lockmode)) { diff --git a/src/backend/commands/cluster.c b/src/backend/commands/cluster.c index 57f3917..37c83ca 100644 --- a/src/backend/commands/cluster.c +++ b/src/backend/commands/cluster.c @@ -115,7 +115,7 @@ cluster(ClusterStmt *stmt, bool isTopLevel) /* Find, lock, and check permissions on the table */ tableOid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, - false, false, + 0, RangeVarCallbackOwnsTable, NULL); rel = heap_open(tableOid, NoLock); diff --git a/src/backend/commands/indexcmds.c b/src/backend/commands/indexcmds.c index 0a2ab50..ee4def1 100644 --- a/src/backend/commands/indexcmds.c +++ b/src/backend/commands/indexcmds.c @@ -2091,7 +2091,7 @@ ReindexIndex(RangeVar *indexRelation, int options) * used here must match the index lock obtained in reindex_index(). */ indOid = RangeVarGetRelidExtended(indexRelation, AccessExclusiveLock, - false, false, + 0, RangeVarCallbackForReindexIndex, (void *) &heapOid); @@ -2183,7 +2183,7 @@ ReindexTable(RangeVar *relation, int options) Oid heapOid; /* The lock level used here should match reindex_relation(). */ - heapOid = RangeVarGetRelidExtended(relation, ShareLock, false, false, + heapOid = RangeVarGetRelidExtended(relation, ShareLock, 0, RangeVarCallbackOwnsTable, NULL); if (!reindex_relation(heapOid, diff --git a/src/backend/commands/lockcmds.c b/src/backend/commands/lockcmds.c index 6479dcb..a37dc01 100644 --- a/src/backend/commands/lockcmds.c +++ b/src/backend/commands/lockcmds.c @@ -57,8 +57,8 @@ LockTableCommand(LockStmt *lockstmt) bool recurse = rv->inh; Oid reloid; - reloid = RangeVarGetRelidExtended(rv, lockstmt->mode, false, - lockstmt->nowait, + reloid = RangeVarGetRelidExtended(rv, lockstmt->mode, + (lockstmt->nowait) ? RELID_NOWAIT : 0, RangeVarCallbackForLockTable, (void *) &lockstmt->mode); diff --git a/src/backend/commands/matview.c b/src/backend/commands/matview.c index 23892b1..410d4e5 100644 --- a/src/backend/commands/matview.c +++ b/src/backend/commands/matview.c @@ -161,7 +161,7 @@ ExecRefreshMatView(RefreshMatViewStmt *stmt, const char *queryString, * Get a lock until end of transaction. */ matviewOid = RangeVarGetRelidExtended(stmt->relation, - lockmode, false, false, + lockmode, 0, RangeVarCallbackOwnsTable, NULL); matviewRel = heap_open(matviewOid, NoLock); diff --git a/src/backend/commands/policy.c b/src/backend/commands/policy.c index 280a14a..ac96a35 100644 --- a/src/backend/commands/policy.c +++ b/src/backend/commands/policy.c @@ -740,7 +740,7 @@ CreatePolicy(CreatePolicyStmt *stmt) /* Get id of table. Also handles permissions checks. */ table_id = RangeVarGetRelidExtended(stmt->table, AccessExclusiveLock, - false, false, + 0, RangeVarCallbackForPolicy, (void *) stmt); @@ -912,7 +912,7 @@ AlterPolicy(AlterPolicyStmt *stmt) /* Get id of table. Also handles permissions checks. */ table_id = RangeVarGetRelidExtended(stmt->table, AccessExclusiveLock, - false, false, + 0, RangeVarCallbackForPolicy, (void *) stmt); @@ -1212,7 +1212,7 @@ rename_policy(RenameStmt *stmt) /* Get id of table. Also handles permissions checks. */ table_id = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, - false, false, + 0, RangeVarCallbackForPolicy, (void *) stmt); diff --git a/src/backend/commands/sequence.c b/src/backend/commands/sequence.c index dcc0aa5..96984e3 100644 --- a/src/backend/commands/sequence.c +++ b/src/backend/commands/sequence.c @@ -432,8 +432,7 @@ AlterSequence(ParseState *pstate, AlterSeqStmt *stmt) /* Open and lock sequence, and check for ownership along the way. */ relid = RangeVarGetRelidExtended(stmt->sequence, ShareRowExclusiveLock, - stmt->missing_ok, - false, + (stmt->missing_ok) ? RELID_MISSING_OK : 0, RangeVarCallbackOwnsRelation, NULL); if (relid == InvalidOid) diff --git a/src/backend/commands/tablecmds.c b/src/backend/commands/tablecmds.c index f5c744b..128434b 100644 --- a/src/backend/commands/tablecmds.c +++ b/src/backend/commands/tablecmds.c @@ -1147,8 +1147,7 @@ RemoveRelations(DropStmt *drop) state.heapOid = InvalidOid; state.partParentOid = InvalidOid; state.concurrent = drop->concurrent; - relOid = RangeVarGetRelidExtended(rel, lockmode, true, - false, + relOid = RangeVarGetRelidExtended(rel, lockmode, RELID_MISSING_OK, RangeVarCallbackForDropRelation, (void *) &state); @@ -2781,7 +2780,7 @@ renameatt(RenameStmt *stmt) /* lock level taken here should match renameatt_internal */ relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, - stmt->missing_ok, false, + (stmt->missing_ok) ? RELID_MISSING_OK : 0, RangeVarCallbackForRenameAttribute, NULL); @@ -2933,7 +2932,7 @@ RenameConstraint(RenameStmt *stmt) { /* lock level taken here should match rename_constraint_internal */ relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, - stmt->missing_ok, false, + (stmt->missing_ok) ? RELID_MISSING_OK : 0, RangeVarCallbackForRenameAttribute, NULL); if (!OidIsValid(relid)) @@ -2975,7 +2974,7 @@ RenameRelation(RenameStmt *stmt) * escalation. */ relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, - stmt->missing_ok, false, + (stmt->missing_ok) ? RELID_MISSING_OK : 0, RangeVarCallbackForAlterRelation, (void *) stmt); @@ -3134,7 +3133,7 @@ CheckTableNotInUse(Relation rel, const char *stmt) Oid AlterTableLookupRelation(AlterTableStmt *stmt, LOCKMODE lockmode) { - return RangeVarGetRelidExtended(stmt->relation, lockmode, stmt->missing_ok, false, + return RangeVarGetRelidExtended(stmt->relation, lockmode, (stmt->missing_ok) ? RELID_MISSING_OK : 0, RangeVarCallbackForAlterRelation, (void *) stmt); } @@ -12646,7 +12645,7 @@ AlterTableNamespace(AlterObjectSchemaStmt *stmt, Oid *oldschema) ObjectAddress myself; relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, - stmt->missing_ok, false, + (stmt->missing_ok) ? RELID_MISSING_OK : 0, RangeVarCallbackForAlterRelation, (void *) stmt); @@ -14452,7 +14451,7 @@ ATExecAttachPartitionIdx(List **wqueue, Relation parentIdx, RangeVar *name) state.parentTblOid = parentIdx->rd_index->indrelid; state.lockedParentTbl = false; partIdxId = - RangeVarGetRelidExtended(name, AccessExclusiveLock, false, false, + RangeVarGetRelidExtended(name, AccessExclusiveLock, 0, RangeVarCallbackForAttachIndex, (void *) &state); /* Not there? */ diff --git a/src/backend/commands/trigger.c b/src/backend/commands/trigger.c index fbd176b..5f1f5c5 100644 --- a/src/backend/commands/trigger.c +++ b/src/backend/commands/trigger.c @@ -1462,7 +1462,7 @@ renametrig(RenameStmt *stmt) * release until end of transaction). */ relid = RangeVarGetRelidExtended(stmt->relation, AccessExclusiveLock, - false, false, + 0, RangeVarCallbackForRenameTrigger, NULL); diff --git a/src/backend/rewrite/rewriteDefine.c b/src/backend/rewrite/rewriteDefine.c index 679be60..d81a2ea 100644 --- a/src/backend/rewrite/rewriteDefine.c +++ b/src/backend/rewrite/rewriteDefine.c @@ -951,7 +951,7 @@ RenameRewriteRule(RangeVar *relation, const char *oldName, * release until end of transaction). */ relid = RangeVarGetRelidExtended(relation, AccessExclusiveLock, - false, false, + 0, RangeVarCallbackForRenameRule, NULL); diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c index ed55521..b497c6e 100644 --- a/src/backend/tcop/utility.c +++ b/src/backend/tcop/utility.c @@ -1307,7 +1307,7 @@ ProcessUtilitySlow(ParseState *pstate, : ShareLock; relid = RangeVarGetRelidExtended(stmt->relation, lockmode, - false, false, + 0, RangeVarCallbackOwnsRelation, NULL); diff --git a/src/include/catalog/namespace.h b/src/include/catalog/namespace.h index 5f8cf49..22f8667 100644 --- a/src/include/catalog/namespace.h +++ b/src/include/catalog/namespace.h @@ -47,14 +47,20 @@ typedef struct OverrideSearchPath bool addTemp; /* implicitly prepend temp schema? */ } OverrideSearchPath; +typedef enum RelidOption +{ + RELID_MISSING_OK = 1 << 0, /* don't error if relation doesn't exist */ + RELID_NOWAIT = 1 << 1 /* error if relation cannot be locked */ +} RelidOption; + typedef void (*RangeVarGetRelidCallback) (const RangeVar *relation, Oid relId, Oid oldRelId, void *callback_arg); #define RangeVarGetRelid(relation, lockmode, missing_ok) \ - RangeVarGetRelidExtended(relation, lockmode, missing_ok, false, NULL, NULL) + RangeVarGetRelidExtended(relation, lockmode, (missing_ok) ? RELID_MISSING_OK : 0, NULL, NULL) extern Oid RangeVarGetRelidExtended(const RangeVar *relation, - LOCKMODE lockmode, bool missing_ok, bool nowait, + LOCKMODE lockmode, int flags, RangeVarGetRelidCallback callback, void *callback_arg); extern Oid RangeVarGetCreationNamespace(const RangeVar *newRelation); -- 2.7.3.AMZN