From 2a57b2edbd814ca2609ec9fb1efd99d7f626c694 Mon Sep 17 00:00:00 2001
From: Kyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Date: Thu, 24 May 2018 21:06:04 +0900
Subject: [PATCH 2/3] Qualify name of all objects that can define namespace

Name of some kinds of object were missing qualification in
getObjectDescription. This patch make them properly qualified.
---
 src/backend/catalog/objectaddress.c       | 90 ++++++++++++++++++++++++++++---
 src/test/regress/expected/alter_table.out | 10 ++--
 2 files changed, 88 insertions(+), 12 deletions(-)

diff --git a/src/backend/catalog/objectaddress.c b/src/backend/catalog/objectaddress.c
index 3b27ed7cf4..98850df39c 100644
--- a/src/backend/catalog/objectaddress.c
+++ b/src/backend/catalog/objectaddress.c
@@ -2738,6 +2738,7 @@ getObjectDescription(const ObjectAddress *object)
 			{
 				HeapTuple	collTup;
 				Form_pg_collation coll;
+				char	   *nspname;
 
 				collTup = SearchSysCache1(COLLOID,
 										  ObjectIdGetDatum(object->objectId));
@@ -2745,8 +2746,16 @@ getObjectDescription(const ObjectAddress *object)
 					elog(ERROR, "cache lookup failed for collation %u",
 						 object->objectId);
 				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"),
-								 NameStr(coll->collname));
+								 quote_qualified_identifier(nspname,
+															NameStr(coll->collname)));
 				ReleaseSysCache(collTup);
 				break;
 			}
@@ -2786,14 +2795,25 @@ getObjectDescription(const ObjectAddress *object)
 		case OCLASS_CONVERSION:
 			{
 				HeapTuple	conTup;
+				Form_pg_conversion conv;
+				char	   *nspname;
 
 				conTup = SearchSysCache1(CONVOID,
 										 ObjectIdGetDatum(object->objectId));
 				if (!HeapTupleIsValid(conTup))
 					elog(ERROR, "cache lookup failed for conversion %u",
 						 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"),
-								 NameStr(((Form_pg_conversion) GETSTRUCT(conTup))->conname));
+								 quote_qualified_identifier(nspname,
+															NameStr(conv->conname)));
 				ReleaseSysCache(conTup);
 				break;
 			}
@@ -3113,6 +3133,7 @@ getObjectDescription(const ObjectAddress *object)
 			{
 				HeapTuple	stxTup;
 				Form_pg_statistic_ext stxForm;
+				char	   *nspname;
 
 				stxTup = SearchSysCache1(STATEXTOID,
 										 ObjectIdGetDatum(object->objectId));
@@ -3122,8 +3143,15 @@ getObjectDescription(const ObjectAddress *object)
 
 				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"),
-								 NameStr(stxForm->stxname));
+								 quote_qualified_identifier(nspname,
+															NameStr(stxForm->stxname)));
 
 				ReleaseSysCache(stxTup);
 				break;
@@ -3132,14 +3160,26 @@ getObjectDescription(const ObjectAddress *object)
 		case OCLASS_TSPARSER:
 			{
 				HeapTuple	tup;
+				Form_pg_ts_parser prsForm;
+				char	   *nspname;
 
 				tup = SearchSysCache1(TSPARSEROID,
 									  ObjectIdGetDatum(object->objectId));
 				if (!HeapTupleIsValid(tup))
 					elog(ERROR, "cache lookup failed for text search parser %u",
 						 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"),
-								 NameStr(((Form_pg_ts_parser) GETSTRUCT(tup))->prsname));
+								 quote_qualified_identifier(nspname,
+															NameStr(prsForm->prsname)));
 				ReleaseSysCache(tup);
 				break;
 			}
@@ -3147,14 +3187,26 @@ getObjectDescription(const ObjectAddress *object)
 		case OCLASS_TSDICT:
 			{
 				HeapTuple	tup;
+				Form_pg_ts_dict dictForm;
+				char	   *nspname;
 
 				tup = SearchSysCache1(TSDICTOID,
 									  ObjectIdGetDatum(object->objectId));
 				if (!HeapTupleIsValid(tup))
 					elog(ERROR, "cache lookup failed for text search dictionary %u",
 						 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"),
-								 NameStr(((Form_pg_ts_dict) GETSTRUCT(tup))->dictname));
+								 quote_qualified_identifier(nspname,
+															NameStr(dictForm->dictname)));
 				ReleaseSysCache(tup);
 				break;
 			}
@@ -3162,14 +3214,26 @@ getObjectDescription(const ObjectAddress *object)
 		case OCLASS_TSTEMPLATE:
 			{
 				HeapTuple	tup;
+				Form_pg_ts_template tmplForm;
+				char	   *nspname;
 
 				tup = SearchSysCache1(TSTEMPLATEOID,
 									  ObjectIdGetDatum(object->objectId));
 				if (!HeapTupleIsValid(tup))
 					elog(ERROR, "cache lookup failed for text search template %u",
 						 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"),
-								 NameStr(((Form_pg_ts_template) GETSTRUCT(tup))->tmplname));
+								 quote_qualified_identifier(nspname,
+															NameStr(tmplForm->tmplname)));
 				ReleaseSysCache(tup);
 				break;
 			}
@@ -3177,14 +3241,26 @@ getObjectDescription(const ObjectAddress *object)
 		case OCLASS_TSCONFIG:
 			{
 				HeapTuple	tup;
+				Form_pg_ts_config cfgForm;
+				char	   *nspname;
 
 				tup = SearchSysCache1(TSCONFIGOID,
 									  ObjectIdGetDatum(object->objectId));
 				if (!HeapTupleIsValid(tup))
 					elog(ERROR, "cache lookup failed for text search configuration %u",
 						 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"),
-								 NameStr(((Form_pg_ts_config) GETSTRUCT(tup))->cfgname));
+								 quote_qualified_identifier(nspname,
+															NameStr(cfgForm->cfgname)));
 				ReleaseSysCache(tup);
 				break;
 			}
diff --git a/src/test/regress/expected/alter_table.out b/src/test/regress/expected/alter_table.out
index 50b9443e2d..376194c48a 100644
--- a/src/test/regress/expected/alter_table.out
+++ b/src/test/regress/expected/alter_table.out
@@ -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 function alter2.same(alter2.ctype,alter2.ctype)
 drop cascades to operator alter2.=(alter2.ctype,alter2.ctype)
-drop cascades to conversion ascii_to_utf8
-drop cascades to text search parser prs
-drop cascades to text search configuration cfg
-drop cascades to text search template tmpl
-drop cascades to text search dictionary dict
+drop cascades to conversion alter2.ascii_to_utf8
+drop cascades to text search parser alter2.prs
+drop cascades to text search configuration alter2.cfg
+drop cascades to text search template alter2.tmpl
+drop cascades to text search dictionary alter2.dict
 --
 -- composite types
 --
-- 
2.16.3

