aboutsummaryrefslogtreecommitdiff
path: root/src/backend/parser
diff options
context:
space:
mode:
Diffstat (limited to 'src/backend/parser')
-rw-r--r--src/backend/parser/parse_relation.c8
-rw-r--r--src/backend/parser/parse_type.c10
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,