Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit7e2322d

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 wasnonexistent. This was done by passing 'missing_ok' to the function thatlooks up the schema oid.
1 parent7c83619 commit7e2322d

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
OidnamespaceId;
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
OidnamespaceId;
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
OidnamespaceId;
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
OidnamespaceId;
14541461
HeapTupleopertup;
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(constchar*nspname)
2679+
LookupExplicitNamespace(constchar*nspname,boolmissing_ok)
26612680
{
26622681
OidnamespaceId;
26632682
AclResultaclresult;
@@ -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+
returnInvalidOid;
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+
returnInvalidOid;
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
OidnamespaceId;
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
OidnamespaceId;
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
OidnamespaceId;
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-
OidnamespaceId=LookupExplicitNamespace(constraint->schemaname);
4229+
OidnamespaceId=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
OidnamespaceId;
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
Oidnspid;
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
StringInfoxmlschema;
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
externOidLookupNamespaceNoError(constchar*nspname);
109-
externOidLookupExplicitNamespace(constchar*nspname);
109+
externOidLookupExplicitNamespace(constchar*nspname,boolmissing_ok);
110110
externOidget_namespace_oid(constchar*nspname,boolmissing_ok);
111111

112112
externOidLookupCreationNamespace(constchar*nspname);

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp