Here is a series of patches to do some refactoring in the grammar around the commands COMMENT, DROP, SECURITY LABEL, and ALTER EXTENSION ... ADD/DROP. In the grammar, these commands (with some exceptions) basically just take a reference to an object and later look it up in C code. Some of that was already generalized individually for each command (drop_type_any_name, drop_type_name, etc.). This patch combines it into common lists for all these commands.

Advantages:

- Avoids having to list each object type at least four times.

- Object types not supported by security labels or extensions are now explicitly listed and give a proper error message. Previously, this was just encoded in the grammar itself and specifying a non-supported object type would just give a parse error.

- Reduces lines of code in gram.y.

- Removes some old cruft.

--
Peter Eisentraut              http://www.2ndQuadrant.com/
PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services
From bdd2440c66292eb2464a49fdc57ff5fa86838f0a Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Fri, 10 Apr 2020 11:22:19 +0200
Subject: [PATCH v1 1/6] Remove redundant grammar symbols

access_method, database_name, and index_name are all just name, and
they are not used consistently for their alleged purpose, so remove
them.  They have been around since ancient times but have no current
reason for existing.  Removing them can simplify future grammar
refactoring.
---
 src/backend/parser/gram.y                | 86 +++++++++++-------------
 src/interfaces/ecpg/preproc/ecpg.trailer |  4 +-
 2 files changed, 41 insertions(+), 49 deletions(-)

diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 3c78f2d1b5..378390af5d 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -352,9 +352,9 @@ static Node *makeRecursiveViewSelect(char *relname, List 
*aliases, Node *query);
 %type <chr>            enable_trigger
 
 %type <str>            copy_file_name
-                               database_name access_method_clause 
access_method attr_name
+                               access_method_clause attr_name
                                table_access_method_clause name cursor_name 
file_name
-                               index_name opt_index_name 
cluster_index_specification
+                               opt_index_name cluster_index_specification
 
 %type <list>   func_name handler_name qual_Op qual_all_Op subquery_Op
                                opt_class opt_inline_handler opt_validator 
validator_clause
@@ -1184,7 +1184,7 @@ AlterRoleStmt:
 
 opt_in_database:
                           /* EMPTY */                                  { $$ = 
NULL; }
-                       | IN_P DATABASE database_name   { $$ = $3; }
+                       | IN_P DATABASE name    { $$ = $3; }
                ;
 
 AlterRoleSetStmt:
@@ -3950,7 +3950,7 @@ part_elem: ColId opt_collate opt_class
                ;
 
 table_access_method_clause:
-                       USING access_method                                     
{ $$ = $2; }
+                       USING name                                              
        { $$ = $2; }
                        | /*EMPTY*/                                             
        { $$ = NULL; }
                ;
 
@@ -3975,7 +3975,7 @@ OptConsTableSpace:   USING INDEX TABLESPACE name  { $$ = 
$4; }
                        | /*EMPTY*/                                             
                { $$ = NULL; }
                ;
 
-ExistingIndex:   USING INDEX index_name                                { $$ = 
$3; }
+ExistingIndex:   USING INDEX name                                      { $$ = 
$3; }
                ;
 
 /*****************************************************************************
@@ -4640,7 +4640,7 @@ AlterExtensionContentsStmt:
                                        n->object = (Node *) $6;
                                        $$ = (Node *)n;
                                }
-                       | ALTER EXTENSION name add_drop OPERATOR CLASS any_name 
USING access_method
+                       | ALTER EXTENSION name add_drop OPERATOR CLASS any_name 
USING name
                                {
                                        AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
                                        n->extname = $3;
@@ -4649,7 +4649,7 @@ AlterExtensionContentsStmt:
                                        n->object = (Node *) 
lcons(makeString($9), $7);
                                        $$ = (Node *)n;
                                }
-                       | ALTER EXTENSION name add_drop OPERATOR FAMILY 
any_name USING access_method
+                       | ALTER EXTENSION name add_drop OPERATOR FAMILY 
any_name USING name
                                {
                                        AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
                                        n->extname = $3;
@@ -5992,7 +5992,7 @@ opt_if_not_exists: IF_P NOT EXISTS              { $$ = 
true; }
 
 CreateOpClassStmt:
                        CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P 
Typename
-                       USING access_method opt_opfamily AS opclass_item_list
+                       USING name opt_opfamily AS opclass_item_list
                                {
                                        CreateOpClassStmt *n = 
makeNode(CreateOpClassStmt);
                                        n->opclassname = $4;
@@ -6091,7 +6091,7 @@ opt_recheck:      RECHECK
 
 
 CreateOpFamilyStmt:
-                       CREATE OPERATOR FAMILY any_name USING access_method
+                       CREATE OPERATOR FAMILY any_name USING name
                                {
                                        CreateOpFamilyStmt *n = 
makeNode(CreateOpFamilyStmt);
                                        n->opfamilyname = $4;
@@ -6101,7 +6101,7 @@ CreateOpFamilyStmt:
                ;
 
 AlterOpFamilyStmt:
-                       ALTER OPERATOR FAMILY any_name USING access_method 
ADD_P opclass_item_list
+                       ALTER OPERATOR FAMILY any_name USING name ADD_P 
opclass_item_list
                                {
                                        AlterOpFamilyStmt *n = 
makeNode(AlterOpFamilyStmt);
                                        n->opfamilyname = $4;
@@ -6110,7 +6110,7 @@ AlterOpFamilyStmt:
                                        n->items = $8;
                                        $$ = (Node *) n;
                                }
-                       | ALTER OPERATOR FAMILY any_name USING access_method 
DROP opclass_drop_list
+                       | ALTER OPERATOR FAMILY any_name USING name DROP 
opclass_drop_list
                                {
                                        AlterOpFamilyStmt *n = 
makeNode(AlterOpFamilyStmt);
                                        n->opfamilyname = $4;
@@ -6147,7 +6147,7 @@ opclass_drop:
 
 
 DropOpClassStmt:
-                       DROP OPERATOR CLASS any_name USING access_method 
opt_drop_behavior
+                       DROP OPERATOR CLASS any_name USING name 
opt_drop_behavior
                                {
                                        DropStmt *n = makeNode(DropStmt);
                                        n->objects = 
list_make1(lcons(makeString($6), $4));
@@ -6157,7 +6157,7 @@ DropOpClassStmt:
                                        n->concurrent = false;
                                        $$ = (Node *) n;
                                }
-                       | DROP OPERATOR CLASS IF_P EXISTS any_name USING 
access_method opt_drop_behavior
+                       | DROP OPERATOR CLASS IF_P EXISTS any_name USING name 
opt_drop_behavior
                                {
                                        DropStmt *n = makeNode(DropStmt);
                                        n->objects = 
list_make1(lcons(makeString($8), $6));
@@ -6170,7 +6170,7 @@ DropOpClassStmt:
                ;
 
 DropOpFamilyStmt:
-                       DROP OPERATOR FAMILY any_name USING access_method 
opt_drop_behavior
+                       DROP OPERATOR FAMILY any_name USING name 
opt_drop_behavior
                                {
                                        DropStmt *n = makeNode(DropStmt);
                                        n->objects = 
list_make1(lcons(makeString($6), $4));
@@ -6180,7 +6180,7 @@ DropOpFamilyStmt:
                                        n->concurrent = false;
                                        $$ = (Node *) n;
                                }
-                       | DROP OPERATOR FAMILY IF_P EXISTS any_name USING 
access_method opt_drop_behavior
+                       | DROP OPERATOR FAMILY IF_P EXISTS any_name USING name 
opt_drop_behavior
                                {
                                        DropStmt *n = makeNode(DropStmt);
                                        n->objects = 
list_make1(lcons(makeString($8), $6));
@@ -6587,7 +6587,7 @@ CommentStmt:
                                        n->comment = $8;
                                        $$ = (Node *) n;
                                }
-                       | COMMENT ON OPERATOR CLASS any_name USING 
access_method IS comment_text
+                       | COMMENT ON OPERATOR CLASS any_name USING name IS 
comment_text
                                {
                                        CommentStmt *n = makeNode(CommentStmt);
                                        n->objtype = OBJECT_OPCLASS;
@@ -6595,7 +6595,7 @@ CommentStmt:
                                        n->comment = $9;
                                        $$ = (Node *) n;
                                }
-                       | COMMENT ON OPERATOR FAMILY any_name USING 
access_method IS comment_text
+                       | COMMENT ON OPERATOR FAMILY any_name USING name IS 
comment_text
                                {
                                        CommentStmt *n = makeNode(CommentStmt);
                                        n->objtype = OBJECT_OPFAMILY;
@@ -7437,7 +7437,7 @@ IndexStmt:        CREATE opt_unique INDEX 
opt_concurrently opt_index_name
                                        n->reset_default_tblspc = false;
                                        $$ = (Node *)n;
                                }
-                       | CREATE opt_unique INDEX opt_concurrently IF_P NOT 
EXISTS index_name
+                       | CREATE opt_unique INDEX opt_concurrently IF_P NOT 
EXISTS name
                        ON relation_expr access_method_clause '(' index_params 
')'
                        opt_include opt_reloptions OptTableSpace where_clause
                                {
@@ -7480,12 +7480,12 @@ opt_concurrently:
                ;
 
 opt_index_name:
-                       index_name                                              
                { $$ = $1; }
+                       name                                                    
                { $$ = $1; }
                        | /*EMPTY*/                                             
                { $$ = NULL; }
                ;
 
 access_method_clause:
