diff options
Diffstat (limited to 'src/backend/parser')
-rw-r--r-- | src/backend/parser/parse_relation.c | 8 | ||||
-rw-r--r-- | src/backend/parser/parse_type.c | 10 |
2 files changed, 15 insertions, 3 deletions
diff --git a/src/backend/parser/parse_relation.c b/src/backend/parser/parse_relation.c index f2ccf0d7453..3840c2f3ed5 100644 --- a/src/backend/parser/parse_relation.c +++ b/src/backend/parser/parse_relation.c @@ -273,11 +273,17 @@ searchRangeTable(ParseState *pstate, RangeVar *relation) * If it's an unqualified name, check for possible CTE matches. A CTE * hides any real relation matches. If no CTE, look for a matching * relation. + * + * NB: It's not critical that RangeVarGetRelid return the correct answer + * here in the face of concurrent DDL. If it doesn't, the worst case + * scenario is a less-clear error message. Also, the tables involved in + * the query are already locked, which reduces the number of cases in + * which surprising behavior can occur. So we do the name lookup unlocked. */ if (!relation->schemaname) cte = scanNameSpaceForCTE(pstate, refname, &ctelevelsup); if (!cte) - relId = RangeVarGetRelid(relation, true); + relId = RangeVarGetRelid(relation, NoLock, true, false); /* Now look for RTEs matching either the relation/CTE or the alias */ for (levelsup = 0; diff --git a/src/backend/parser/parse_type.c b/src/backend/parser/parse_type.c index ac62cbc8c33..2122032ce22 100644 --- a/src/backend/parser/parse_type.c +++ b/src/backend/parser/parse_type.c @@ -108,8 +108,14 @@ LookupTypeName(ParseState *pstate, const TypeName *typeName, break; } - /* look up the field */ - relid = RangeVarGetRelid(rel, false); + /* + * Look up the field. + * + * XXX: As no lock is taken here, this might fail in the presence + * of concurrent DDL. But taking a lock would carry a performance + * penalty and would also require a permissions check. + */ + relid = RangeVarGetRelid(rel, NoLock, false, false); attnum = get_attnum(relid, field); if (attnum == InvalidAttrNumber) ereport(ERROR, |