>From 0fdc0f660b1f57c82f7dc99e33f0a42949b91f50 Mon Sep 17 00:00:00 2001
From: Daniel Gustafsson <daniel@yesql.se>
Date: Wed, 29 Mar 2017 16:38:50 +0200
Subject: [PATCH] Prohibit multiple TO in ALTER EXTENSION UPDATE in parser

Since ALTER EXTENSION .. UPDATE TO x TO y; is a syntax error,
disallow from this already in the parser rather than deferring
to the command processing.
---
 src/backend/commands/extension.c |  7 -------
 src/backend/parser/gram.y        | 14 +++++---------
 2 files changed, 5 insertions(+), 16 deletions(-)

diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c
index 5a84bed..6e3410a 100644
--- a/src/backend/commands/extension.c
+++ b/src/backend/commands/extension.c
@@ -2935,14 +2935,7 @@ ExecAlterExtensionStmt(ParseState *pstate, AlterExtensionStmt *stmt)
 		DefElem    *defel = (DefElem *) lfirst(lc);
 
 		if (strcmp(defel->defname, "new_version") == 0)
-		{
-			if (d_new_version)
-				ereport(ERROR,
-						(errcode(ERRCODE_SYNTAX_ERROR),
-						 errmsg("conflicting or redundant options"),
-						 parser_errposition(pstate, defel->location)));
 			d_new_version = defel;
-		}
 		else
 			elog(ERROR, "unrecognized option: %s", defel->defname);
 	}
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 9d53a29..77bf99b 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -300,7 +300,7 @@ static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
 				create_extension_opt_list alter_extension_opt_list
 %type <defelt>	createdb_opt_item copy_opt_item
 				transaction_mode_item
-				create_extension_opt_item alter_extension_opt_item
+				create_extension_opt_item
 
 %type <ival>	opt_lock lock_type cast_context
 %type <ival>	vacuum_option_list vacuum_option_elem
@@ -4251,17 +4251,13 @@ AlterExtensionStmt: ALTER EXTENSION name UPDATE alter_extension_opt_list
 		;
 
 alter_extension_opt_list:
-			alter_extension_opt_list alter_extension_opt_item
-				{ $$ = lappend($1, $2); }
-			| /* EMPTY */
-				{ $$ = NIL; }
-		;
-
-alter_extension_opt_item:
 			TO NonReservedWord_or_Sconst
 				{
-					$$ = makeDefElem("new_version", (Node *)makeString($2), @1);
+					$$ = list_make1(makeDefElem("new_version",
+									(Node *) makeString($2), @1));
 				}
+			| /* EMPTY */
+				{ $$ = NIL; }
 		;
 
 /*****************************************************************************
-- 
2.6.4 (Apple Git-63)