-                       USING access_method                                     
        { $$ = $2; }
+                       USING name                                              
                { $$ = $2; }
                        | /*EMPTY*/                                             
                { $$ = DEFAULT_INDEX_TYPE; }
                ;
 
@@ -8532,7 +8532,7 @@ RenameStmt: ALTER AGGREGATE aggregate_with_argtypes 
RENAME TO name
                                        n->missing_ok = false;
                                        $$ = (Node *)n;
                                }
-                       | ALTER DATABASE database_name RENAME TO database_name
+                       | ALTER DATABASE name RENAME TO name
                                {
                                        RenameStmt *n = makeNode(RenameStmt);
                                        n->renameType = OBJECT_DATABASE;
@@ -8595,7 +8595,7 @@ RenameStmt: ALTER AGGREGATE aggregate_with_argtypes 
RENAME TO name
                                        n->missing_ok = false;
                                        $$ = (Node *)n;
                                }
-                       | ALTER OPERATOR CLASS any_name USING access_method 
RENAME TO name
+                       | ALTER OPERATOR CLASS any_name USING name RENAME TO 
name
                                {
                                        RenameStmt *n = makeNode(RenameStmt);
                                        n->renameType = OBJECT_OPCLASS;
@@ -8604,7 +8604,7 @@ RenameStmt: ALTER AGGREGATE aggregate_with_argtypes 
RENAME TO name
                                        n->missing_ok = false;
                                        $$ = (Node *)n;
                                }
-                       | ALTER OPERATOR FAMILY any_name USING access_method 
RENAME TO name
+                       | ALTER OPERATOR FAMILY any_name USING name RENAME TO 
name
                                {
                                        RenameStmt *n = makeNode(RenameStmt);
                                        n->renameType = OBJECT_OPFAMILY;
@@ -9184,7 +9184,7 @@ AlterObjectSchemaStmt:
                                        n->missing_ok = false;
                                        $$ = (Node *)n;
                                }
-                       | ALTER OPERATOR CLASS any_name USING access_method SET 
SCHEMA name
+                       | ALTER OPERATOR CLASS any_name USING name SET SCHEMA 
name
                                {
                                        AlterObjectSchemaStmt *n = 
makeNode(AlterObjectSchemaStmt);
                                        n->objectType = OBJECT_OPCLASS;
@@ -9193,7 +9193,7 @@ AlterObjectSchemaStmt:
                                        n->missing_ok = false;
                                        $$ = (Node *)n;
                                }
-                       | ALTER OPERATOR FAMILY any_name USING access_method 
SET SCHEMA name
+                       | ALTER OPERATOR FAMILY any_name USING name SET SCHEMA 
name
                                {
                                        AlterObjectSchemaStmt *n = 
makeNode(AlterObjectSchemaStmt);
                                        n->objectType = OBJECT_OPFAMILY;
@@ -9449,7 +9449,7 @@ AlterOwnerStmt: ALTER AGGREGATE aggregate_with_argtypes 
OWNER TO RoleSpec
                                        n->newowner = $6;
                                        $$ = (Node *)n;
                                }
-                       | ALTER DATABASE database_name OWNER TO RoleSpec
+                       | ALTER DATABASE name OWNER TO RoleSpec
                                {
                                        AlterOwnerStmt *n = 
makeNode(AlterOwnerStmt);
                                        n->objectType = OBJECT_DATABASE;
@@ -9497,7 +9497,7 @@ AlterOwnerStmt: ALTER AGGREGATE aggregate_with_argtypes 
OWNER TO RoleSpec
                                        n->newowner = $6;
                                        $$ = (Node *)n;
                                }
-                       | ALTER OPERATOR CLASS any_name USING access_method 
OWNER TO RoleSpec
+                       | ALTER OPERATOR CLASS any_name USING name OWNER TO 
RoleSpec
                                {
                                        AlterOwnerStmt *n = 
makeNode(AlterOwnerStmt);
                                        n->objectType = OBJECT_OPCLASS;
@@ -9505,7 +9505,7 @@ AlterOwnerStmt: ALTER AGGREGATE aggregate_with_argtypes 
OWNER TO RoleSpec
                                        n->newowner = $9;
                                        $$ = (Node *)n;
                                }
