From 7f60be72b0865dd442c4f6164a997ff528a44d85 Mon Sep 17 00:00:00 2001
From: Robert Haas <rhaas@postgresql.org>
Date: Mon, 3 Jan 2011 22:08:55 -0500
Subject: [PATCH] Fix crash in ALTER OPERATOR CLASS/FAMILY .. SET SCHEMA.

In the previous coding, the parser emitted a List containing a C string,
which is no good, because copyObject() can't handle it.

Dimitri Fontaine
---
 src/backend/commands/alter.c       | 4 ++--
 src/backend/commands/opclasscmds.c | 9 ++-------
 src/backend/parser/gram.y          | 4 ++--
 src/include/commands/defrem.h      | 4 ++--
 4 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/src/backend/commands/alter.c b/src/backend/commands/alter.c
index 6a9b21d01fe..1c6ae0243e4 100644
--- a/src/backend/commands/alter.c
+++ b/src/backend/commands/alter.c
@@ -198,11 +198,11 @@ ExecAlterObjectSchemaStmt(AlterObjectSchemaStmt *stmt)
 			break;
 
 		case OBJECT_OPCLASS:
-			AlterOpClassNamespace(stmt->object, stmt->objarg, stmt->newschema);
+			AlterOpClassNamespace(stmt->object, stmt->addname, stmt->newschema);
 			break;
 
 		case OBJECT_OPFAMILY:
-			AlterOpFamilyNamespace(stmt->object, stmt->objarg, stmt->newschema);
+			AlterOpFamilyNamespace(stmt->object, stmt->addname, stmt->newschema);
 			break;
 
 		case OBJECT_SEQUENCE:
diff --git a/src/backend/commands/opclasscmds.c b/src/backend/commands/opclasscmds.c
index ab9bc327feb..662b9420387 100644
--- a/src/backend/commands/opclasscmds.c
+++ b/src/backend/commands/opclasscmds.c
@@ -1993,16 +1993,13 @@ AlterOpClassOwner_internal(Relation rel, HeapTuple tup, Oid newOwnerId)
  * ALTER OPERATOR CLASS any_name USING access_method SET SCHEMA name
  */
 void
-AlterOpClassNamespace(List *name, List *argam, const char *newschema)
+AlterOpClassNamespace(List *name, char *access_method, const char *newschema)
 {
 	Oid			amOid;
-	char       *access_method = linitial(argam);
 	Relation	rel;
 	Oid			oid;
 	Oid			nspOid;
 
-	Assert(list_length(argam) == 1);
-
 	amOid = get_am_oid(access_method, false);
 
 	rel = heap_open(OperatorClassRelationId, RowExclusiveLock);
@@ -2185,15 +2182,13 @@ get_am_oid(const char *amname, bool missing_ok)
  * ALTER OPERATOR FAMILY any_name USING access_method SET SCHEMA name
  */
 void
-AlterOpFamilyNamespace(List *name, List *argam, const char *newschema)
+AlterOpFamilyNamespace(List *name, char *access_method, const char *newschema)
 {
 	Oid			amOid;
-	char       *access_method = linitial(argam);
 	Relation	rel;
 	Oid			nspOid;
 	Oid			oid;
 
-	Assert(list_length(argam) == 1);
 	amOid = get_am_oid(access_method, false);
 
 	rel = heap_open(OperatorFamilyRelationId, RowExclusiveLock);
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 43e8fdbd724..660947c8f8b 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -6225,7 +6225,7 @@ AlterObjectSchemaStmt:
 					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
 					n->objectType = OBJECT_OPCLASS;
 					n->object = $4;
-					n->objarg = list_make1($6);
+					n->addname = $6;
 					n->newschema = $9;
 					$$ = (Node *)n;
 				}
@@ -6234,7 +6234,7 @@ AlterObjectSchemaStmt:
 					AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
 					n->objectType = OBJECT_OPFAMILY;
 					n->object = $4;
-					n->objarg = list_make1($6);
+					n->addname = $6;
 					n->newschema = $9;
 					$$ = (Node *)n;
 				}
diff --git a/src/include/commands/defrem.h b/src/include/commands/defrem.h
index 3d3e9f959ae..a806f9efcbe 100644
--- a/src/include/commands/defrem.h
+++ b/src/include/commands/defrem.h
@@ -101,11 +101,11 @@ extern void RenameOpClass(List *name, const char *access_method, const char *new
 extern void RenameOpFamily(List *name, const char *access_method, const char *newname);
 extern void AlterOpClassOwner(List *name, const char *access_method, Oid newOwnerId);
 extern void AlterOpClassOwner_oid(Oid opclassOid, Oid newOwnerId);
-extern void AlterOpClassNamespace(List *name, List *argam, const char *newschema);
+extern void AlterOpClassNamespace(List *name, char *access_method, const char *newschema);
 extern void AlterOpFamilyOwner(List *name, const char *access_method, Oid newOwnerId);
 extern void AlterOpFamilyOwner_oid(Oid opfamilyOid, Oid newOwnerId);
 extern Oid get_am_oid(const char *amname, bool missing_ok);
-extern void AlterOpFamilyNamespace(List *name, List *argam, const char *newschema);
+extern void AlterOpFamilyNamespace(List *name, char *access_method, const char *newschema);
 
 /* commands/tsearchcmds.c */
 extern void DefineTSParser(List *names, List *parameters);
-- 
GitLab