Properly schema-qualify additional object types in getObjectDescription().

Collations, conversions, extended statistics objects (in >= v10),
and all four types of text search objects have schema-qualified names.
getObjectDescription() ignored that and would emit just the base name of
the object, potentially producing wrong or at least highly misleading
output.  Fix it to add the schema name whenever the object is not "visible"
in the current search path, as is the rule for other schema-qualifiable
object types.

Although in common situations the output won't change, this seems to me
(tgl) to be a bug worthy of back-patching, hence do so.

Kyotaro Horiguchi, per a complaint from me

Discussion: https://postgr.es/m/20180522.182020.114074746.horiguchi.kyotaro@lab.ntt.co.jp
This commit is contained in:
Tom Lane 2018-05-24 12:07:41 -04:00
parent 4431c94c36
commit 056f52d9c3
2 changed files with 84 additions and 13 deletions

View File

@ -2738,6 +2738,7 @@ getObjectDescription(const ObjectAddress *object)
{ {
HeapTuple collTup; HeapTuple collTup;
Form_pg_collation coll; Form_pg_collation coll;
char *nspname;
collTup = SearchSysCache1(COLLOID, collTup = SearchSysCache1(COLLOID,
ObjectIdGetDatum(object->objectId)); ObjectIdGetDatum(object->objectId));
@ -2745,8 +2746,16 @@ getObjectDescription(const ObjectAddress *object)
elog(ERROR, "cache lookup failed for collation %u", elog(ERROR, "cache lookup failed for collation %u",
object->objectId); object->objectId);
coll = (Form_pg_collation) GETSTRUCT(collTup); coll = (Form_pg_collation) GETSTRUCT(collTup);
/* Qualify the name if not visible in search path */
if (CollationIsVisible(object->objectId))
nspname = NULL;
else
nspname = get_namespace_name(coll->collnamespace);
appendStringInfo(&buffer, _("collation %s"), appendStringInfo(&buffer, _("collation %s"),
NameStr(coll->collname)); quote_qualified_identifier(nspname,
NameStr(coll->collname)));
ReleaseSysCache(collTup); ReleaseSysCache(collTup);
break; break;
} }
@ -2786,14 +2795,25 @@ getObjectDescription(const ObjectAddress *object)
case OCLASS_CONVERSION: case OCLASS_CONVERSION:
{ {
HeapTuple conTup; HeapTuple conTup;
Form_pg_conversion conv;
char *nspname;
conTup = SearchSysCache1(CONVOID, conTup = SearchSysCache1(CONVOID,
ObjectIdGetDatum(object->objectId)); ObjectIdGetDatum(object->objectId));
if (!HeapTupleIsValid(conTup)) if (!HeapTupleIsValid(conTup))
elog(ERROR, "cache lookup failed for conversion %u", elog(ERROR, "cache lookup failed for conversion %u",
object->objectId); object->objectId);
conv = (Form_pg_conversion) GETSTRUCT(conTup);
/* Qualify the name if not visible in search path */
if (ConversionIsVisible(object->objectId))
nspname = NULL;
else
nspname = get_namespace_name(conv->connamespace);
appendStringInfo(&buffer, _("conversion %s"), appendStringInfo(&buffer, _("conversion %s"),
NameStr(((Form_pg_conversion) GETSTRUCT(conTup))->conname)); quote_qualified_identifier(nspname,
NameStr(conv->conname)));
ReleaseSysCache(conTup); ReleaseSysCache(conTup);
break; break;
} }
@ -3095,17 +3115,24 @@ getObjectDescription(const ObjectAddress *object)
{ {
HeapTuple stxTup; HeapTuple stxTup;
Form_pg_statistic_ext stxForm; Form_pg_statistic_ext stxForm;
char *nspname;
stxTup = SearchSysCache1(STATEXTOID, stxTup = SearchSysCache1(STATEXTOID,
ObjectIdGetDatum(object->objectId)); ObjectIdGetDatum(object->objectId));
if (!HeapTupleIsValid(stxTup)) if (!HeapTupleIsValid(stxTup))
elog(ERROR, "could not find tuple for statistics object %u", elog(ERROR, "could not find tuple for statistics object %u",
object->objectId); object->objectId);
stxForm = (Form_pg_statistic_ext) GETSTRUCT(stxTup); stxForm = (Form_pg_statistic_ext) GETSTRUCT(stxTup);
/* Qualify the name if not visible in search path */
if (StatisticsObjIsVisible(object->objectId))
nspname = NULL;
else
nspname = get_namespace_name(stxForm->stxnamespace);
appendStringInfo(&buffer, _("statistics object %s"), appendStringInfo(&buffer, _("statistics object %s"),
NameStr(stxForm->stxname)); quote_qualified_identifier(nspname,
NameStr(stxForm->stxname)));
ReleaseSysCache(stxTup); ReleaseSysCache(stxTup);
break; break;
@ -3114,14 +3141,25 @@ getObjectDescription(const ObjectAddress *object)
case OCLASS_TSPARSER: case OCLASS_TSPARSER:
{ {
HeapTuple tup; HeapTuple tup;
Form_pg_ts_parser prsForm;
char *nspname;
tup = SearchSysCache1(TSPARSEROID, tup = SearchSysCache1(TSPARSEROID,
ObjectIdGetDatum(object->objectId)); ObjectIdGetDatum(object->objectId));
if (!HeapTupleIsValid(tup)) if (!HeapTupleIsValid(tup))
elog(ERROR, "cache lookup failed for text search parser %u", elog(ERROR, "cache lookup failed for text search parser %u",
object->objectId); object->objectId);
prsForm = (Form_pg_ts_parser) GETSTRUCT(tup);
/* Qualify the name if not visible in search path */
if (TSParserIsVisible(object->objectId))
nspname = NULL;
else
nspname = get_namespace_name(prsForm->prsnamespace);
appendStringInfo(&buffer, _("text search parser %s"), appendStringInfo(&buffer, _("text search parser %s"),
NameStr(((Form_pg_ts_parser) GETSTRUCT(tup))->prsname)); quote_qualified_identifier(nspname,
NameStr(prsForm->prsname)));
ReleaseSysCache(tup); ReleaseSysCache(tup);
break; break;
} }
@ -3129,14 +3167,25 @@ getObjectDescription(const ObjectAddress *object)
case OCLASS_TSDICT: case OCLASS_TSDICT:
{ {
HeapTuple tup; HeapTuple tup;
Form_pg_ts_dict dictForm;
char *nspname;
tup = SearchSysCache1(TSDICTOID, tup = SearchSysCache1(TSDICTOID,
ObjectIdGetDatum(object->objectId)); ObjectIdGetDatum(object->objectId));
if (!HeapTupleIsValid(tup)) if (!HeapTupleIsValid(tup))
elog(ERROR, "cache lookup failed for text search dictionary %u", elog(ERROR, "cache lookup failed for text search dictionary %u",
object->objectId); object->objectId);
dictForm = (Form_pg_ts_dict) GETSTRUCT(tup);
/* Qualify the name if not visible in search path */
if (TSDictionaryIsVisible(object->objectId))
nspname = NULL;
else
nspname = get_namespace_name(dictForm->dictnamespace);
appendStringInfo(&buffer, _("text search dictionary %s"), appendStringInfo(&buffer, _("text search dictionary %s"),
NameStr(((Form_pg_ts_dict) GETSTRUCT(tup))->dictname)); quote_qualified_identifier(nspname,
NameStr(dictForm->dictname)));
ReleaseSysCache(tup); ReleaseSysCache(tup);
break; break;
} }
@ -3144,14 +3193,25 @@ getObjectDescription(const ObjectAddress *object)
case OCLASS_TSTEMPLATE: case OCLASS_TSTEMPLATE:
{ {
HeapTuple tup; HeapTuple tup;
Form_pg_ts_template tmplForm;
char *nspname;
tup = SearchSysCache1(TSTEMPLATEOID, tup = SearchSysCache1(TSTEMPLATEOID,
ObjectIdGetDatum(object->objectId)); ObjectIdGetDatum(object->objectId));
if (!HeapTupleIsValid(tup)) if (!HeapTupleIsValid(tup))
elog(ERROR, "cache lookup failed for text search template %u", elog(ERROR, "cache lookup failed for text search template %u",
object->objectId); object->objectId);
tmplForm = (Form_pg_ts_template) GETSTRUCT(tup);
/* Qualify the name if not visible in search path */
if (TSTemplateIsVisible(object->objectId))
nspname = NULL;
else
nspname = get_namespace_name(tmplForm->tmplnamespace);
appendStringInfo(&buffer, _("text search template %s"), appendStringInfo(&buffer, _("text search template %s"),
NameStr(((Form_pg_ts_template) GETSTRUCT(tup))->tmplname)); quote_qualified_identifier(nspname,
NameStr(tmplForm->tmplname)));
ReleaseSysCache(tup); ReleaseSysCache(tup);
break; break;
} }
@ -3159,14 +3219,25 @@ getObjectDescription(const ObjectAddress *object)
case OCLASS_TSCONFIG: case OCLASS_TSCONFIG:
{ {
HeapTuple tup; HeapTuple tup;
Form_pg_ts_config cfgForm;
char *nspname;
tup = SearchSysCache1(TSCONFIGOID, tup = SearchSysCache1(TSCONFIGOID,
ObjectIdGetDatum(object->objectId)); ObjectIdGetDatum(object->objectId));
if (!HeapTupleIsValid(tup)) if (!HeapTupleIsValid(tup))
elog(ERROR, "cache lookup failed for text search configuration %u", elog(ERROR, "cache lookup failed for text search configuration %u",
object->objectId); object->objectId);
cfgForm = (Form_pg_ts_config) GETSTRUCT(tup);
/* Qualify the name if not visible in search path */
if (TSConfigIsVisible(object->objectId))
nspname = NULL;
else
nspname = get_namespace_name(cfgForm->cfgnamespace);
appendStringInfo(&buffer, _("text search configuration %s"), appendStringInfo(&buffer, _("text search configuration %s"),
NameStr(((Form_pg_ts_config) GETSTRUCT(tup))->cfgname)); quote_qualified_identifier(nspname,
NameStr(cfgForm->cfgname)));
ReleaseSysCache(tup); ReleaseSysCache(tup);
break; break;
} }

View File

@ -2680,11 +2680,11 @@ drop cascades to operator family alter2.ctype_hash_ops for access method hash
drop cascades to type alter2.ctype drop cascades to type alter2.ctype
drop cascades to function alter2.same(alter2.ctype,alter2.ctype) drop cascades to function alter2.same(alter2.ctype,alter2.ctype)
drop cascades to operator alter2.=(alter2.ctype,alter2.ctype) drop cascades to operator alter2.=(alter2.ctype,alter2.ctype)
drop cascades to conversion ascii_to_utf8 drop cascades to conversion alter2.ascii_to_utf8
drop cascades to text search parser prs drop cascades to text search parser alter2.prs
drop cascades to text search configuration cfg drop cascades to text search configuration alter2.cfg
drop cascades to text search template tmpl drop cascades to text search template alter2.tmpl
drop cascades to text search dictionary dict drop cascades to text search dictionary alter2.dict
-- --
-- composite types -- composite types
-- --