From 61c1f58c3f43f61b9add912f62de7173bb9fef1c Mon Sep 17 00:00:00 2001
From: reshke kirill <reshke@double.cloud>
Date: Thu, 28 Nov 2024 05:19:58 +0000
Subject: [PATCH v2] Pass ParseState as down to utility functions.

ParseState was lacking in a number of places, for example
typenameType call inside DefineDomain.
This patch fixes that. Now error-message for create domain
also show error location.
---
 src/backend/commands/typecmds.c    | 14 +++++---------
 src/backend/parser/parse_utilcmd.c |  2 +-
 src/backend/tcop/utility.c         |  4 ++--
 src/include/commands/typecmds.h    |  4 ++--
 4 files changed, 10 insertions(+), 14 deletions(-)

diff --git a/src/backend/commands/typecmds.c b/src/backend/commands/typecmds.c
index 859e2191f08..11548da1fd5 100644
--- a/src/backend/commands/typecmds.c
+++ b/src/backend/commands/typecmds.c
@@ -348,7 +348,7 @@ DefineType(ParseState *pstate, List *names, List *parameters)
 		Type		likeType;
 		Form_pg_type likeForm;
 
-		likeType = typenameType(NULL, defGetTypeName(likeTypeEl), NULL);
+		likeType = typenameType(pstate, defGetTypeName(likeTypeEl), NULL);
 		likeForm = (Form_pg_type) GETSTRUCT(likeType);
 		internalLength = likeForm->typlen;
 		byValue = likeForm->typbyval;
@@ -694,7 +694,7 @@ RemoveTypeById(Oid typeOid)
  *		Registers a new domain.
  */
 ObjectAddress
-DefineDomain(CreateDomainStmt *stmt)
+DefineDomain(ParseState *pstate, CreateDomainStmt *stmt)
 {
 	char	   *domainName;
 	char	   *domainArrayName;
@@ -761,7 +761,7 @@ DefineDomain(CreateDomainStmt *stmt)
 	/*
 	 * Look up the base type.
 	 */
-	typeTup = typenameType(NULL, stmt->typeName, &basetypeMod);
+	typeTup = typenameType(pstate, stmt->typeName, &basetypeMod);
 	baseType = (Form_pg_type) GETSTRUCT(typeTup);
 	basetypeoid = baseType->oid;
 
@@ -885,12 +885,8 @@ DefineDomain(CreateDomainStmt *stmt)
 
 				if (constr->raw_expr)
 				{
-					ParseState *pstate;
 					Node	   *defaultExpr;
 
-					/* Create a dummy ParseState for transformExpr */
-					pstate = make_parsestate(NULL);
-
 					/*
 					 * Cook the constr->raw_expr into an expression. Note:
 					 * name is strictly for error message
@@ -4315,7 +4311,7 @@ AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid,
  * adding new flexibility.
  */
 ObjectAddress
-AlterType(AlterTypeStmt *stmt)
+AlterType(ParseState *pstate, AlterTypeStmt *stmt)
 {
 	ObjectAddress address;
 	Relation	catalog;
@@ -4331,7 +4327,7 @@ AlterType(AlterTypeStmt *stmt)
 
 	/* Make a TypeName so we can use standard type lookup machinery */
 	typename = makeTypeNameFromNameList(stmt->typeName);
-	tup = typenameType(NULL, typename, NULL);
+	tup = typenameType(pstate, typename, NULL);
 
 	typeOid = typeTypeId(tup);
 	typForm = (Form_pg_type) GETSTRUCT(tup);
diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c
index 0f324ee4e31..95dad766834 100644
--- a/src/backend/parser/parse_utilcmd.c
+++ b/src/backend/parser/parse_utilcmd.c
@@ -1615,7 +1615,7 @@ transformOfType(CreateStmtContext *cxt, TypeName *ofTypename)
 
 	Assert(ofTypename);
 
-	tuple = typenameType(NULL, ofTypename, NULL);
+	tuple = typenameType(cxt->pstate, ofTypename, NULL);
 	check_of_type(tuple);
 	ofTypeId = ((Form_pg_type) GETSTRUCT(tuple))->oid;
 	ofTypename->typeOid = ofTypeId; /* cached for later */
diff --git a/src/backend/tcop/utility.c b/src/backend/tcop/utility.c
index f28bf371059..aa24283efff 100644
--- a/src/backend/tcop/utility.c
+++ b/src/backend/tcop/utility.c
@@ -1712,7 +1712,7 @@ ProcessUtilitySlow(ParseState *pstate,
 				break;
 
 			case T_CreateDomainStmt:
-				address = DefineDomain((CreateDomainStmt *) parsetree);
+				address = DefineDomain(pstate, (CreateDomainStmt *) parsetree);
 				break;
 
 			case T_CreateConversionStmt:
@@ -1801,7 +1801,7 @@ ProcessUtilitySlow(ParseState *pstate,
 				break;
 
 			case T_AlterTypeStmt:
-				address = AlterType((AlterTypeStmt *) parsetree);
+				address = AlterType(pstate, (AlterTypeStmt *) parsetree);
 				break;
 
 			case T_CommentStmt:
diff --git a/src/include/commands/typecmds.h b/src/include/commands/typecmds.h
index e1b02927c4b..6e493b896c2 100644
--- a/src/include/commands/typecmds.h
+++ b/src/include/commands/typecmds.h
@@ -23,7 +23,7 @@
 
 extern ObjectAddress DefineType(ParseState *pstate, List *names, List *parameters);
 extern void RemoveTypeById(Oid typeOid);
-extern ObjectAddress DefineDomain(CreateDomainStmt *stmt);
+extern ObjectAddress DefineDomain(ParseState *pstate, CreateDomainStmt *stmt);
 extern ObjectAddress DefineEnum(CreateEnumStmt *stmt);
 extern ObjectAddress DefineRange(ParseState *pstate, CreateRangeStmt *stmt);
 extern ObjectAddress AlterEnum(AlterEnumStmt *stmt);
@@ -58,6 +58,6 @@ extern Oid	AlterTypeNamespaceInternal(Oid typeOid, Oid nspOid,
 									   bool errorOnTableType,
 									   ObjectAddresses *objsMoved);
 
-extern ObjectAddress AlterType(AlterTypeStmt *stmt);
+extern ObjectAddress AlterType(ParseState *pstate, AlterTypeStmt *stmt);
 
 #endif							/* TYPECMDS_H */
-- 
2.34.1

