@@ -291,7 +291,11 @@ RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode,
291291{
292292Oid 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+ */
295299if (namespaceId != myTempNamespace )
296300ereport (ERROR ,
297301(errcode (ERRCODE_INVALID_TABLE_DEFINITION ),
@@ -306,8 +310,11 @@ RangeVarGetRelidExtended(const RangeVar *relation, LOCKMODE lockmode,
306310Oid 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}
312319else
313320{
@@ -919,7 +926,7 @@ FuncnameGetCandidates(List *names, int nargs, List *argnames,
919926if (schemaname )
920927{
921928/* use exact schema given */
922- namespaceId = LookupExplicitNamespace (schemaname );
929+ namespaceId = LookupExplicitNamespace (schemaname , false );
923930}
924931else
925932{
@@ -1453,7 +1460,7 @@ OpernameGetOprid(List *names, Oid oprleft, Oid oprright)
14531460Oid namespaceId ;
14541461HeapTuple opertup ;
14551462
1456- namespaceId = LookupExplicitNamespace (schemaname );
1463+ namespaceId = LookupExplicitNamespace (schemaname , false );
14571464opertup = SearchSysCache4 (OPERNAMENSP ,
14581465CStringGetDatum (opername ),
14591466ObjectIdGetDatum (oprleft ),
@@ -1551,7 +1558,7 @@ OpernameGetCandidates(List *names, char oprkind)
15511558if (schemaname )
15521559{
15531560/* use exact schema given */
1554- namespaceId = LookupExplicitNamespace (schemaname );
1561+ namespaceId = LookupExplicitNamespace (schemaname , false );
15551562}
15561563else
15571564{
@@ -2093,10 +2100,13 @@ get_ts_parser_oid(List *names, bool missing_ok)
20932100if (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}
21012111else
21022112{
@@ -2216,10 +2226,13 @@ get_ts_dict_oid(List *names, bool missing_ok)
22162226if (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}
22242237else
22252238{
@@ -2340,10 +2353,13 @@ get_ts_template_oid(List *names, bool missing_ok)
23402353if (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}
23482364else
23492365{
@@ -2463,10 +2479,13 @@ get_ts_config_oid(List *names, bool missing_ok)
24632479if (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}
24712490else
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{
26622681Oid namespaceId ;
26632682AclResult 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+
26812702aclresult = pg_namespace_aclcheck (namespaceId ,GetUserId (),ACL_USAGE );
26822703if (aclresult != ACLCHECK_OK )
26832704aclcheck_error (aclresult ,ACL_KIND_NAMESPACE ,
@@ -3248,7 +3269,9 @@ get_collation_oid(List *name, bool missing_ok)
32483269if (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 */
32543277colloid = GetSysCacheOid3 (COLLNAMEENCNSP ,
@@ -3318,10 +3341,13 @@ get_conversion_oid(List *name, bool missing_ok)
33183341if (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}
33263352else
33273353{