Skip to content

Commit 7e2322d

Browse files
committed
Allow CREATE TABLE IF EXIST so succeed if the schema is nonexistent
Previously, CREATE TABLE IF EXIST threw an error if the schema was nonexistent. This was done by passing 'missing_ok' to the function that looks up the schema oid.
1 parent 7c83619 commit 7e2322d

File tree

9 files changed

+68
-41
lines changed

9 files changed

+68
-41
lines changed

src/backend/catalog/aclchk.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,7 @@ objectsInSchemaToOids(GrantObjectType objtype, List *nspnames)
755755
Oid namespaceId;
756756
List *objs;
757757

758-
namespaceId = LookupExplicitNamespace(nspname);
758+
namespaceId = LookupExplicitNamespace(nspname, false);
759759

760760
switch (objtype)
761761
{

src/backend/catalog/namespace.c

Lines changed: 56 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -291,7 +291,11 @@ RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode,
291291
{
292292
Oid namespaceId;
293293

294-
namespaceId = LookupExplicitNamespace(relation->schemaname);
294+
namespaceId = LookupExplicitNamespace(relation->schemaname, missing_ok);
295+
/*
296+
* For missing_ok, allow a non-existant schema name
297+
* to throw the error below (namespaceId == InvalidOid).
298+
*/
295299
if (namespaceId != myTempNamespace)
296300
ereport(ERROR,
297301
(errcode(ERRCODE_INVALID_TABLE_DEFINITION),
@@ -306,8 +310,11 @@ RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode,
306310
Oid namespaceId;
307311

308312
/* use exact schema given */
309-
namespaceId = LookupExplicitNamespace(relation->schemaname);
310-
relId = get_relname_relid(relation->relname, namespaceId);
313+
namespaceId = LookupExplicitNamespace(relation->schemaname, missing_ok);
314+
if (missing_ok && !OidIsValid(namespaceId))
315+
relId = InvalidOid;
316+
else
317+
relId = get_relname_relid(relation->relname, namespaceId);
311318
}
312319
else
313320
{
@@ -919,7 +926,7 @@ FuncnameGetCandidates(List *names, int nargs, List *argnames,
919926
if (schemaname)
920927
{
921928
/* use exact schema given */
922-
namespaceId = LookupExplicitNamespace(schemaname);
929+
namespaceId = LookupExplicitNamespace(schemaname, false);
923930
}
924931
else
925932
{
@@ -1453,7 +1460,7 @@ OpernameGetOprid(List *names, Oid oprleft, Oid oprright)
14531460
Oid namespaceId;
14541461
HeapTuple opertup;
14551462

1456-
namespaceId = LookupExplicitNamespace(schemaname);
1463+
namespaceId = LookupExplicitNamespace(schemaname, false);
14571464
opertup = SearchSysCache4(OPERNAMENSP,
14581465
CStringGetDatum(opername),
14591466
ObjectIdGetDatum(oprleft),
@@ -1551,7 +1558,7 @@ OpernameGetCandidates(List *names, char oprkind)
15511558
if (schemaname)
15521559
{
15531560
/* use exact schema given */
1554-
namespaceId = LookupExplicitNamespace(schemaname);
1561+
namespaceId = LookupExplicitNamespace(schemaname, false);
15551562
}
15561563
else
15571564
{
@@ -2093,10 +2100,13 @@ get_ts_parser_oid(List *names, bool missing_ok)
20932100
if (schemaname)
20942101
{
20952102
/* use exact schema given */
2096-
namespaceId = LookupExplicitNamespace(schemaname);
2097-
prsoid = GetSysCacheOid2(TSPARSERNAMENSP,
2098-
PointerGetDatum(parser_name),
2099-
ObjectIdGetDatum(namespaceId));
2103+
namespaceId = LookupExplicitNamespace(schemaname, missing_ok);
2104+
if (missing_ok && !OidIsValid(namespaceId))
2105+
prsoid = InvalidOid;
2106+
else
2107+
prsoid = GetSysCacheOid2(TSPARSERNAMENSP,
2108+
PointerGetDatum(parser_name),
2109+
ObjectIdGetDatum(namespaceId));
21002110
}
21012111
else
21022112
{
@@ -2216,10 +2226,13 @@ get_ts_dict_oid(List *names, bool missing_ok)
22162226
if (schemaname)
22172227
{
22182228
/* use exact schema given */
2219-
namespaceId = LookupExplicitNamespace(schemaname);
2220-
dictoid = GetSysCacheOid2(TSDICTNAMENSP,
2221-
PointerGetDatum(dict_name),
2222-
ObjectIdGetDatum(namespaceId));
2229+
namespaceId = LookupExplicitNamespace(schemaname, missing_ok);
2230+
if (missing_ok && !OidIsValid(namespaceId))
2231+
dictoid = InvalidOid;
2232+
else
2233+
dictoid = GetSysCacheOid2(TSDICTNAMENSP,
2234+
PointerGetDatum(dict_name),
2235+
ObjectIdGetDatum(namespaceId));
22232236
}
22242237
else
22252238
{
@@ -2340,10 +2353,13 @@ get_ts_template_oid(List *names, bool missing_ok)
23402353
if (schemaname)
23412354
{
23422355
/* use exact schema given */
2343-
namespaceId = LookupExplicitNamespace(schemaname);
2344-
tmploid = GetSysCacheOid2(TSTEMPLATENAMENSP,
2345-
PointerGetDatum(template_name),
2346-
ObjectIdGetDatum(namespaceId));
2356+
namespaceId = LookupExplicitNamespace(schemaname, missing_ok);
2357+
if (missing_ok && !OidIsValid(namespaceId))
2358+
tmploid = InvalidOid;
2359+
else
2360+
tmploid = GetSysCacheOid2(TSTEMPLATENAMENSP,
2361+
PointerGetDatum(template_name),
2362+
ObjectIdGetDatum(namespaceId));
23472363
}
23482364
else
23492365
{
@@ -2463,10 +2479,13 @@ get_ts_config_oid(List *names, bool missing_ok)
24632479
if (schemaname)
24642480
{
24652481
/* use exact schema given */
2466-
namespaceId = LookupExplicitNamespace(schemaname);
2467-
cfgoid = GetSysCacheOid2(TSCONFIGNAMENSP,
2468-
PointerGetDatum(config_name),
2469-
ObjectIdGetDatum(namespaceId));
2482+
namespaceId = LookupExplicitNamespace(schemaname, missing_ok);
2483+
if (missing_ok && !OidIsValid(namespaceId))
2484+
cfgoid = InvalidOid;
2485+
else
2486+
cfgoid = GetSysCacheOid2(TSCONFIGNAMENSP,
2487+
PointerGetDatum(config_name),
2488+
ObjectIdGetDatum(namespaceId));
24702489
}
24712490
else
24722491
{
@@ -2657,7 +2676,7 @@ LookupNamespaceNoError(const char *nspname)
26572676
* Returns the namespace OID. Raises ereport if any problem.
26582677
*/
26592678
Oid
2660-
LookupExplicitNamespace(const char *nspname)
2679+
LookupExplicitNamespace(const char *nspname, bool missing_ok)
26612680
{
26622681
Oid namespaceId;
26632682
AclResult aclresult;
@@ -2676,8 +2695,10 @@ LookupExplicitNamespace(const char *nspname)
26762695
*/
26772696
}
26782697

2679-
namespaceId = get_namespace_oid(nspname, false);
2680-
2698+
namespaceId = get_namespace_oid(nspname, missing_ok);
2699+
if (missing_ok && !OidIsValid(namespaceId))
2700+
return InvalidOid;
2701+
26812702
aclresult = pg_namespace_aclcheck(namespaceId, GetUserId(), ACL_USAGE);
26822703
if (aclresult != ACLCHECK_OK)
26832704
aclcheck_error(aclresult, ACL_KIND_NAMESPACE,
@@ -3248,7 +3269,9 @@ get_collation_oid(List *name, bool missing_ok)
32483269
if (schemaname)
32493270
{
32503271
/* use exact schema given */
3251-
namespaceId = LookupExplicitNamespace(schemaname);
3272+
namespaceId = LookupExplicitNamespace(schemaname, missing_ok);
3273+
if (missing_ok && !OidIsValid(namespaceId))
3274+
return InvalidOid;
32523275

32533276
/* first try for encoding-specific entry, then any-encoding */
32543277
colloid = GetSysCacheOid3(COLLNAMEENCNSP,
@@ -3318,10 +3341,13 @@ get_conversion_oid(List *name, bool missing_ok)
33183341
if (schemaname)
33193342
{
33203343
/* use exact schema given */
3321-
namespaceId = LookupExplicitNamespace(schemaname);
3322-
conoid = GetSysCacheOid2(CONNAMENSP,
3323-
PointerGetDatum(conversion_name),
3324-
ObjectIdGetDatum(namespaceId));
3344+
namespaceId = LookupExplicitNamespace(schemaname, missing_ok);
3345+
if (missing_ok && !OidIsValid(namespaceId))
3346+
conoid = InvalidOid;
3347+
else
3348+
conoid = GetSysCacheOid2(CONNAMENSP,
3349+
PointerGetDatum(conversion_name),
3350+
ObjectIdGetDatum(namespaceId));
33253351
}
33263352
else
33273353
{

src/backend/commands/indexcmds.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1264,7 +1264,7 @@ GetIndexOpClass(List *opclass, Oid attrType,
12641264
/* Look in specific schema only */
12651265
Oid namespaceId;
12661266

1267-
namespaceId = LookupExplicitNamespace(schemaname);
1267+
namespaceId = LookupExplicitNamespace(schemaname, false);
12681268
tuple = SearchSysCache3(CLAAMNAMENSP,
12691269
ObjectIdGetDatum(accessMethodId),
12701270
PointerGetDatum(opcname),

src/backend/commands/opclasscmds.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -103,7 +103,7 @@ OpFamilyCacheLookup(Oid amID, List *opfamilyname, bool missing_ok)
103103
/* Look in specific schema only */
104104
Oid namespaceId;
105105

106-
namespaceId = LookupExplicitNamespace(schemaname);
106+
namespaceId = LookupExplicitNamespace(schemaname, false);
107107
htup = SearchSysCache3(OPFAMILYAMNAMENSP,
108108
ObjectIdGetDatum(amID),
109109
PointerGetDatum(opfname),
@@ -179,7 +179,7 @@ OpClassCacheLookup(Oid amID, List *opclassname, bool missing_ok)
179179
/* Look in specific schema only */
180180
Oid namespaceId;
181181

182-
namespaceId = LookupExplicitNamespace(schemaname);
182+
namespaceId = LookupExplicitNamespace(schemaname, false);
183183
htup = SearchSysCache3(CLAAMNAMENSP,
184184
ObjectIdGetDatum(amID),
185185
PointerGetDatum(opcname),

src/backend/commands/trigger.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4226,7 +4226,8 @@ AfterTriggerSetState(ConstraintsSetStmt *stmt)
42264226
*/
42274227
if (constraint->schemaname)
42284228
{
4229-
Oid namespaceId = LookupExplicitNamespace(constraint->schemaname);
4229+
Oid namespaceId = LookupExplicitNamespace(constraint->schemaname,
4230+
false);
42304231

42314232
namespacelist = list_make1_oid(namespaceId);
42324233
}

src/backend/parser/parse_oper.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1027,7 +1027,7 @@ make_oper_cache_key(OprCacheKey *key, List *opname, Oid ltypeId, Oid rtypeId)
10271027
if (schemaname)
10281028
{
10291029
/* search only in exact schema given */
1030-
key->search_path[0] = LookupExplicitNamespace(schemaname);
1030+
key->search_path[0] = LookupExplicitNamespace(schemaname, false);
10311031
}
10321032
else
10331033
{

src/backend/parser/parse_type.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -149,7 +149,7 @@ LookupTypeName(ParseState *pstate, const TypeName *typeName,
149149
/* Look in specific schema only */
150150
Oid namespaceId;
151151

152-
namespaceId = LookupExplicitNamespace(schemaname);
152+
namespaceId = LookupExplicitNamespace(schemaname, false);
153153
typoid = GetSysCacheOid2(TYPENAMENSP,
154154
PointerGetDatum(typname),
155155
ObjectIdGetDatum(namespaceId));

src/backend/utils/adt/xml.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2678,7 +2678,7 @@ schema_to_xml(PG_FUNCTION_ARGS)
26782678
Oid nspid;
26792679

26802680
schemaname = NameStr(*name);
2681-
nspid = LookupExplicitNamespace(schemaname);
2681+
nspid = LookupExplicitNamespace(schemaname, false);
26822682

26832683
PG_RETURN_XML_P(stringinfo_to_xmltype(schema_to_xml_internal(nspid, NULL,
26842684
nulls, tableforest, targetns, true)));
@@ -2724,7 +2724,7 @@ schema_to_xmlschema_internal(const char *schemaname, bool nulls,
27242724

27252725
result = makeStringInfo();
27262726

2727-
nspid = LookupExplicitNamespace(schemaname);
2727+
nspid = LookupExplicitNamespace(schemaname, false);
27282728

27292729
xsd_schema_element_start(result, targetns);
27302730

@@ -2782,7 +2782,7 @@ schema_to_xml_and_xmlschema(PG_FUNCTION_ARGS)
27822782
StringInfo xmlschema;
27832783

27842784
schemaname = NameStr(*name);
2785-
nspid = LookupExplicitNamespace(schemaname);
2785+
nspid = LookupExplicitNamespace(schemaname, false);
27862786

27872787
xmlschema = schema_to_xmlschema_internal(schemaname, nulls,
27882788
tableforest, targetns);

src/include/catalog/namespace.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ extern void DeconstructQualifiedName(List *names,
106106
char **nspname_p,
107107
char **objname_p);
108108
extern Oid LookupNamespaceNoError(const char *nspname);
109-
extern Oid LookupExplicitNamespace(const char *nspname);
109+
extern Oid LookupExplicitNamespace(const char *nspname, bool missing_ok);
110110
extern Oid get_namespace_oid(const char *nspname, bool missing_ok);
111111

112112
extern Oid LookupCreationNamespace(const char *nspname);

0 commit comments

Comments
 (0)