From 75af5ae9c017d70531bd49178adfd3103cd40a76 Mon Sep 17 00:00:00 2001
From: Tom Lane <tgl@sss.pgh.pa.us>
Date: Thu, 8 Nov 2012 11:34:32 -0500
Subject: [PATCH] Don't trash input list structure in
 does_not_exist_skipping().

The trigger and rule cases need to split up the input name list, but
they mustn't corrupt the passed-in data structure, since it could be part
of a cached utility-statement parsetree.  Per bug #7641.
---
 src/backend/commands/dropcmds.c | 4 ++--
 1 file changed, 2 insertions(+), 2 deletions(-)

diff --git a/src/backend/commands/dropcmds.c b/src/backend/commands/dropcmds.c
index 25c127b252a..e4c17bd2bc7 100644
--- a/src/backend/commands/dropcmds.c
+++ b/src/backend/commands/dropcmds.c
@@ -203,7 +203,7 @@ does_not_exist_skipping(ObjectType objtype, List *objname, List *objargs)
 		case OBJECT_TRIGGER:
 			msg = gettext_noop("trigger \"%s\" for table \"%s\" does not exist, skipping");
 			name = strVal(llast(objname));
-			args = NameListToString(list_truncate(objname,
+			args = NameListToString(list_truncate(list_copy(objname),
 												  list_length(objname) - 1));
 			break;
 		case OBJECT_EVENT_TRIGGER:
@@ -213,7 +213,7 @@ does_not_exist_skipping(ObjectType objtype, List *objname, List *objargs)
 		case OBJECT_RULE:
 			msg = gettext_noop("rule \"%s\" for relation \"%s\" does not exist, skipping");
 			name = strVal(llast(objname));
-			args = NameListToString(list_truncate(objname,
+			args = NameListToString(list_truncate(list_copy(objname),
 												  list_length(objname) - 1));
 			break;
 		case OBJECT_FDW:
-- 
GitLab