@@ -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 */
26592678Oid
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 {
0 commit comments