-                       | ALTER OPERATOR FAMILY any_name USING access_method 
OWNER TO RoleSpec
+                       | ALTER OPERATOR FAMILY any_name USING name OWNER TO 
RoleSpec
                                {
                                        AlterOwnerStmt *n = 
makeNode(AlterOwnerStmt);
                                        n->objectType = OBJECT_OPFAMILY;
@@ -10209,7 +10209,7 @@ LoadStmt:       LOAD file_name
  *****************************************************************************/
 
 CreatedbStmt:
-                       CREATE DATABASE database_name opt_with createdb_opt_list
+                       CREATE DATABASE name opt_with createdb_opt_list
                                {
                                        CreatedbStmt *n = 
makeNode(CreatedbStmt);
                                        n->dbname = $3;
@@ -10280,21 +10280,21 @@ opt_equal:    '='                                     
                                        {}
  *****************************************************************************/
 
 AlterDatabaseStmt:
-                       ALTER DATABASE database_name WITH createdb_opt_list
+                       ALTER DATABASE name WITH createdb_opt_list
                                 {
                                        AlterDatabaseStmt *n = 
makeNode(AlterDatabaseStmt);
                                        n->dbname = $3;
                                        n->options = $5;
                                        $$ = (Node *)n;
                                 }
-                       | ALTER DATABASE database_name createdb_opt_list
+                       | ALTER DATABASE name createdb_opt_list
                                 {
                                        AlterDatabaseStmt *n = 
makeNode(AlterDatabaseStmt);
                                        n->dbname = $3;
                                        n->options = $4;
                                        $$ = (Node *)n;
                                 }
-                       | ALTER DATABASE database_name SET TABLESPACE name
+                       | ALTER DATABASE name SET TABLESPACE name
                                 {
                                        AlterDatabaseStmt *n = 
makeNode(AlterDatabaseStmt);
                                        n->dbname = $3;
@@ -10305,7 +10305,7 @@ AlterDatabaseStmt:
                ;
 
 AlterDatabaseSetStmt:
-                       ALTER DATABASE database_name SetResetClause
+                       ALTER DATABASE name SetResetClause
                                {
                                        AlterDatabaseSetStmt *n = 
makeNode(AlterDatabaseSetStmt);
                                        n->dbname = $3;
@@ -10322,7 +10322,7 @@ AlterDatabaseSetStmt:
  * This is implicitly CASCADE, no need for drop behavior
  *****************************************************************************/
 
-DropdbStmt: DROP DATABASE database_name
+DropdbStmt: DROP DATABASE name
                                {
                                        DropdbStmt *n = makeNode(DropdbStmt);
                                        n->dbname = $3;
@@ -10330,7 +10330,7 @@ DropdbStmt: DROP DATABASE database_name
                                        n->options = NULL;
                                        $$ = (Node *)n;
                                }
-                       | DROP DATABASE IF_P EXISTS database_name
+                       | DROP DATABASE IF_P EXISTS name
                                {
                                        DropdbStmt *n = makeNode(DropdbStmt);
                                        n->dbname = $5;
@@ -10338,7 +10338,7 @@ DropdbStmt: DROP DATABASE database_name
                                        n->options = NULL;
                                        $$ = (Node *)n;
                                }
-                       | DROP DATABASE database_name opt_with '(' 
drop_option_list ')'
+                       | DROP DATABASE name opt_with '(' drop_option_list ')'
                                {
                                        DropdbStmt *n = makeNode(DropdbStmt);
                                        n->dbname = $3;
@@ -10346,7 +10346,7 @@ DropdbStmt: DROP DATABASE database_name
                                        n->options = $6;
                                        $$ = (Node *)n;
                                }
-                       | DROP DATABASE IF_P EXISTS database_name opt_with '(' 
drop_option_list ')'
+                       | DROP DATABASE IF_P EXISTS name opt_with '(' 
drop_option_list ')'
                                {
                                        DropdbStmt *n = makeNode(DropdbStmt);
                                        n->dbname = $5;
@@ -10648,7 +10648,7 @@ ClusterStmt:
                                        $$ = (Node*)n;
                                }
                        /* kept for pre-8.3 compatibility */
-                       | CLUSTER opt_verbose index_name ON qualified_name
+                       | CLUSTER opt_verbose name ON qualified_name
                                {
                                        ClusterStmt *n = makeNode(ClusterStmt);
                                        n->relation = $5;
@@ -10661,7 +10661,7 @@ ClusterStmt:
                ;
 
 cluster_index_specification:
-                       USING index_name                { $$ = $2; }
+                       USING name                              { $$ = $2; }
                        | /*EMPTY*/                             { $$ = NULL; }
                ;
 
@@ -14992,16 +14992,8 @@ name_list:     name
 
 name:          ColId                                                           
        { $$ = $1; };
 
-database_name:
-                       ColId                                                   
                { $$ = $1; };
-
-access_method:
-                       ColId                                                   
                { $$ = $1; };
-
 attr_name:     ColLabel                                                        
        { $$ = $1; };
 
-index_name: ColId                                                              
        { $$ = $1; };
-
 file_name:     Sconst                                                          
        { $$ = $1; };
 
 /*
diff --git a/src/interfaces/ecpg/preproc/ecpg.trailer 
b/src/interfaces/ecpg/preproc/ecpg.trailer
index 0dbdfdc122..6ccc8ab916 100644
--- a/src/interfaces/ecpg/preproc/ecpg.trailer
+++ b/src/interfaces/ecpg/preproc/ecpg.trailer
@@ -114,7 +114,7 @@ connection_target: opt_database_name opt_server opt_port
                }
                ;
 
-opt_database_name: database_name               { $$ = $1; }
+opt_database_name: name                                { $$ = $1; }
                | /*EMPTY*/                     { $$ = EMPTY; }
                ;
 
@@ -962,7 +962,7 @@ dis_name: connection_object                 { $$ = $1; }
                | /* EMPTY */                   { $$ = 
mm_strdup("\"CURRENT\""); }
                ;
 
-connection_object: database_name               { $$ = 
make3_str(mm_strdup("\""), $1, mm_strdup("\"")); }
+connection_object: name                                { $$ = 
make3_str(mm_strdup("\""), $1, mm_strdup("\"")); }
                | DEFAULT                       { $$ = 
mm_strdup("\"DEFAULT\""); }
                | char_variable                 { $$ = $1; }
                ;

base-commit: 7966b7980138ebcee7ae986ebcc393aea38a35c0
-- 
2.26.2

From 9bba89f80b15356f43aa02d8bbd05e84fa6d36df Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Mon, 13 Apr 2020 16:16:26 +0200
Subject: [PATCH v1 2/6] Fold AlterForeignTableStmt into AlterTableStmt

All other relation types are handled by AlterTableStmt, so it's
unnecessary to make a different statement for foreign tables.
---
 src/backend/parser/gram.y | 49 +++++++++++++++------------------------
 1 file changed, 19 insertions(+), 30 deletions(-)

diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 378390af5d..f00526e9c6 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -259,7 +259,7 @@ static Node *makeRecursiveViewSelect(char *relname, List 
*aliases, Node *query);
                AlterFdwStmt AlterForeignServerStmt AlterGroupStmt
                AlterObjectDependsStmt AlterObjectSchemaStmt AlterOwnerStmt
                AlterOperatorStmt AlterTypeStmt AlterSeqStmt AlterSystemStmt 
AlterTableStmt
-               AlterTblSpcStmt AlterExtensionStmt AlterExtensionContentsStmt 
AlterForeignTableStmt
+               AlterTblSpcStmt AlterExtensionStmt AlterExtensionContentsStmt
                AlterCompositeTypeStmt AlterUserMappingStmt
                AlterRoleStmt AlterRoleSetStmt AlterPolicyStmt AlterStatsStmt
                AlterDefaultPrivilegesStmt DefACLAction
@@ -851,7 +851,6 @@ stmt :
                        | AlterExtensionContentsStmt
                        | AlterFdwStmt
                        | AlterForeignServerStmt
-                       | AlterForeignTableStmt
                        | AlterFunctionStmt
                        | AlterGroupStmt
                        | AlterObjectDependsStmt
@@ -2027,6 +2026,24 @@ AlterTableStmt:
                                        n->nowait = $14;
                                        $$ = (Node *)n;
                                }
+               |       ALTER FOREIGN TABLE relation_expr alter_table_cmds
+                               {
+                                       AlterTableStmt *n = 
makeNode(AlterTableStmt);
+                                       n->relation = $4;
+                                       n->cmds = $5;
+                                       n->relkind = OBJECT_FOREIGN_TABLE;
+                                       n->missing_ok = false;
+                                       $$ = (Node *)n;
+                               }
+               |       ALTER FOREIGN TABLE IF_P EXISTS relation_expr 
alter_table_cmds
+                               {
+                                       AlterTableStmt *n = 
makeNode(AlterTableStmt);
+                                       n->relation = $6;
+                                       n->cmds = $7;
+                                       n->relkind = OBJECT_FOREIGN_TABLE;
+                                       n->missing_ok = true;
+                                       $$ = (Node *)n;
+                               }
                ;
 
 alter_table_cmds:
@@ -5116,34 +5133,6 @@ CreateForeignTableStmt:
                                }
                ;
 
-/*****************************************************************************
- *
- *             QUERY:
- *             ALTER FOREIGN TABLE relname [...]
- *
- *****************************************************************************/
-
-AlterForeignTableStmt:
-                       ALTER FOREIGN TABLE relation_expr alter_table_cmds
-                               {
-                                       AlterTableStmt *n = 
makeNode(AlterTableStmt);
-                                       n->relation = $4;
-                                       n->cmds = $5;
-                                       n->relkind = OBJECT_FOREIGN_TABLE;
-                                       n->missing_ok = false;
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER FOREIGN TABLE IF_P EXISTS relation_expr 
alter_table_cmds
-                               {
-                                       AlterTableStmt *n = 
makeNode(AlterTableStmt);
-                                       n->relation = $6;
-                                       n->cmds = $7;
-                                       n->relkind = OBJECT_FOREIGN_TABLE;
-                                       n->missing_ok = true;
-                                       $$ = (Node *)n;
-                               }
-               ;
-
 /*****************************************************************************
  *
  *             QUERY:
-- 
2.26.2

From 4d98c30c0ab1d60178e9f050491512b691b94b37 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Sat, 9 May 2020 11:01:31 +0200
Subject: [PATCH v1 3/6] Remove deprecated syntax from CREATE/DROP LANGUAGE

Remove the option to specify the language name as a single-quoted
string.  This has been obsolete since ee8ed85da3b.  Removing it allows
better grammar refactoring.

The syntax of the CREATE FUNCTION LANGUAGE clause is not changed.
---
 doc/src/sgml/ref/create_language.sgml | 5 -----
 doc/src/sgml/ref/drop_language.sgml   | 3 +--
 src/backend/parser/gram.y             | 8 ++++----
 3 files changed, 5 insertions(+), 11 deletions(-)

diff --git a/doc/src/sgml/ref/create_language.sgml 
b/doc/src/sgml/ref/create_language.sgml
index 2243ee6a6c..a457e2558c 100644
--- a/doc/src/sgml/ref/create_language.sgml
+++ b/doc/src/sgml/ref/create_language.sgml
@@ -110,11 +110,6 @@ <title>Parameters</title>
        The name of the new procedural language.
        The name must be unique among the languages in the database.
       </para>
-
-      <para>
-       For backward compatibility, the name can be enclosed by single
-       quotes.
-      </para>
      </listitem>
     </varlistentry>
 
diff --git a/doc/src/sgml/ref/drop_language.sgml 
b/doc/src/sgml/ref/drop_language.sgml
index 976f3a0ce1..4705836ac7 100644
--- a/doc/src/sgml/ref/drop_language.sgml
+++ b/doc/src/sgml/ref/drop_language.sgml
@@ -63,8 +63,7 @@ <title>Parameters</title>
     <term><replaceable class="parameter">name</replaceable></term>
     <listitem>
      <para>
-      The name of an existing procedural language.  For backward
-      compatibility, the name can be enclosed by single quotes.
+      The name of an existing procedural language.
      </para>
     </listitem>
    </varlistentry>
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index f00526e9c6..9af37b2c3d 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -4351,7 +4351,7 @@ NumericOnly_list: NumericOnly                             
                { $$ = list_make1($1); }
  *****************************************************************************/
 
 CreatePLangStmt:
-                       CREATE opt_or_replace opt_trusted opt_procedural 
LANGUAGE NonReservedWord_or_Sconst
+                       CREATE opt_or_replace opt_trusted opt_procedural 
LANGUAGE name
                        {
                                /*
                                 * We now interpret parameterless CREATE 
LANGUAGE as
@@ -4366,7 +4366,7 @@ CreatePLangStmt:
                                n->options = NIL;
                                $$ = (Node *)n;
                        }
-                       | CREATE opt_or_replace opt_trusted opt_procedural 
LANGUAGE NonReservedWord_or_Sconst
+                       | CREATE opt_or_replace opt_trusted opt_procedural 
LANGUAGE name
                          HANDLER handler_name opt_inline_handler opt_validator
                        {
                                CreatePLangStmt *n = makeNode(CreatePLangStmt);
@@ -4410,7 +4410,7 @@ opt_validator:
                ;
 
 DropPLangStmt:
-                       DROP opt_procedural LANGUAGE NonReservedWord_or_Sconst 
opt_drop_behavior
+                       DROP opt_procedural LANGUAGE name opt_drop_behavior
                                {
                                        DropStmt *n = makeNode(DropStmt);
                                        n->removeType = OBJECT_LANGUAGE;
@@ -4420,7 +4420,7 @@ DropPLangStmt:
                                        n->concurrent = false;
                                        $$ = (Node *)n;
                                }
-                       | DROP opt_procedural LANGUAGE IF_P EXISTS 
NonReservedWord_or_Sconst opt_drop_behavior
+                       | DROP opt_procedural LANGUAGE IF_P EXISTS name 
opt_drop_behavior
                                {
                                        DropStmt *n = makeNode(DropStmt);
                                        n->removeType = OBJECT_LANGUAGE;
-- 
2.26.2

From b4fc3fb474741e73530f4a2a33dc94c511dccaae Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Sat, 9 May 2020 11:09:45 +0200
Subject: [PATCH v1 4/6] Refactor DROP LANGUAGE grammar

Fold it into the generic DropStmt.
---
 src/backend/parser/gram.y | 27 ++-------------------------
 1 file changed, 2 insertions(+), 25 deletions(-)

diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 9af37b2c3d..002b3ce01d 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -272,7 +272,7 @@ static Node *makeRecursiveViewSelect(char *relname, List 
*aliases, Node *query);
                CreateAssertionStmt CreateTransformStmt CreateTrigStmt 
CreateEventTrigStmt
                CreateUserStmt CreateUserMappingStmt CreateRoleStmt 
CreatePolicyStmt
                CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt 
DiscardStmt DoStmt
-               DropOpClassStmt DropOpFamilyStmt DropPLangStmt DropStmt
+               DropOpClassStmt DropOpFamilyStmt DropStmt
                DropCastStmt DropRoleStmt
                DropdbStmt DropTableSpaceStmt
                DropTransformStmt
@@ -922,7 +922,6 @@ stmt :
                        | DropOpClassStmt
                        | DropOpFamilyStmt
                        | DropOwnedStmt
-                       | DropPLangStmt
                        | DropStmt
                        | DropSubscriptionStmt
                        | DropTableSpaceStmt
@@ -4409,29 +4408,6 @@ opt_validator:
                        | /*EMPTY*/                                             
                { $$ = NIL; }
                ;
 
-DropPLangStmt:
-                       DROP opt_procedural LANGUAGE name opt_drop_behavior
-                               {
-                                       DropStmt *n = makeNode(DropStmt);
-                                       n->removeType = OBJECT_LANGUAGE;
-                                       n->objects = list_make1(makeString($4));
-                                       n->behavior = $5;
-                                       n->missing_ok = false;
-                                       n->concurrent = false;
-                                       $$ = (Node *)n;
-                               }
-                       | DROP opt_procedural LANGUAGE IF_P EXISTS name 
opt_drop_behavior
-                               {
-                                       DropStmt *n = makeNode(DropStmt);
-                                       n->removeType = OBJECT_LANGUAGE;
-                                       n->objects = list_make1(makeString($6));
-                                       n->behavior = $7;
-                                       n->missing_ok = true;
-                                       n->concurrent = false;
-                                       $$ = (Node *)n;
-                               }
-               ;
-
 opt_procedural:
                        PROCEDURAL                                              
                {}
                        | /*EMPTY*/                                             
                {}
@@ -6364,6 +6340,7 @@ drop_type_name:
                        | EVENT TRIGGER                                         
        { $$ = OBJECT_EVENT_TRIGGER; }
                        | EXTENSION                                             
                { $$ = OBJECT_EXTENSION; }
                        | FOREIGN DATA_P WRAPPER                                
{ $$ = OBJECT_FDW; }
+                       | opt_procedural LANGUAGE                               
{ $$ = OBJECT_LANGUAGE; }
                        | PUBLICATION                                           
        { $$ = OBJECT_PUBLICATION; }
                        | SCHEMA                                                
                { $$ = OBJECT_SCHEMA; }
                        | SERVER                                                
                { $$ = OBJECT_FOREIGN_SERVER; }
-- 
2.26.2

From 7742b326de1e56b0731fcdfc4447a65c5899c8c1 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Fri, 10 Apr 2020 11:02:16 +0200
Subject: [PATCH v1 5/6] Grammar object type refactoring

Unify the grammar of COMMENT, DROP, and SECURITY LABEL further.  They
all effectively just take an object address for later processing, so
we can make the grammar more generalized.  Some extra checking about
which object types are supported can be done later in the statement
execution.
---
 src/backend/commands/seclabel.c |  74 +++++++++++++++
 src/backend/parser/gram.y       | 161 ++++++++++----------------------
 2 files changed, 121 insertions(+), 114 deletions(-)

diff --git a/src/backend/commands/seclabel.c b/src/backend/commands/seclabel.c
index b497c06f1a..ee036e9087 100644
--- a/src/backend/commands/seclabel.c
+++ b/src/backend/commands/seclabel.c
@@ -33,6 +33,75 @@ typedef struct
 
 static List *label_provider_list = NIL;
 
+static bool
+SecLabelSupportsObjectType(ObjectType objtype)
+{
+       switch (objtype)
+       {
+               case OBJECT_AGGREGATE:
+               case OBJECT_COLUMN:
+               case OBJECT_DATABASE:
+               case OBJECT_DOMAIN:
+               case OBJECT_EVENT_TRIGGER:
+               case OBJECT_FOREIGN_TABLE:
+               case OBJECT_FUNCTION:
+               case OBJECT_LANGUAGE:
+               case OBJECT_LARGEOBJECT:
+               case OBJECT_MATVIEW:
+               case OBJECT_PROCEDURE:
+               case OBJECT_PUBLICATION:
+               case OBJECT_ROLE:
+               case OBJECT_ROUTINE:
+               case OBJECT_SCHEMA:
+               case OBJECT_SEQUENCE:
+               case OBJECT_SUBSCRIPTION:
+               case OBJECT_TABLE:
+               case OBJECT_TABLESPACE:
+               case OBJECT_TYPE:
+               case OBJECT_VIEW:
+                       return true;
+
+               case OBJECT_ACCESS_METHOD:
+               case OBJECT_AMOP:
+               case OBJECT_AMPROC:
+               case OBJECT_ATTRIBUTE:
+               case OBJECT_CAST:
+               case OBJECT_COLLATION:
+               case OBJECT_CONVERSION:
+               case OBJECT_DEFAULT:
+               case OBJECT_DEFACL:
+               case OBJECT_DOMCONSTRAINT:
+               case OBJECT_EXTENSION:
+               case OBJECT_FDW:
+               case OBJECT_FOREIGN_SERVER:
+               case OBJECT_INDEX:
+               case OBJECT_OPCLASS:
+               case OBJECT_OPERATOR:
+               case OBJECT_OPFAMILY:
+               case OBJECT_POLICY:
+               case OBJECT_PUBLICATION_REL:
+               case OBJECT_RULE:
+               case OBJECT_STATISTIC_EXT:
+               case OBJECT_TABCONSTRAINT:
+               case OBJECT_TRANSFORM:
+               case OBJECT_TRIGGER:
+               case OBJECT_TSCONFIGURATION:
+               case OBJECT_TSDICTIONARY:
+               case OBJECT_TSPARSER:
+               case OBJECT_TSTEMPLATE:
+               case OBJECT_USER_MAPPING:
+                       return false;
+
+                       /*
+                        * There's intentionally no default: case here; we want 
the
+                        * compiler to warn if a new ObjectType hasn't been 
handled above.
+                        */
+       }
+
+       /* Shouldn't get here, but if we do, say "no support" */
+       return false;
+}
+
 /*
  * ExecSecLabelStmt --
  *
@@ -83,6 +152,11 @@ ExecSecLabelStmt(SecLabelStmt *stmt)
                                                        stmt->provider)));
        }
 
+       if (!SecLabelSupportsObjectType(stmt->objtype))
+               ereport(ERROR,
+                               (errcode(ERRCODE_WRONG_OBJECT_TYPE),
+                                errmsg("security labels are not supported for 
this type of object")));
+
        /*
         * Translate the parser representation which identifies this object into
         * an ObjectAddress. get_object_address() will throw an error if the
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index 002b3ce01d..a1229ebddf 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -463,9 +463,8 @@ static Node *makeRecursiveViewSelect(char *relname, List 
*aliases, Node *query);
 %type <boolean> copy_from opt_program
 
 %type <ival>   opt_column event cursor_options opt_hold opt_set_data
-%type <objtype>        drop_type_any_name drop_type_name 
drop_type_name_on_any_name
-                               comment_type_any_name comment_type_name
-                               security_label_type_any_name 
security_label_type_name
+%type <objtype>        object_type_any_name object_type_name 
object_type_name_on_any_name
+                               drop_type_name
 
 %type <node>   fetch_args select_limit_value
                                offset_clause select_offset_value
@@ -6195,7 +6194,7 @@ ReassignOwnedStmt:
  *
  *****************************************************************************/
 
-DropStmt:      DROP drop_type_any_name IF_P EXISTS any_name_list 
opt_drop_behavior
+DropStmt:      DROP object_type_any_name IF_P EXISTS any_name_list 
opt_drop_behavior
                                {
                                        DropStmt *n = makeNode(DropStmt);
                                        n->removeType = $2;
@@ -6205,7 +6204,7 @@ DropStmt: DROP drop_type_any_name IF_P EXISTS 
any_name_list opt_drop_behavior
                                        n->concurrent = false;
                                        $$ = (Node *)n;
                                }
-                       | DROP drop_type_any_name any_name_list 
opt_drop_behavior
+                       | DROP object_type_any_name any_name_list 
opt_drop_behavior
                                {
                                        DropStmt *n = makeNode(DropStmt);
                                        n->removeType = $2;
@@ -6235,7 +6234,7 @@ DropStmt: DROP drop_type_any_name IF_P EXISTS 
any_name_list opt_drop_behavior
                                        n->concurrent = false;
                                        $$ = (Node *)n;
                                }
-                       | DROP drop_type_name_on_any_name name ON any_name 
opt_drop_behavior
+                       | DROP object_type_name_on_any_name name ON any_name 
opt_drop_behavior
                                {
                                        DropStmt *n = makeNode(DropStmt);
                                        n->removeType = $2;
@@ -6245,7 +6244,7 @@ DropStmt: DROP drop_type_any_name IF_P EXISTS 
any_name_list opt_drop_behavior
                                        n->concurrent = false;
                                        $$ = (Node *) n;
                                }
-                       | DROP drop_type_name_on_any_name IF_P EXISTS name ON 
any_name opt_drop_behavior
+                       | DROP object_type_name_on_any_name IF_P EXISTS name ON 
any_name opt_drop_behavior
                                {
                                        DropStmt *n = makeNode(DropStmt);
                                        n->removeType = $2;
@@ -6317,8 +6316,8 @@ DropStmt: DROP drop_type_any_name IF_P EXISTS 
any_name_list opt_drop_behavior
                                }
                ;
 
-/* object types taking any_name_list */
-drop_type_any_name:
+/* object types taking any_name/any_name_list */
+object_type_any_name:
                        TABLE                                                   
                { $$ = OBJECT_TABLE; }
                        | SEQUENCE                                              
                { $$ = OBJECT_SEQUENCE; }
                        | VIEW                                                  
                { $$ = OBJECT_VIEW; }
@@ -6334,7 +6333,19 @@ drop_type_any_name:
                        | TEXT_P SEARCH CONFIGURATION                   { $$ = 
OBJECT_TSCONFIGURATION; }
                ;
 
-/* object types taking name_list */
+/*
+ * object types taking name/name_list
+ *
+ * DROP handles some of them separately
+ */
+
+object_type_name:
+                       drop_type_name                                          
        { $$ = $1; }
+                       | DATABASE                                              
                { $$ = OBJECT_DATABASE; }
+                       | ROLE                                                  
                { $$ = OBJECT_ROLE; }
+                       | SUBSCRIPTION                                          
        { $$ = OBJECT_SUBSCRIPTION; }
+                       | TABLESPACE                                            
        { $$ = OBJECT_TABLESPACE; }
+               ;
 drop_type_name:
                        ACCESS METHOD                                           
        { $$ = OBJECT_ACCESS_METHOD; }
                        | EVENT TRIGGER                                         
        { $$ = OBJECT_EVENT_TRIGGER; }
@@ -6347,7 +6358,7 @@ drop_type_name:
                ;
 
 /* object types attached to a table */
-drop_type_name_on_any_name:
+object_type_name_on_any_name:
                        POLICY                                                  
                { $$ = OBJECT_POLICY; }
                        | RULE                                                  
                { $$ = OBJECT_RULE; }
                        | TRIGGER                                               
                { $$ = OBJECT_TRIGGER; }
@@ -6399,36 +6410,12 @@ opt_restart_seqs:
 
 /*****************************************************************************
  *
- *     The COMMENT ON statement can take different forms based upon the type of
- *     the object associated with the comment. The form of the statement is:
- *
- *     COMMENT ON [ [ ACCESS METHOD | CONVERSION | COLLATION |
- *                 DATABASE | DOMAIN |
- *                 EXTENSION | EVENT TRIGGER | FOREIGN DATA WRAPPER |
- *                 FOREIGN TABLE | INDEX | [PROCEDURAL] LANGUAGE |
- *                 MATERIALIZED VIEW | POLICY | ROLE | SCHEMA | SEQUENCE |
- *                 SERVER | STATISTICS | TABLE | TABLESPACE |
- *                 TEXT SEARCH CONFIGURATION | TEXT SEARCH DICTIONARY |
- *                 TEXT SEARCH PARSER | TEXT SEARCH TEMPLATE | TYPE |
- *                 VIEW] <objname> |
- *                              AGGREGATE <aggname> (arg1, ...) |
- *                              CAST (<src type> AS <dst type>) |
- *                              COLUMN <relname>.<colname> |
- *                              CONSTRAINT <constraintname> ON <relname> |
- *                              CONSTRAINT <constraintname> ON DOMAIN 
<domainname> |
- *                              FUNCTION <funcname> (arg1, arg2, ...) |
- *                              LARGE OBJECT <oid> |
- *                              OPERATOR <op> (leftoperand_typ, 
rightoperand_typ) |
- *                              OPERATOR CLASS <name> USING <access-method> |
- *                              OPERATOR FAMILY <name> USING <access-method> |
- *                              RULE <rulename> ON <relname> |
- *                              TRIGGER <triggername> ON <relname> ]
- *                        IS { 'text' | NULL }
+ * COMMENT ON <object> IS <text>
  *
  *****************************************************************************/
 
 CommentStmt:
-                       COMMENT ON comment_type_any_name any_name IS 
comment_text
+                       COMMENT ON object_type_any_name any_name IS comment_text
                                {
                                        CommentStmt *n = makeNode(CommentStmt);
                                        n->objtype = $3;
@@ -6436,7 +6423,15 @@ CommentStmt:
                                        n->comment = $6;
                                        $$ = (Node *) n;
                                }
-                       | COMMENT ON comment_type_name name IS comment_text
+                       | COMMENT ON COLUMN any_name IS comment_text
+                               {
+                                       CommentStmt *n = makeNode(CommentStmt);
+                                       n->objtype = OBJECT_COLUMN;
+                                       n->object = (Node *) $4;
+                                       n->comment = $6;
+                                       $$ = (Node *) n;
+                               }
+                       | COMMENT ON object_type_name name IS comment_text
                                {
                                        CommentStmt *n = makeNode(CommentStmt);
                                        n->objtype = $3;
@@ -6505,10 +6500,10 @@ CommentStmt:
                                        n->comment = $9;
                                        $$ = (Node *) n;
                                }
-                       | COMMENT ON POLICY name ON any_name IS comment_text
+                       | COMMENT ON object_type_name_on_any_name name ON 
any_name IS comment_text
                                {
                                        CommentStmt *n = makeNode(CommentStmt);
-                                       n->objtype = OBJECT_POLICY;
+                                       n->objtype = $3;
                                        n->object = (Node *) lappend($6, 
makeString($4));
                                        n->comment = $8;
                                        $$ = (Node *) n;
@@ -6529,14 +6524,6 @@ CommentStmt:
                                        n->comment = $6;
                                        $$ = (Node *) n;
                                }
-                       | COMMENT ON RULE name ON any_name IS comment_text
-                               {
-                                       CommentStmt *n = makeNode(CommentStmt);
-                                       n->objtype = OBJECT_RULE;
-                                       n->object = (Node *) lappend($6, 
makeString($4));
-                                       n->comment = $8;
-                                       $$ = (Node *) n;
-                               }
                        | COMMENT ON TRANSFORM FOR Typename LANGUAGE name IS 
comment_text
                                {
                                        CommentStmt *n = makeNode(CommentStmt);
@@ -6545,14 +6532,6 @@ CommentStmt:
                                        n->comment = $9;
                                        $$ = (Node *) n;
                                }
-                       | COMMENT ON TRIGGER name ON any_name IS comment_text
-                               {
-                                       CommentStmt *n = makeNode(CommentStmt);
-                                       n->objtype = OBJECT_TRIGGER;
-                                       n->object = (Node *) lappend($6, 
makeString($4));
-                                       n->comment = $8;
-                                       $$ = (Node *) n;
-                               }
                        | COMMENT ON OPERATOR CLASS any_name USING name IS 
comment_text
                                {
                                        CommentStmt *n = makeNode(CommentStmt);
@@ -6587,40 +6566,6 @@ CommentStmt:
                                }
                ;
 
-/* object types taking any_name */
-comment_type_any_name:
-                       COLUMN                                                  
        { $$ = OBJECT_COLUMN; }
-                       | INDEX                                                 
        { $$ = OBJECT_INDEX; }
-                       | SEQUENCE                                              
        { $$ = OBJECT_SEQUENCE; }
-                       | STATISTICS                                            
{ $$ = OBJECT_STATISTIC_EXT; }
-                       | TABLE                                                 
        { $$ = OBJECT_TABLE; }
-                       | VIEW                                                  
        { $$ = OBJECT_VIEW; }
-                       | MATERIALIZED VIEW                                     
{ $$ = OBJECT_MATVIEW; }
-                       | COLLATION                                             
        { $$ = OBJECT_COLLATION; }
-                       | CONVERSION_P                                          
{ $$ = OBJECT_CONVERSION; }
-                       | FOREIGN TABLE                                         
{ $$ = OBJECT_FOREIGN_TABLE; }
-                       | TEXT_P SEARCH CONFIGURATION           { $$ = 
OBJECT_TSCONFIGURATION; }
-                       | TEXT_P SEARCH DICTIONARY                      { $$ = 
OBJECT_TSDICTIONARY; }
-                       | TEXT_P SEARCH PARSER                          { $$ = 
OBJECT_TSPARSER; }
-                       | TEXT_P SEARCH TEMPLATE                        { $$ = 
OBJECT_TSTEMPLATE; }
-               ;
-
-/* object types taking name */
-comment_type_name:
-                       ACCESS METHOD                                           
{ $$ = OBJECT_ACCESS_METHOD; }
-                       | DATABASE                                              
        { $$ = OBJECT_DATABASE; }
-                       | EVENT TRIGGER                                         
{ $$ = OBJECT_EVENT_TRIGGER; }
-                       | EXTENSION                                             
        { $$ = OBJECT_EXTENSION; }
-                       | FOREIGN DATA_P WRAPPER                        { $$ = 
OBJECT_FDW; }
-                       | opt_procedural LANGUAGE                       { $$ = 
OBJECT_LANGUAGE; }
-                       | PUBLICATION                                           
{ $$ = OBJECT_PUBLICATION; }
-                       | ROLE                                                  
        { $$ = OBJECT_ROLE; }
-                       | SCHEMA                                                
        { $$ = OBJECT_SCHEMA; }
-                       | SERVER                                                
        { $$ = OBJECT_FOREIGN_SERVER; }
-                       | SUBSCRIPTION                                          
{ $$ = OBJECT_SUBSCRIPTION; }
-                       | TABLESPACE                                            
{ $$ = OBJECT_TABLESPACE; }
-               ;
-
 comment_text:
                        Sconst                                                  
        { $$ = $1; }
                        | NULL_P                                                
        { $$ = NULL; }
@@ -6637,7 +6582,7 @@ comment_text:
  *****************************************************************************/
 
 SecLabelStmt:
-                       SECURITY LABEL opt_provider ON 
security_label_type_any_name any_name
+                       SECURITY LABEL opt_provider ON object_type_any_name 
any_name
                        IS security_label
                                {
                                        SecLabelStmt *n = 
makeNode(SecLabelStmt);
@@ -6647,7 +6592,17 @@ SecLabelStmt:
                                        n->label = $8;
                                        $$ = (Node *) n;
                                }
-                       | SECURITY LABEL opt_provider ON 
security_label_type_name name
+                       | SECURITY LABEL opt_provider ON COLUMN any_name
+                         IS security_label
+                               {
+                                       SecLabelStmt *n = 
makeNode(SecLabelStmt);
+                                       n->provider = $3;
+                                       n->objtype = OBJECT_COLUMN;
+                                       n->object = (Node *) $6;
+                                       n->label = $8;
+                                       $$ = (Node *) n;
+                               }
+                       | SECURITY LABEL opt_provider ON object_type_name name
                          IS security_label
                                {
                                        SecLabelStmt *n = 
makeNode(SecLabelStmt);
@@ -6733,28 +6688,6 @@ opt_provider:    FOR NonReservedWord_or_Sconst   { $$ = 
$2; }
                                | /* empty */                                   
{ $$ = NULL; }
                ;
 
-/* object types taking any_name */
-security_label_type_any_name:
-                       COLUMN                                                  
        { $$ = OBJECT_COLUMN; }
-                       | FOREIGN TABLE                                         
{ $$ = OBJECT_FOREIGN_TABLE; }
-                       | SEQUENCE                                              
        { $$ = OBJECT_SEQUENCE; }
-                       | TABLE                                                 
        { $$ = OBJECT_TABLE; }
-                       | VIEW                                                  
        { $$ = OBJECT_VIEW; }
-                       | MATERIALIZED VIEW                                     
{ $$ = OBJECT_MATVIEW; }
-               ;
-
-/* object types taking name */
-security_label_type_name:
-                       DATABASE                                                
        { $$ = OBJECT_DATABASE; }
-                       | EVENT TRIGGER                                         
{ $$ = OBJECT_EVENT_TRIGGER; }
-                       | opt_procedural LANGUAGE                       { $$ = 
OBJECT_LANGUAGE; }
-                       | PUBLICATION                                           
{ $$ = OBJECT_PUBLICATION; }
-                       | ROLE                                                  
        { $$ = OBJECT_ROLE; }
-                       | SCHEMA                                                
        { $$ = OBJECT_SCHEMA; }
-                       | SUBSCRIPTION                                          
{ $$ = OBJECT_SUBSCRIPTION; }
-                       | TABLESPACE                                            
{ $$ = OBJECT_TABLESPACE; }
-               ;
-
 security_label:        Sconst                          { $$ = $1; }
                                | NULL_P                        { $$ = NULL; }
                ;
-- 
2.26.2

From 4360cec037c868301c82dbbc244fa8b3c8b22615 Mon Sep 17 00:00:00 2001
From: Peter Eisentraut <pe...@eisentraut.org>
Date: Mon, 13 Apr 2020 18:35:20 +0200
Subject: [PATCH v1 6/6] Refactor AlterExtensionContentsStmt grammar

Make use of the general object support already used by COMMENT, DROP,
and SECURITY LABEL.
---
 src/backend/commands/extension.c              |  19 +++
 src/backend/parser/gram.y                     | 157 ++----------------
 .../test_pg_dump/expected/test_pg_dump.out    |   4 +-
 3 files changed, 31 insertions(+), 149 deletions(-)

diff --git a/src/backend/commands/extension.c b/src/backend/commands/extension.c
index 9b669d95b8..472e69fdaf 100644
--- a/src/backend/commands/extension.c
+++ b/src/backend/commands/extension.c
@@ -3269,6 +3269,25 @@ 
ExecAlterExtensionContentsStmt(AlterExtensionContentsStmt *stmt,
        Relation        relation;
        Oid                     oldExtension;
 
+       switch (stmt->objtype)
+       {
+               case OBJECT_DATABASE:
+               case OBJECT_EXTENSION:
+               case OBJECT_INDEX:
+               case OBJECT_PUBLICATION:
+               case OBJECT_ROLE:
+               case OBJECT_STATISTIC_EXT:
+               case OBJECT_SUBSCRIPTION:
+               case OBJECT_TABLESPACE:
+                       ereport(ERROR,
+                               (errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
+                                errmsg("cannot add an object of this type to 
an extension")));
+                       break;
+               default:
+                       /* OK */
+                       break;
+       }
+
        extension.classId = ExtensionRelationId;
        extension.objectId = get_extension_oid(stmt->extname, false);
        extension.objectSubId = 0;
diff --git a/src/backend/parser/gram.y b/src/backend/parser/gram.y
index a1229ebddf..8fb7c24a4e 100644
--- a/src/backend/parser/gram.y
+++ b/src/backend/parser/gram.y
@@ -4551,50 +4551,41 @@ alter_extension_opt_item:
  *****************************************************************************/
 
 AlterExtensionContentsStmt:
-                       ALTER EXTENSION name add_drop ACCESS METHOD name
+                       ALTER EXTENSION name add_drop object_type_name name
                                {
                                        AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
                                        n->extname = $3;
                                        n->action = $4;
-                                       n->objtype = OBJECT_ACCESS_METHOD;
-                                       n->object = (Node *) makeString($7);
+                                       n->objtype = $5;
+                                       n->object = (Node *) makeString($6);
                                        $$ = (Node *)n;
                                }
-                       | ALTER EXTENSION name add_drop AGGREGATE 
aggregate_with_argtypes
+                       | ALTER EXTENSION name add_drop object_type_any_name 
any_name
                                {
                                        AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
                                        n->extname = $3;
                                        n->action = $4;
-                                       n->objtype = OBJECT_AGGREGATE;
+                                       n->objtype = $5;
                                        n->object = (Node *) $6;
                                        $$ = (Node *)n;
                                }
-                       | ALTER EXTENSION name add_drop CAST '(' Typename AS 
Typename ')'
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_CAST;
-                                       n->object = (Node *) list_make2($7, $9);
-                                       $$ = (Node *) n;
-                               }
-                       | ALTER EXTENSION name add_drop COLLATION any_name
+                       | ALTER EXTENSION name add_drop AGGREGATE 
aggregate_with_argtypes
                                {
                                        AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
                                        n->extname = $3;
                                        n->action = $4;
-                                       n->objtype = OBJECT_COLLATION;
+                                       n->objtype = OBJECT_AGGREGATE;
                                        n->object = (Node *) $6;
                                        $$ = (Node *)n;
                                }
-                       | ALTER EXTENSION name add_drop CONVERSION_P any_name
+                       | ALTER EXTENSION name add_drop CAST '(' Typename AS 
Typename ')'
                                {
                                        AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
                                        n->extname = $3;
                                        n->action = $4;
-                                       n->objtype = OBJECT_CONVERSION;
-                                       n->object = (Node *) $6;
-                                       $$ = (Node *)n;
+                                       n->objtype = OBJECT_CAST;
+                                       n->object = (Node *) list_make2($7, $9);
+                                       $$ = (Node *) n;
                                }
                        | ALTER EXTENSION name add_drop DOMAIN_P Typename
                                {
@@ -4614,15 +4605,6 @@ AlterExtensionContentsStmt:
                                        n->object = (Node *) $6;
                                        $$ = (Node *)n;
                                }
-                       | ALTER EXTENSION name add_drop opt_procedural LANGUAGE 
name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_LANGUAGE;
-                                       n->object = (Node *) makeString($7);
-                                       $$ = (Node *)n;
-                               }
                        | ALTER EXTENSION name add_drop OPERATOR 
operator_with_argtypes
                                {
                                        AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
@@ -4668,123 +4650,6 @@ AlterExtensionContentsStmt:
                                        n->object = (Node *) $6;
                                        $$ = (Node *)n;
                                }
-                       | ALTER EXTENSION name add_drop SCHEMA name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_SCHEMA;
-                                       n->object = (Node *) makeString($6);
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop EVENT TRIGGER name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_EVENT_TRIGGER;
-                                       n->object = (Node *) makeString($7);
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop TABLE any_name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_TABLE;
-                                       n->object = (Node *) $6;
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop TEXT_P SEARCH PARSER 
any_name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_TSPARSER;
-                                       n->object = (Node *) $8;
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop TEXT_P SEARCH 
DICTIONARY any_name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_TSDICTIONARY;
-                                       n->object = (Node *) $8;
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop TEXT_P SEARCH TEMPLATE 
any_name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_TSTEMPLATE;
-                                       n->object = (Node *) $8;
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop TEXT_P SEARCH 
CONFIGURATION any_name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_TSCONFIGURATION;
-                                       n->object = (Node *) $8;
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop SEQUENCE any_name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_SEQUENCE;
-                                       n->object = (Node *) $6;
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop VIEW any_name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_VIEW;
-                                       n->object = (Node *) $6;
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop MATERIALIZED VIEW 
any_name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_MATVIEW;
-                                       n->object = (Node *) $7;
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop FOREIGN TABLE any_name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_FOREIGN_TABLE;
-                                       n->object = (Node *) $7;
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop FOREIGN DATA_P WRAPPER 
name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_FDW;
-                                       n->object = (Node *) makeString($8);
-                                       $$ = (Node *)n;
-                               }
-                       | ALTER EXTENSION name add_drop SERVER name
-                               {
-                                       AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
-                                       n->extname = $3;
-                                       n->action = $4;
-                                       n->objtype = OBJECT_FOREIGN_SERVER;
-                                       n->object = (Node *) makeString($6);
-                                       $$ = (Node *)n;
-                               }
                        | ALTER EXTENSION name add_drop TRANSFORM FOR Typename 
LANGUAGE name
                                {
                                        AlterExtensionContentsStmt *n = 
makeNode(AlterExtensionContentsStmt);
diff --git a/src/test/modules/test_pg_dump/expected/test_pg_dump.out 
b/src/test/modules/test_pg_dump/expected/test_pg_dump.out
index a50eaf6125..f14f3a6664 100644
--- a/src/test/modules/test_pg_dump/expected/test_pg_dump.out
+++ b/src/test/modules/test_pg_dump/expected/test_pg_dump.out
@@ -1,9 +1,7 @@
 CREATE ROLE regress_dump_test_role;
 CREATE EXTENSION test_pg_dump;
 ALTER EXTENSION test_pg_dump ADD DATABASE postgres; -- error
-ERROR:  syntax error at or near "DATABASE"
-LINE 1: ALTER EXTENSION test_pg_dump ADD DATABASE postgres;
-                                         ^
+ERROR:  cannot add an object of this type to an extension
 CREATE TABLE test_pg_dump_t1 (c1 int, junk text);
 ALTER TABLE test_pg_dump_t1 DROP COLUMN junk;  -- to exercise dropped-col cases
 CREATE VIEW test_pg_dump_v1 AS SELECT * FROM test_pg_dump_t1;
-- 
2.26.2

Reply via email to