LCOV - differential code coverage report
Current view: top level - src/backend/parser - gram.y (source / functions) Coverage Total Hit UNC LBC UBC GBC GNC CBC EUB ECB DUB DCB
Current: Differential Code Coverage 16@8cea358b128 vs 17@8cea358b128 Lines: 90.0 % 7357 6622 20 1 714 5 304 6313 3 15 5 44
Current Date: 2024-04-14 14:21:10 Functions: 100.0 % 41 41 1 40 1
Baseline: 16@8cea358b128 Branches: 60.9 % 704 429 5 270 17 412
Baseline Date: 2024-04-14 14:21:09 Line coverage date bins:
Legend: Lines: hit not hit | Branches: + taken - not taken # not executed [..60] days: 97.3 % 224 218 6 214 4
(60,120] days: 95.5 % 22 21 1 21
(120,180] days: 100.0 % 15 15 15
(180,240] days: 87.0 % 23 20 3 20
(240..) days: 89.7 % 7073 6348 10 1 714 5 34 6309 3 15
Function coverage date bins:
(240..) days: 100.0 % 41 41 1 40
Branch coverage date bins:
[..60] days: 80.0 % 10 8 2 8
(60,120] days: 100.0 % 2 2 2
(120,180] days: 87.5 % 8 7 1 7
(180,240] days: 0.0 % 2 0 2
(240..) days: 60.4 % 682 412 270 412

 Age         Owner                    Branch data    TLA  Line data    Source code
                                  1                 :                : %{
                                  2                 :                : 
                                  3                 :                : /*#define YYDEBUG 1*/
                                  4                 :                : /*-------------------------------------------------------------------------
                                  5                 :                :  *
                                  6                 :                :  * gram.y
                                  7                 :                :  *    POSTGRESQL BISON rules/actions
                                  8                 :                :  *
                                  9                 :                :  * Portions Copyright (c) 1996-2024, PostgreSQL Global Development Group
                                 10                 :                :  * Portions Copyright (c) 1994, Regents of the University of California
                                 11                 :                :  *
                                 12                 :                :  *
                                 13                 :                :  * IDENTIFICATION
                                 14                 :                :  *    src/backend/parser/gram.y
                                 15                 :                :  *
                                 16                 :                :  * HISTORY
                                 17                 :                :  *    AUTHOR            DATE            MAJOR EVENT
                                 18                 :                :  *    Andrew Yu         Sept, 1994      POSTQUEL to SQL conversion
                                 19                 :                :  *    Andrew Yu         Oct, 1994       lispy code conversion
                                 20                 :                :  *
                                 21                 :                :  * NOTES
                                 22                 :                :  *    CAPITALS are used to represent terminal symbols.
                                 23                 :                :  *    non-capitals are used to represent non-terminals.
                                 24                 :                :  *
                                 25                 :                :  *    In general, nothing in this file should initiate database accesses
                                 26                 :                :  *    nor depend on changeable state (such as SET variables).  If you do
                                 27                 :                :  *    database accesses, your code will fail when we have aborted the
                                 28                 :                :  *    current transaction and are just parsing commands to find the next
                                 29                 :                :  *    ROLLBACK or COMMIT.  If you make use of SET variables, then you
                                 30                 :                :  *    will do the wrong thing in multi-query strings like this:
                                 31                 :                :  *          SET constraint_exclusion TO off; SELECT * FROM foo;
                                 32                 :                :  *    because the entire string is parsed by gram.y before the SET gets
                                 33                 :                :  *    executed.  Anything that depends on the database or changeable state
                                 34                 :                :  *    should be handled during parse analysis so that it happens at the
                                 35                 :                :  *    right time not the wrong time.
                                 36                 :                :  *
                                 37                 :                :  * WARNINGS
                                 38                 :                :  *    If you use a list, make sure the datum is a node so that the printing
                                 39                 :                :  *    routines work.
                                 40                 :                :  *
                                 41                 :                :  *    Sometimes we assign constants to makeStrings. Make sure we don't free
                                 42                 :                :  *    those.
                                 43                 :                :  *
                                 44                 :                :  *-------------------------------------------------------------------------
                                 45                 :                :  */
                                 46                 :                : #include "postgres.h"
                                 47                 :                : 
                                 48                 :                : #include <ctype.h>
                                 49                 :                : #include <limits.h>
                                 50                 :                : 
                                 51                 :                : #include "access/tableam.h"
                                 52                 :                : #include "catalog/index.h"
                                 53                 :                : #include "catalog/namespace.h"
                                 54                 :                : #include "catalog/pg_am.h"
                                 55                 :                : #include "catalog/pg_trigger.h"
                                 56                 :                : #include "commands/defrem.h"
                                 57                 :                : #include "commands/trigger.h"
                                 58                 :                : #include "gramparse.h"
                                 59                 :                : #include "nodes/makefuncs.h"
                                 60                 :                : #include "nodes/nodeFuncs.h"
                                 61                 :                : #include "parser/parser.h"
                                 62                 :                : #include "storage/lmgr.h"
                                 63                 :                : #include "utils/date.h"
                                 64                 :                : #include "utils/datetime.h"
                                 65                 :                : #include "utils/numeric.h"
                                 66                 :                : #include "utils/xml.h"
                                 67                 :                : 
                                 68                 :                : 
                                 69                 :                : /*
                                 70                 :                :  * Location tracking support --- simpler than bison's default, since we only
                                 71                 :                :  * want to track the start position not the end position of each nonterminal.
                                 72                 :                :  */
                                 73                 :                : #define YYLLOC_DEFAULT(Current, Rhs, N) \
                                 74                 :                :     do { \
                                 75                 :                :         if ((N) > 0) \
                                 76                 :                :             (Current) = (Rhs)[1]; \
                                 77                 :                :         else \
                                 78                 :                :             (Current) = (-1); \
                                 79                 :                :     } while (0)
                                 80                 :                : 
                                 81                 :                : /*
                                 82                 :                :  * The above macro assigns -1 (unknown) as the parse location of any
                                 83                 :                :  * nonterminal that was reduced from an empty rule, or whose leftmost
                                 84                 :                :  * component was reduced from an empty rule.  This is problematic
                                 85                 :                :  * for nonterminals defined like
                                 86                 :                :  *      OptFooList: / * EMPTY * / { ... } | OptFooList Foo { ... } ;
                                 87                 :                :  * because we'll set -1 as the location during the first reduction and then
                                 88                 :                :  * copy it during each subsequent reduction, leaving us with -1 for the
                                 89                 :                :  * location even when the list is not empty.  To fix that, do this in the
                                 90                 :                :  * action for the nonempty rule(s):
                                 91                 :                :  *      if (@$ < 0) @$ = @2;
                                 92                 :                :  * (Although we have many nonterminals that follow this pattern, we only
                                 93                 :                :  * bother with fixing @$ like this when the nonterminal's parse location
                                 94                 :                :  * is actually referenced in some rule.)
                                 95                 :                :  *
                                 96                 :                :  * A cleaner answer would be to make YYLLOC_DEFAULT scan all the Rhs
                                 97                 :                :  * locations until it's found one that's not -1.  Then we'd get a correct
                                 98                 :                :  * location for any nonterminal that isn't entirely empty.  But this way
                                 99                 :                :  * would add overhead to every rule reduction, and so far there's not been
                                100                 :                :  * a compelling reason to pay that overhead.
                                101                 :                :  */
                                102                 :                : 
                                103                 :                : /*
                                104                 :                :  * Bison doesn't allocate anything that needs to live across parser calls,
                                105                 :                :  * so we can easily have it use palloc instead of malloc.  This prevents
                                106                 :                :  * memory leaks if we error out during parsing.
                                107                 :                :  */
                                108                 :                : #define YYMALLOC palloc
                                109                 :                : #define YYFREE   pfree
                                110                 :                : 
                                111                 :                : /* Private struct for the result of privilege_target production */
                                112                 :                : typedef struct PrivTarget
                                113                 :                : {
                                114                 :                :     GrantTargetType targtype;
                                115                 :                :     ObjectType  objtype;
                                116                 :                :     List       *objs;
                                117                 :                : } PrivTarget;
                                118                 :                : 
                                119                 :                : /* Private struct for the result of import_qualification production */
                                120                 :                : typedef struct ImportQual
                                121                 :                : {
                                122                 :                :     ImportForeignSchemaType type;
                                123                 :                :     List       *table_names;
                                124                 :                : } ImportQual;
                                125                 :                : 
                                126                 :                : /* Private struct for the result of opt_select_limit production */
                                127                 :                : typedef struct SelectLimit
                                128                 :                : {
                                129                 :                :     Node       *limitOffset;
                                130                 :                :     Node       *limitCount;
                                131                 :                :     LimitOption limitOption;
                                132                 :                : } SelectLimit;
                                133                 :                : 
                                134                 :                : /* Private struct for the result of group_clause production */
                                135                 :                : typedef struct GroupClause
                                136                 :                : {
                                137                 :                :     bool        distinct;
                                138                 :                :     List       *list;
                                139                 :                : } GroupClause;
                                140                 :                : 
                                141                 :                : /* Private structs for the result of key_actions and key_action productions */
                                142                 :                : typedef struct KeyAction
                                143                 :                : {
                                144                 :                :     char        action;
                                145                 :                :     List       *cols;
                                146                 :                : } KeyAction;
                                147                 :                : 
                                148                 :                : typedef struct KeyActions
                                149                 :                : {
                                150                 :                :     KeyAction *updateAction;
                                151                 :                :     KeyAction *deleteAction;
                                152                 :                : } KeyActions;
                                153                 :                : 
                                154                 :                : /* ConstraintAttributeSpec yields an integer bitmask of these flags: */
                                155                 :                : #define CAS_NOT_DEFERRABLE          0x01
                                156                 :                : #define CAS_DEFERRABLE              0x02
                                157                 :                : #define CAS_INITIALLY_IMMEDIATE     0x04
                                158                 :                : #define CAS_INITIALLY_DEFERRED      0x08
                                159                 :                : #define CAS_NOT_VALID               0x10
                                160                 :                : #define CAS_NO_INHERIT              0x20
                                161                 :                : 
                                162                 :                : 
                                163                 :                : #define parser_yyerror(msg)  scanner_yyerror(msg, yyscanner)
                                164                 :                : #define parser_errposition(pos)  scanner_errposition(pos, yyscanner)
                                165                 :                : 
                                166                 :                : static void base_yyerror(YYLTYPE *yylloc, core_yyscan_t yyscanner,
                                167                 :                :                          const char *msg);
                                168                 :                : static RawStmt *makeRawStmt(Node *stmt, int stmt_location);
                                169                 :                : static void updateRawStmtEnd(RawStmt *rs, int end_location);
                                170                 :                : static Node *makeColumnRef(char *colname, List *indirection,
                                171                 :                :                            int location, core_yyscan_t yyscanner);
                                172                 :                : static Node *makeTypeCast(Node *arg, TypeName *typename, int location);
                                173                 :                : static Node *makeStringConstCast(char *str, int location, TypeName *typename);
                                174                 :                : static Node *makeIntConst(int val, int location);
                                175                 :                : static Node *makeFloatConst(char *str, int location);
                                176                 :                : static Node *makeBoolAConst(bool state, int location);
                                177                 :                : static Node *makeBitStringConst(char *str, int location);
                                178                 :                : static Node *makeNullAConst(int location);
                                179                 :                : static Node *makeAConst(Node *v, int location);
                                180                 :                : static RoleSpec *makeRoleSpec(RoleSpecType type, int location);
                                181                 :                : static void check_qualified_name(List *names, core_yyscan_t yyscanner);
                                182                 :                : static List *check_func_name(List *names, core_yyscan_t yyscanner);
                                183                 :                : static List *check_indirection(List *indirection, core_yyscan_t yyscanner);
                                184                 :                : static List *extractArgTypes(List *parameters);
                                185                 :                : static List *extractAggrArgTypes(List *aggrargs);
                                186                 :                : static List *makeOrderedSetArgs(List *directargs, List *orderedargs,
                                187                 :                :                                 core_yyscan_t yyscanner);
                                188                 :                : static void insertSelectOptions(SelectStmt *stmt,
                                189                 :                :                                 List *sortClause, List *lockingClause,
                                190                 :                :                                 SelectLimit *limitClause,
                                191                 :                :                                 WithClause *withClause,
                                192                 :                :                                 core_yyscan_t yyscanner);
                                193                 :                : static Node *makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg);
                                194                 :                : static Node *doNegate(Node *n, int location);
                                195                 :                : static void doNegateFloat(Float *v);
                                196                 :                : static Node *makeAndExpr(Node *lexpr, Node *rexpr, int location);
                                197                 :                : static Node *makeOrExpr(Node *lexpr, Node *rexpr, int location);
                                198                 :                : static Node *makeNotExpr(Node *expr, int location);
                                199                 :                : static Node *makeAArrayExpr(List *elements, int location);
                                200                 :                : static Node *makeSQLValueFunction(SQLValueFunctionOp op, int32 typmod,
                                201                 :                :                                   int location);
                                202                 :                : static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args,
                                203                 :                :                          List *args, int location);
                                204                 :                : static List *mergeTableFuncParameters(List *func_args, List *columns);
                                205                 :                : static TypeName *TableFuncTypeName(List *columns);
                                206                 :                : static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner);
                                207                 :                : static RangeVar *makeRangeVarFromQualifiedName(char *name, List *namelist, int location,
                                208                 :                :                                                core_yyscan_t yyscanner);
                                209                 :                : static void SplitColQualList(List *qualList,
                                210                 :                :                              List **constraintList, CollateClause **collClause,
                                211                 :                :                              core_yyscan_t yyscanner);
                                212                 :                : static void processCASbits(int cas_bits, int location, const char *constrType,
                                213                 :                :                bool *deferrable, bool *initdeferred, bool *not_valid,
                                214                 :                :                bool *no_inherit, core_yyscan_t yyscanner);
                                215                 :                : static PartitionStrategy parsePartitionStrategy(char *strategy);
                                216                 :                : static void preprocess_pubobj_list(List *pubobjspec_list,
                                217                 :                :                                    core_yyscan_t yyscanner);
                                218                 :                : static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
                                219                 :                : 
                                220                 :                : %}
                                221                 :                : 
                                222                 :                : %pure-parser
                                223                 :                : %expect 0
                                224                 :                : %name-prefix="base_yy"
                                225                 :                : %locations
                                226                 :                : 
                                227                 :                : %parse-param {core_yyscan_t yyscanner}
                                228                 :                : %lex-param   {core_yyscan_t yyscanner}
                                229                 :                : 
                                230                 :                : %union
                                231                 :                : {
                                232                 :                :     core_YYSTYPE core_yystype;
                                233                 :                :     /* these fields must match core_YYSTYPE: */
                                234                 :                :     int         ival;
                                235                 :                :     char       *str;
                                236                 :                :     const char *keyword;
                                237                 :                : 
                                238                 :                :     char        chr;
                                239                 :                :     bool        boolean;
                                240                 :                :     JoinType    jtype;
                                241                 :                :     DropBehavior dbehavior;
                                242                 :                :     OnCommitAction oncommit;
                                243                 :                :     List       *list;
                                244                 :                :     Node       *node;
                                245                 :                :     ObjectType  objtype;
                                246                 :                :     TypeName   *typnam;
                                247                 :                :     FunctionParameter *fun_param;
                                248                 :                :     FunctionParameterMode fun_param_mode;
                                249                 :                :     ObjectWithArgs *objwithargs;
                                250                 :                :     DefElem    *defelt;
                                251                 :                :     SortBy     *sortby;
                                252                 :                :     WindowDef  *windef;
                                253                 :                :     JoinExpr   *jexpr;
                                254                 :                :     IndexElem  *ielem;
                                255                 :                :     StatsElem  *selem;
                                256                 :                :     Alias      *alias;
                                257                 :                :     RangeVar   *range;
                                258                 :                :     IntoClause *into;
                                259                 :                :     WithClause *with;
                                260                 :                :     InferClause *infer;
                                261                 :                :     OnConflictClause *onconflict;
                                262                 :                :     A_Indices  *aind;
                                263                 :                :     ResTarget  *target;
                                264                 :                :     struct PrivTarget *privtarget;
                                265                 :                :     AccessPriv *accesspriv;
                                266                 :                :     struct ImportQual *importqual;
                                267                 :                :     InsertStmt *istmt;
                                268                 :                :     VariableSetStmt *vsetstmt;
                                269                 :                :     PartitionElem *partelem;
                                270                 :                :     PartitionSpec *partspec;
                                271                 :                :     PartitionBoundSpec *partboundspec;
                                272                 :                :     SinglePartitionSpec *singlepartspec;
                                273                 :                :     RoleSpec   *rolespec;
                                274                 :                :     PublicationObjSpec *publicationobjectspec;
                                275                 :                :     struct SelectLimit *selectlimit;
                                276                 :                :     SetQuantifier setquantifier;
                                277                 :                :     struct GroupClause *groupclause;
                                278                 :                :     MergeMatchKind mergematch;
                                279                 :                :     MergeWhenClause *mergewhen;
                                280                 :                :     struct KeyActions *keyactions;
                                281                 :                :     struct KeyAction *keyaction;
                                282                 :                : }
                                283                 :                : 
                                284                 :                : %type <node>  stmt toplevel_stmt schema_stmt routine_body_stmt
                                285                 :                :         AlterEventTrigStmt AlterCollationStmt
                                286                 :                :         AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterEnumStmt
                                287                 :                :         AlterFdwStmt AlterForeignServerStmt AlterGroupStmt
                                288                 :                :         AlterObjectDependsStmt AlterObjectSchemaStmt AlterOwnerStmt
                                289                 :                :         AlterOperatorStmt AlterTypeStmt AlterSeqStmt AlterSystemStmt AlterTableStmt
                                290                 :                :         AlterTblSpcStmt AlterExtensionStmt AlterExtensionContentsStmt
                                291                 :                :         AlterCompositeTypeStmt AlterUserMappingStmt
                                292                 :                :         AlterRoleStmt AlterRoleSetStmt AlterPolicyStmt AlterStatsStmt
                                293                 :                :         AlterDefaultPrivilegesStmt DefACLAction
                                294                 :                :         AnalyzeStmt CallStmt ClosePortalStmt ClusterStmt CommentStmt
                                295                 :                :         ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
                                296                 :                :         CreateDomainStmt CreateExtensionStmt CreateGroupStmt CreateOpClassStmt
                                297                 :                :         CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt
                                298                 :                :         CreateSchemaStmt CreateSeqStmt CreateStmt CreateStatsStmt CreateTableSpaceStmt
                                299                 :                :         CreateFdwStmt CreateForeignServerStmt CreateForeignTableStmt
                                300                 :                :         CreateAssertionStmt CreateTransformStmt CreateTrigStmt CreateEventTrigStmt
                                301                 :                :         CreateUserStmt CreateUserMappingStmt CreateRoleStmt CreatePolicyStmt
                                302                 :                :         CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt DoStmt
                                303                 :                :         DropOpClassStmt DropOpFamilyStmt DropStmt
                                304                 :                :         DropCastStmt DropRoleStmt
                                305                 :                :         DropdbStmt DropTableSpaceStmt
                                306                 :                :         DropTransformStmt
                                307                 :                :         DropUserMappingStmt ExplainStmt FetchStmt
                                308                 :                :         GrantStmt GrantRoleStmt ImportForeignSchemaStmt IndexStmt InsertStmt
                                309                 :                :         ListenStmt LoadStmt LockStmt MergeStmt NotifyStmt ExplainableStmt PreparableStmt
                                310                 :                :         CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt
                                311                 :                :         RemoveFuncStmt RemoveOperStmt RenameStmt ReturnStmt RevokeStmt RevokeRoleStmt
                                312                 :                :         RuleActionStmt RuleActionStmtOrEmpty RuleStmt
                                313                 :                :         SecLabelStmt SelectStmt TransactionStmt TransactionStmtLegacy TruncateStmt
                                314                 :                :         UnlistenStmt UpdateStmt VacuumStmt
                                315                 :                :         VariableResetStmt VariableSetStmt VariableShowStmt
                                316                 :                :         ViewStmt CheckPointStmt CreateConversionStmt
                                317                 :                :         DeallocateStmt PrepareStmt ExecuteStmt
                                318                 :                :         DropOwnedStmt ReassignOwnedStmt
                                319                 :                :         AlterTSConfigurationStmt AlterTSDictionaryStmt
                                320                 :                :         CreateMatViewStmt RefreshMatViewStmt CreateAmStmt
                                321                 :                :         CreatePublicationStmt AlterPublicationStmt
                                322                 :                :         CreateSubscriptionStmt AlterSubscriptionStmt DropSubscriptionStmt
                                323                 :                : 
                                324                 :                : %type <node>  select_no_parens select_with_parens select_clause
                                325                 :                :                 simple_select values_clause
                                326                 :                :                 PLpgSQL_Expr PLAssignStmt
                                327                 :                : 
                                328                 :                : %type <str>           opt_single_name
                                329                 :                : %type <list>      opt_qualified_name
                                330                 :                : %type <boolean>       opt_concurrently
                                331                 :                : %type <dbehavior> opt_drop_behavior
                                332                 :                : 
                                333                 :                : %type <node>  alter_column_default opclass_item opclass_drop alter_using
                                334                 :                : %type <ival>  add_drop opt_asc_desc opt_nulls_order
                                335                 :                : 
                                336                 :                : %type <node>  alter_table_cmd alter_type_cmd opt_collate_clause
                                337                 :                :        replica_identity partition_cmd index_partition_cmd
                                338                 :                : %type <list>  alter_table_cmds alter_type_cmds
                                339                 :                : %type <list>    alter_identity_column_option_list
                                340                 :                : %type <defelt>  alter_identity_column_option
                                341                 :                : %type <node>  set_statistics_value
                                342                 :                : %type <str>       set_access_method_name
                                343                 :                : 
                                344                 :                : %type <list>  createdb_opt_list createdb_opt_items copy_opt_list
                                345                 :                :                 transaction_mode_list
                                346                 :                :                 create_extension_opt_list alter_extension_opt_list
                                347                 :                : %type <defelt>    createdb_opt_item copy_opt_item
                                348                 :                :                 transaction_mode_item
                                349                 :                :                 create_extension_opt_item alter_extension_opt_item
                                350                 :                : 
                                351                 :                : %type <ival>  opt_lock lock_type cast_context
                                352                 :                : %type <str>       utility_option_name
                                353                 :                : %type <defelt>    utility_option_elem
                                354                 :                : %type <list>  utility_option_list
                                355                 :                : %type <node>  utility_option_arg
                                356                 :                : %type <defelt>    drop_option
                                357                 :                : %type <boolean>   opt_or_replace opt_no
                                358                 :                :                 opt_grant_grant_option
                                359                 :                :                 opt_nowait opt_if_exists opt_with_data
                                360                 :                :                 opt_transaction_chain
                                361                 :                : %type <list>  grant_role_opt_list
                                362                 :                : %type <defelt>    grant_role_opt
                                363                 :                : %type <node>  grant_role_opt_value
                                364                 :                : %type <ival>  opt_nowait_or_skip
                                365                 :                : 
                                366                 :                : %type <list>  OptRoleList AlterOptRoleList
                                367                 :                : %type <defelt>    CreateOptRoleElem AlterOptRoleElem
                                368                 :                : 
                                369                 :                : %type <str>       opt_type
                                370                 :                : %type <str>       foreign_server_version opt_foreign_server_version
                                371                 :                : %type <str>       opt_in_database
                                372                 :                : 
                                373                 :                : %type <str>       parameter_name
                                374                 :                : %type <list>  OptSchemaEltList parameter_name_list
                                375                 :                : 
                                376                 :                : %type <chr>       am_type
                                377                 :                : 
                                378                 :                : %type <boolean> TriggerForSpec TriggerForType
                                379                 :                : %type <ival>  TriggerActionTime
                                380                 :                : %type <list>  TriggerEvents TriggerOneEvent
                                381                 :                : %type <node>  TriggerFuncArg
                                382                 :                : %type <node>  TriggerWhen
                                383                 :                : %type <str>       TransitionRelName
                                384                 :                : %type <boolean>   TransitionRowOrTable TransitionOldOrNew
                                385                 :                : %type <node>  TriggerTransition
                                386                 :                : 
                                387                 :                : %type <list>  event_trigger_when_list event_trigger_value_list
                                388                 :                : %type <defelt>    event_trigger_when_item
                                389                 :                : %type <chr>       enable_trigger
                                390                 :                : 
                                391                 :                : %type <str>       copy_file_name
                                392                 :                :                 access_method_clause attr_name
                                393                 :                :                 table_access_method_clause name cursor_name file_name
                                394                 :                :                 cluster_index_specification
                                395                 :                : 
                                396                 :                : %type <list>  func_name handler_name qual_Op qual_all_Op subquery_Op
                                397                 :                :                 opt_inline_handler opt_validator validator_clause
                                398                 :                :                 opt_collate
                                399                 :                : 
                                400                 :                : %type <range> qualified_name insert_target OptConstrFromTable
                                401                 :                : 
                                402                 :                : %type <str>       all_Op MathOp
                                403                 :                : 
                                404                 :                : %type <str>       row_security_cmd RowSecurityDefaultForCmd
                                405                 :                : %type <boolean> RowSecurityDefaultPermissive
                                406                 :                : %type <node>  RowSecurityOptionalWithCheck RowSecurityOptionalExpr
                                407                 :                : %type <list>  RowSecurityDefaultToRole RowSecurityOptionalToRole
                                408                 :                : 
                                409                 :                : %type <str>       iso_level opt_encoding
                                410                 :                : %type <rolespec> grantee
                                411                 :                : %type <list>  grantee_list
                                412                 :                : %type <accesspriv> privilege
                                413                 :                : %type <list>  privileges privilege_list
                                414                 :                : %type <privtarget> privilege_target
                                415                 :                : %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
                                416                 :                : %type <list>  function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
                                417                 :                : %type <ival>  defacl_privilege_target
                                418                 :                : %type <defelt>    DefACLOption
                                419                 :                : %type <list>  DefACLOptionList
                                420                 :                : %type <ival>  import_qualification_type
                                421                 :                : %type <importqual> import_qualification
                                422                 :                : %type <node>  vacuum_relation
                                423                 :                : %type <selectlimit> opt_select_limit select_limit limit_clause
                                424                 :                : 
                                425                 :                : %type <list>  parse_toplevel stmtmulti routine_body_stmt_list
                                426                 :                :                 OptTableElementList TableElementList OptInherit definition
                                427                 :                :                 OptTypedTableElementList TypedTableElementList
                                428                 :                :                 reloptions opt_reloptions
                                429                 :                :                 OptWith opt_definition func_args func_args_list
                                430                 :                :                 func_args_with_defaults func_args_with_defaults_list
                                431                 :                :                 aggr_args aggr_args_list
                                432                 :                :                 func_as createfunc_opt_list opt_createfunc_opt_list alterfunc_opt_list
                                433                 :                :                 old_aggr_definition old_aggr_list
                                434                 :                :                 oper_argtypes RuleActionList RuleActionMulti
                                435                 :                :                 opt_column_list columnList opt_name_list
                                436                 :                :                 sort_clause opt_sort_clause sortby_list index_params
                                437                 :                :                 stats_params
                                438                 :                :                 opt_include opt_c_include index_including_params
                                439                 :                :                 name_list role_list from_clause from_list opt_array_bounds
                                440                 :                :                 qualified_name_list any_name any_name_list type_name_list
                                441                 :                :                 any_operator expr_list attrs
                                442                 :                :                 distinct_clause opt_distinct_clause
                                443                 :                :                 target_list opt_target_list insert_column_list set_target_list
                                444                 :                :                 merge_values_clause
                                445                 :                :                 set_clause_list set_clause
                                446                 :                :                 def_list operator_def_list indirection opt_indirection
                                447                 :                :                 reloption_list TriggerFuncArgs opclass_item_list opclass_drop_list
                                448                 :                :                 opclass_purpose opt_opfamily transaction_mode_list_or_empty
                                449                 :                :                 OptTableFuncElementList TableFuncElementList opt_type_modifiers
                                450                 :                :                 prep_type_clause
                                451                 :                :                 execute_param_clause using_clause returning_clause
                                452                 :                :                 opt_enum_val_list enum_val_list table_func_column_list
                                453                 :                :                 create_generic_options alter_generic_options
                                454                 :                :                 relation_expr_list dostmt_opt_list
                                455                 :                :                 transform_element_list transform_type_list
                                456                 :                :                 TriggerTransitions TriggerReferencing
                                457                 :                :                 vacuum_relation_list opt_vacuum_relation_list
                                458                 :                :                 drop_option_list pub_obj_list
                                459                 :                : 
                                460                 :                : %type <node>  opt_routine_body
                                461                 :                : %type <groupclause> group_clause
                                462                 :                : %type <list>  group_by_list
                                463                 :                : %type <node>  group_by_item empty_grouping_set rollup_clause cube_clause
                                464                 :                : %type <node>  grouping_sets_clause
                                465                 :                : 
                                466                 :                : %type <list>  opt_fdw_options fdw_options
                                467                 :                : %type <defelt>    fdw_option
                                468                 :                : 
                                469                 :                : %type <range> OptTempTableName
                                470                 :                : %type <into>  into_clause create_as_target create_mv_target
                                471                 :                : 
                                472                 :                : %type <defelt>    createfunc_opt_item common_func_opt_item dostmt_opt_item
                                473                 :                : %type <fun_param> func_arg func_arg_with_default table_func_column aggr_arg
                                474                 :                : %type <fun_param_mode> arg_class
                                475                 :                : %type <typnam>    func_return func_type
                                476                 :                : 
                                477                 :                : %type <boolean>  opt_trusted opt_restart_seqs
                                478                 :                : %type <ival>   OptTemp
                                479                 :                : %type <ival>   OptNoLog
                                480                 :                : %type <oncommit> OnCommitOption
                                481                 :                : 
                                482                 :                : %type <ival>  for_locking_strength
                                483                 :                : %type <node>  for_locking_item
                                484                 :                : %type <list>  for_locking_clause opt_for_locking_clause for_locking_items
                                485                 :                : %type <list>  locked_rels_list
                                486                 :                : %type <setquantifier> set_quantifier
                                487                 :                : 
                                488                 :                : %type <node>  join_qual
                                489                 :                : %type <jtype> join_type
                                490                 :                : 
                                491                 :                : %type <list>  extract_list overlay_list position_list
                                492                 :                : %type <list>  substr_list trim_list
                                493                 :                : %type <list>  opt_interval interval_second
                                494                 :                : %type <str>       unicode_normal_form
                                495                 :                : 
                                496                 :                : %type <boolean> opt_instead
                                497                 :                : %type <boolean> opt_unique opt_verbose opt_full
                                498                 :                : %type <boolean> opt_freeze opt_analyze opt_default opt_recheck
                                499                 :                : %type <defelt>    opt_binary copy_delimiter
                                500                 :                : 
                                501                 :                : %type <boolean> copy_from opt_program
                                502                 :                : 
                                503                 :                : %type <ival>  event cursor_options opt_hold opt_set_data
                                504                 :                : %type <objtype>   object_type_any_name object_type_name object_type_name_on_any_name
                                505                 :                :                 drop_type_name
                                506                 :                : 
                                507                 :                : %type <node>  fetch_args select_limit_value
                                508                 :                :                 offset_clause select_offset_value
                                509                 :                :                 select_fetch_first_value I_or_F_const
                                510                 :                : %type <ival>  row_or_rows first_or_next
                                511                 :                : 
                                512                 :                : %type <list>  OptSeqOptList SeqOptList OptParenthesizedSeqOptList
                                513                 :                : %type <defelt>    SeqOptElem
                                514                 :                : 
                                515                 :                : %type <istmt> insert_rest
                                516                 :                : %type <infer> opt_conf_expr
                                517                 :                : %type <onconflict> opt_on_conflict
                                518                 :                : %type <mergewhen> merge_insert merge_update merge_delete
                                519                 :                : 
                                520                 :                : %type <mergematch> merge_when_tgt_matched merge_when_tgt_not_matched
                                521                 :                : %type <node>  merge_when_clause opt_merge_when_condition
                                522                 :                : %type <list>  merge_when_list
                                523                 :                : 
                                524                 :                : %type <vsetstmt> generic_set set_rest set_rest_more generic_reset reset_rest
                                525                 :                :                  SetResetClause FunctionSetResetClause
                                526                 :                : 
                                527                 :                : %type <node>  TableElement TypedTableElement ConstraintElem TableFuncElement
                                528                 :                : %type <node>  columnDef columnOptions optionalPeriodName
                                529                 :                : %type <defelt>    def_elem reloption_elem old_aggr_elem operator_def_elem
                                530                 :                : %type <node>  def_arg columnElem where_clause where_or_current_clause
                                531                 :                :                 a_expr b_expr c_expr AexprConst indirection_el opt_slice_bound
                                532                 :                :                 columnref in_expr having_clause func_table xmltable array_expr
                                533                 :                :                 OptWhereClause operator_def_arg
                                534                 :                : %type <list>  opt_column_and_period_list
                                535                 :                : %type <list>  rowsfrom_item rowsfrom_list opt_col_def_list
                                536                 :                : %type <boolean> opt_ordinality opt_without_overlaps
                                537                 :                : %type <list>  ExclusionConstraintList ExclusionConstraintElem
                                538                 :                : %type <list>  func_arg_list func_arg_list_opt
                                539                 :                : %type <node>  func_arg_expr
                                540                 :                : %type <list>  row explicit_row implicit_row type_list array_expr_list
                                541                 :                : %type <node>  case_expr case_arg when_clause case_default
                                542                 :                : %type <list>  when_clause_list
                                543                 :                : %type <node>  opt_search_clause opt_cycle_clause
                                544                 :                : %type <ival>  sub_type opt_materialized
                                545                 :                : %type <node>  NumericOnly
                                546                 :                : %type <list>  NumericOnly_list
                                547                 :                : %type <alias> alias_clause opt_alias_clause opt_alias_clause_for_join_using
                                548                 :                : %type <list>  func_alias_clause
                                549                 :                : %type <sortby>    sortby
                                550                 :                : %type <ielem> index_elem index_elem_options
                                551                 :                : %type <selem> stats_param
                                552                 :                : %type <node>  table_ref
                                553                 :                : %type <jexpr> joined_table
                                554                 :                : %type <range> relation_expr
                                555                 :                : %type <range> extended_relation_expr
                                556                 :                : %type <range> relation_expr_opt_alias
                                557                 :                : %type <node>  tablesample_clause opt_repeatable_clause
                                558                 :                : %type <target>    target_el set_target insert_column_item
                                559                 :                : 
                                560                 :                : %type <str>       generic_option_name
                                561                 :                : %type <node>  generic_option_arg
                                562                 :                : %type <defelt>    generic_option_elem alter_generic_option_elem
                                563                 :                : %type <list>  generic_option_list alter_generic_option_list
                                564                 :                : 
                                565                 :                : %type <ival>  reindex_target_relation reindex_target_all
                                566                 :                : %type <list>  opt_reindex_option_list
                                567                 :                : 
                                568                 :                : %type <node>  copy_generic_opt_arg copy_generic_opt_arg_list_item
                                569                 :                : %type <defelt>    copy_generic_opt_elem
                                570                 :                : %type <list>  copy_generic_opt_list copy_generic_opt_arg_list
                                571                 :                : %type <list>  copy_options
                                572                 :                : 
                                573                 :                : %type <typnam>    Typename SimpleTypename ConstTypename
                                574                 :                :                 GenericType Numeric opt_float JsonType
                                575                 :                :                 Character ConstCharacter
                                576                 :                :                 CharacterWithLength CharacterWithoutLength
                                577                 :                :                 ConstDatetime ConstInterval
                                578                 :                :                 Bit ConstBit BitWithLength BitWithoutLength
                                579                 :                : %type <str>       character
                                580                 :                : %type <str>       extract_arg
                                581                 :                : %type <boolean> opt_varying opt_timezone opt_no_inherit
                                582                 :                : 
                                583                 :                : %type <ival>  Iconst SignedIconst
                                584                 :                : %type <str>       Sconst comment_text notify_payload
                                585                 :                : %type <str>       RoleId opt_boolean_or_string
                                586                 :                : %type <list>  var_list
                                587                 :                : %type <str>       ColId ColLabel BareColLabel
                                588                 :                : %type <str>       NonReservedWord NonReservedWord_or_Sconst
                                589                 :                : %type <str>       var_name type_function_name param_name
                                590                 :                : %type <str>       createdb_opt_name plassign_target
                                591                 :                : %type <node>  var_value zone_value
                                592                 :                : %type <rolespec> auth_ident RoleSpec opt_granted_by
                                593                 :                : %type <publicationobjectspec> PublicationObjSpec
                                594                 :                : 
                                595                 :                : %type <keyword> unreserved_keyword type_func_name_keyword
                                596                 :                : %type <keyword> col_name_keyword reserved_keyword
                                597                 :                : %type <keyword> bare_label_keyword
                                598                 :                : 
                                599                 :                : %type <node>  TableConstraint TableLikeClause
                                600                 :                : %type <ival>  TableLikeOptionList TableLikeOption
                                601                 :                : %type <str>       column_compression opt_column_compression column_storage opt_column_storage
                                602                 :                : %type <list>  ColQualList
                                603                 :                : %type <node>  ColConstraint ColConstraintElem ConstraintAttr
                                604                 :                : %type <ival>  key_match
                                605                 :                : %type <keyaction> key_delete key_update key_action
                                606                 :                : %type <keyactions> key_actions
                                607                 :                : %type <ival>  ConstraintAttributeSpec ConstraintAttributeElem
                                608                 :                : %type <str>       ExistingIndex
                                609                 :                : 
                                610                 :                : %type <list>  constraints_set_list
                                611                 :                : %type <boolean> constraints_set_mode
                                612                 :                : %type <str>       OptTableSpace OptConsTableSpace
                                613                 :                : %type <rolespec> OptTableSpaceOwner
                                614                 :                : %type <ival>  opt_check_option
                                615                 :                : 
                                616                 :                : %type <str>       opt_provider security_label
                                617                 :                : 
                                618                 :                : %type <target>    xml_attribute_el
                                619                 :                : %type <list>  xml_attribute_list xml_attributes
                                620                 :                : %type <node>  xml_root_version opt_xml_root_standalone
                                621                 :                : %type <node>  xmlexists_argument
                                622                 :                : %type <ival>  document_or_content
                                623                 :                : %type <boolean>   xml_indent_option xml_whitespace_option
                                624                 :                : %type <list>  xmltable_column_list xmltable_column_option_list
                                625                 :                : %type <node>  xmltable_column_el
                                626                 :                : %type <defelt>    xmltable_column_option_el
                                627                 :                : %type <list>  xml_namespace_list
                                628                 :                : %type <target>    xml_namespace_el
                                629                 :                : 
                                630                 :                : %type <node>  func_application func_expr_common_subexpr
                                631                 :                : %type <node>  func_expr func_expr_windowless
                                632                 :                : %type <node>  common_table_expr
                                633                 :                : %type <with>  with_clause opt_with_clause
                                634                 :                : %type <list>  cte_list
                                635                 :                : 
                                636                 :                : %type <list>  within_group_clause
                                637                 :                : %type <node>  filter_clause
                                638                 :                : %type <list>  window_clause window_definition_list opt_partition_clause
                                639                 :                : %type <windef>    window_definition over_clause window_specification
                                640                 :                :                 opt_frame_clause frame_extent frame_bound
                                641                 :                : %type <ival>  opt_window_exclusion_clause
                                642                 :                : %type <str>       opt_existing_window_name
                                643                 :                : %type <boolean> opt_if_not_exists
                                644                 :                : %type <boolean> opt_unique_null_treatment
                                645                 :                : %type <ival>  generated_when override_kind
                                646                 :                : %type <partspec>  PartitionSpec OptPartitionSpec
                                647                 :                : %type <partelem>  part_elem
                                648                 :                : %type <list>      part_params
                                649                 :                : %type <partboundspec> PartitionBoundSpec
                                650                 :                : %type <singlepartspec>    SinglePartitionSpec
                                651                 :                : %type <list>      partitions_list
                                652                 :                : %type <list>      hash_partbound
                                653                 :                : %type <defelt>        hash_partbound_elem
                                654                 :                : 
                                655                 :                : %type <node>  json_format_clause
                                656                 :                :                 json_format_clause_opt
                                657                 :                :                 json_value_expr
                                658                 :                :                 json_returning_clause_opt
                                659                 :                :                 json_name_and_value
                                660                 :                :                 json_aggregate_func
                                661                 :                :                 json_argument
                                662                 :                :                 json_behavior
                                663                 :                :                 json_on_error_clause_opt
                                664                 :                :                 json_table
                                665                 :                :                 json_table_column_definition
                                666                 :                :                 json_table_column_path_clause_opt
                                667                 :                : %type <list>  json_name_and_value_list
                                668                 :                :                 json_value_expr_list
                                669                 :                :                 json_array_aggregate_order_by_clause_opt
                                670                 :                :                 json_arguments
                                671                 :                :                 json_behavior_clause_opt
                                672                 :                :                 json_passing_clause_opt
                                673                 :                :                 json_table_column_definition_list
                                674                 :                : %type <str>       json_table_path_name_opt
                                675                 :                : %type <ival>  json_behavior_type
                                676                 :                :                 json_predicate_type_constraint
                                677                 :                :                 json_quotes_clause_opt
                                678                 :                :                 json_wrapper_behavior
                                679                 :                : %type <boolean>   json_key_uniqueness_constraint_opt
                                680                 :                :                 json_object_constructor_null_clause_opt
                                681                 :                :                 json_array_constructor_null_clause_opt
                                682                 :                : 
                                683                 :                : 
                                684                 :                : /*
                                685                 :                :  * Non-keyword token types.  These are hard-wired into the "flex" lexer.
                                686                 :                :  * They must be listed first so that their numeric codes do not depend on
                                687                 :                :  * the set of keywords.  PL/pgSQL depends on this so that it can share the
                                688                 :                :  * same lexer.  If you add/change tokens here, fix PL/pgSQL to match!
                                689                 :                :  *
                                690                 :                :  * UIDENT and USCONST are reduced to IDENT and SCONST in parser.c, so that
                                691                 :                :  * they need no productions here; but we must assign token codes to them.
                                692                 :                :  *
                                693                 :                :  * DOT_DOT is unused in the core SQL grammar, and so will always provoke
                                694                 :                :  * parse errors.  It is needed by PL/pgSQL.
                                695                 :                :  */
                                696                 :                : %token <str>  IDENT UIDENT FCONST SCONST USCONST BCONST XCONST Op
                                697                 :                : %token <ival> ICONST PARAM
                                698                 :                : %token          TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER
                                699                 :                : %token          LESS_EQUALS GREATER_EQUALS NOT_EQUALS
                                700                 :                : 
                                701                 :                : /*
                                702                 :                :  * If you want to make any keyword changes, update the keyword table in
                                703                 :                :  * src/include/parser/kwlist.h and add new keywords to the appropriate one
                                704                 :                :  * of the reserved-or-not-so-reserved keyword lists, below; search
                                705                 :                :  * this file for "Keyword category lists".
                                706                 :                :  */
                                707                 :                : 
                                708                 :                : /* ordinary key words in alphabetical order */
                                709                 :                : %token <keyword> ABORT_P ABSENT ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER
                                710                 :                :     AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC
                                711                 :                :     ASENSITIVE ASSERTION ASSIGNMENT ASYMMETRIC ATOMIC AT ATTACH ATTRIBUTE AUTHORIZATION
                                712                 :                : 
                                713                 :                :     BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
                                714                 :                :     BOOLEAN_P BOTH BREADTH BY
                                715                 :                : 
                                716                 :                :     CACHE CALL CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
                                717                 :                :     CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
                                718                 :                :     CLUSTER COALESCE COLLATE COLLATION COLUMN COLUMNS COMMENT COMMENTS COMMIT
                                719                 :                :     COMMITTED COMPRESSION CONCURRENTLY CONDITIONAL CONFIGURATION CONFLICT
                                720                 :                :     CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONTINUE_P CONVERSION_P COPY
                                721                 :                :     COST CREATE CROSS CSV CUBE CURRENT_P
                                722                 :                :     CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA
                                723                 :                :     CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
                                724                 :                : 
                                725                 :                :     DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
                                726                 :                :     DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DEPENDS DEPTH DESC
                                727                 :                :     DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
                                728                 :                :     DOUBLE_P DROP
                                729                 :                : 
                                730                 :                :     EACH ELSE EMPTY_P ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ERROR_P ESCAPE
                                731                 :                :     EVENT EXCEPT EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
                                732                 :                :     EXTENSION EXTERNAL EXTRACT
                                733                 :                : 
                                734                 :                :     FALSE_P FAMILY FETCH FILTER FINALIZE FIRST_P FLOAT_P FOLLOWING FOR
                                735                 :                :     FORCE FOREIGN FORMAT FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS
                                736                 :                : 
                                737                 :                :     GENERATED GLOBAL GRANT GRANTED GREATEST GROUP_P GROUPING GROUPS
                                738                 :                : 
                                739                 :                :     HANDLER HAVING HEADER_P HOLD HOUR_P
                                740                 :                : 
                                741                 :                :     IDENTITY_P IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IMPORT_P IN_P INCLUDE
                                742                 :                :     INCLUDING INCREMENT INDENT INDEX INDEXES INHERIT INHERITS INITIALLY INLINE_P
                                743                 :                :     INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER
                                744                 :                :     INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
                                745                 :                : 
                                746                 :                :     JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_EXISTS JSON_OBJECT JSON_OBJECTAGG
                                747                 :                :     JSON_QUERY JSON_SCALAR JSON_SERIALIZE JSON_TABLE JSON_VALUE
                                748                 :                : 
                                749                 :                :     KEEP KEY KEYS
                                750                 :                : 
                                751                 :                :     LABEL LANGUAGE LARGE_P LAST_P LATERAL_P
                                752                 :                :     LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL
                                753                 :                :     LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOGGED
                                754                 :                : 
                                755                 :                :     MAPPING MATCH MATCHED MATERIALIZED MAXVALUE MERGE MERGE_ACTION METHOD
                                756                 :                :     MINUTE_P MINVALUE MODE MONTH_P MOVE
                                757                 :                : 
                                758                 :                :     NAME_P NAMES NATIONAL NATURAL NCHAR NESTED NEW NEXT NFC NFD NFKC NFKD NO
                                759                 :                :     NONE NORMALIZE NORMALIZED
                                760                 :                :     NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF
                                761                 :                :     NULLS_P NUMERIC
                                762                 :                : 
                                763                 :                :     OBJECT_P OF OFF OFFSET OIDS OLD OMIT ON ONLY OPERATOR OPTION OPTIONS OR
                                764                 :                :     ORDER ORDINALITY OTHERS OUT_P OUTER_P
                                765                 :                :     OVER OVERLAPS OVERLAY OVERRIDING OWNED OWNER
                                766                 :                : 
                                767                 :                :     PARALLEL PARAMETER PARSER PARTIAL PARTITION PARTITIONS PASSING PASSWORD PATH
                                768                 :                :     PERIOD PLACING PLAN PLANS POLICY
                                769                 :                : 
                                770                 :                :     POSITION PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY
                                771                 :                :     PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROCEDURES PROGRAM PUBLICATION
                                772                 :                : 
                                773                 :                :     QUOTE QUOTES
                                774                 :                : 
                                775                 :                :     RANGE READ REAL REASSIGN RECHECK RECURSIVE REF_P REFERENCES REFERENCING
                                776                 :                :     REFRESH REINDEX RELATIVE_P RELEASE RENAME REPEATABLE REPLACE REPLICA
                                777                 :                :     RESET RESTART RESTRICT RETURN RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP
                                778                 :                :     ROUTINE ROUTINES ROW ROWS RULE
                                779                 :                : 
                                780                 :                :     SAVEPOINT SCALAR SCHEMA SCHEMAS SCROLL SEARCH SECOND_P SECURITY SELECT
                                781                 :                :     SEQUENCE SEQUENCES
                                782                 :                :     SERIALIZABLE SERVER SESSION SESSION_USER SET SETS SETOF SHARE SHOW
                                783                 :                :     SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SPLIT SOURCE SQL_P STABLE STANDALONE_P
                                784                 :                :     START STATEMENT STATISTICS STDIN STDOUT STORAGE STORED STRICT_P STRING_P STRIP_P
                                785                 :                :     SUBSCRIPTION SUBSTRING SUPPORT SYMMETRIC SYSID SYSTEM_P SYSTEM_USER
                                786                 :                : 
                                787                 :                :     TABLE TABLES TABLESAMPLE TABLESPACE TARGET TEMP TEMPLATE TEMPORARY TEXT_P THEN
                                788                 :                :     TIES TIME TIMESTAMP TO TRAILING TRANSACTION TRANSFORM
                                789                 :                :     TREAT TRIGGER TRIM TRUE_P
                                790                 :                :     TRUNCATE TRUSTED TYPE_P TYPES_P
                                791                 :                : 
                                792                 :                :     UESCAPE UNBOUNDED UNCONDITIONAL UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN
                                793                 :                :     UNLISTEN UNLOGGED UNTIL UPDATE USER USING
                                794                 :                : 
                                795                 :                :     VACUUM VALID VALIDATE VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING
                                796                 :                :     VERBOSE VERSION_P VIEW VIEWS VOLATILE
                                797                 :                : 
                                798                 :                :     WHEN WHERE WHITESPACE_P WINDOW WITH WITHIN WITHOUT WORK WRAPPER WRITE
                                799                 :                : 
                                800                 :                :     XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLEXISTS XMLFOREST XMLNAMESPACES
                                801                 :                :     XMLPARSE XMLPI XMLROOT XMLSERIALIZE XMLTABLE
                                802                 :                : 
                                803                 :                :     YEAR_P YES_P
                                804                 :                : 
                                805                 :                :     ZONE
                                806                 :                : 
                                807                 :                : /*
                                808                 :                :  * The grammar thinks these are keywords, but they are not in the kwlist.h
                                809                 :                :  * list and so can never be entered directly.  The filter in parser.c
                                810                 :                :  * creates these tokens when required (based on looking one token ahead).
                                811                 :                :  *
                                812                 :                :  * NOT_LA exists so that productions such as NOT LIKE can be given the same
                                813                 :                :  * precedence as LIKE; otherwise they'd effectively have the same precedence
                                814                 :                :  * as NOT, at least with respect to their left-hand subexpression.
                                815                 :                :  * FORMAT_LA, NULLS_LA, WITH_LA, and WITHOUT_LA are needed to make the grammar
                                816                 :                :  * LALR(1).
                                817                 :                :  */
                                818                 :                : %token      FORMAT_LA NOT_LA NULLS_LA WITH_LA WITHOUT_LA
                                819                 :                : 
                                820                 :                : /*
                                821                 :                :  * The grammar likewise thinks these tokens are keywords, but they are never
                                822                 :                :  * generated by the scanner.  Rather, they can be injected by parser.c as
                                823                 :                :  * the initial token of the string (using the lookahead-token mechanism
                                824                 :                :  * implemented there).  This provides a way to tell the grammar to parse
                                825                 :                :  * something other than the usual list of SQL commands.
                                826                 :                :  */
                                827                 :                : %token      MODE_TYPE_NAME
                                828                 :                : %token      MODE_PLPGSQL_EXPR
                                829                 :                : %token      MODE_PLPGSQL_ASSIGN1
                                830                 :                : %token      MODE_PLPGSQL_ASSIGN2
                                831                 :                : %token      MODE_PLPGSQL_ASSIGN3
                                832                 :                : 
                                833                 :                : 
                                834                 :                : /* Precedence: lowest to highest */
                                835                 :                : %left       UNION EXCEPT
                                836                 :                : %left       INTERSECT
                                837                 :                : %left       OR
                                838                 :                : %left       AND
                                839                 :                : %right      NOT
                                840                 :                : %nonassoc   IS ISNULL NOTNULL   /* IS sets precedence for IS NULL, etc */
                                841                 :                : %nonassoc   '<' '>' '=' LESS_EQUALS GREATER_EQUALS NOT_EQUALS
                                842                 :                : %nonassoc   BETWEEN IN_P LIKE ILIKE SIMILAR NOT_LA
                                843                 :                : %nonassoc   ESCAPE          /* ESCAPE must be just above LIKE/ILIKE/SIMILAR */
                                844                 :                : 
                                845                 :                : /*
                                846                 :                :  * Sometimes it is necessary to assign precedence to keywords that are not
                                847                 :                :  * really part of the operator hierarchy, in order to resolve grammar
                                848                 :                :  * ambiguities.  It's best to avoid doing so whenever possible, because such
                                849                 :                :  * assignments have global effect and may hide ambiguities besides the one
                                850                 :                :  * you intended to solve.  (Attaching a precedence to a single rule with
                                851                 :                :  * %prec is far safer and should be preferred.)  If you must give precedence
                                852                 :                :  * to a new keyword, try very hard to give it the same precedence as IDENT.
                                853                 :                :  * If the keyword has IDENT's precedence then it clearly acts the same as
                                854                 :                :  * non-keywords and other similar keywords, thus reducing the risk of
                                855                 :                :  * unexpected precedence effects.
                                856                 :                :  *
                                857                 :                :  * We used to need to assign IDENT an explicit precedence just less than Op,
                                858                 :                :  * to support target_el without AS.  While that's not really necessary since
                                859                 :                :  * we removed postfix operators, we continue to do so because it provides a
                                860                 :                :  * reference point for a precedence level that we can assign to other
                                861                 :                :  * keywords that lack a natural precedence level.
                                862                 :                :  *
                                863                 :                :  * We need to do this for PARTITION, RANGE, ROWS, and GROUPS to support
                                864                 :                :  * opt_existing_window_name (see comment there).
                                865                 :                :  *
                                866                 :                :  * The frame_bound productions UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING
                                867                 :                :  * are even messier: since UNBOUNDED is an unreserved keyword (per spec!),
                                868                 :                :  * there is no principled way to distinguish these from the productions
                                869                 :                :  * a_expr PRECEDING/FOLLOWING.  We hack this up by giving UNBOUNDED slightly
                                870                 :                :  * lower precedence than PRECEDING and FOLLOWING.  At present this doesn't
                                871                 :                :  * appear to cause UNBOUNDED to be treated differently from other unreserved
                                872                 :                :  * keywords anywhere else in the grammar, but it's definitely risky.  We can
                                873                 :                :  * blame any funny behavior of UNBOUNDED on the SQL standard, though.
                                874                 :                :  *
                                875                 :                :  * To support CUBE and ROLLUP in GROUP BY without reserving them, we give them
                                876                 :                :  * an explicit priority lower than '(', so that a rule with CUBE '(' will shift
                                877                 :                :  * rather than reducing a conflicting rule that takes CUBE as a function name.
                                878                 :                :  * Using the same precedence as IDENT seems right for the reasons given above.
                                879                 :                :  *
                                880                 :                :  * SET is likewise assigned the same precedence as IDENT, to support the
                                881                 :                :  * relation_expr_opt_alias production (see comment there).
                                882                 :                :  *
                                883                 :                :  * KEYS, OBJECT_P, SCALAR, VALUE_P, WITH, and WITHOUT are similarly assigned
                                884                 :                :  * the same precedence as IDENT.  This allows resolving conflicts in the
                                885                 :                :  * json_predicate_type_constraint and json_key_uniqueness_constraint_opt
                                886                 :                :  * productions (see comments there).
                                887                 :                :  *
                                888                 :                :  * Like the UNBOUNDED PRECEDING/FOLLOWING case, NESTED is assigned a lower
                                889                 :                :  * precedence than PATH to fix ambiguity in the json_table production.
                                890                 :                :  */
                                891                 :                : %nonassoc   UNBOUNDED NESTED /* ideally would have same precedence as IDENT */
                                892                 :                : %nonassoc   IDENT PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP
                                893                 :                :             SET KEYS OBJECT_P SCALAR VALUE_P WITH WITHOUT PATH
                                894                 :                : %left       Op OPERATOR     /* multi-character ops and user-defined operators */
                                895                 :                : %left       '+' '-'
                                896                 :                : %left       '*' '/' '%'
                                897                 :                : %left       '^'
                                898                 :                : /* Unary Operators */
                                899                 :                : %left       AT              /* sets precedence for AT TIME ZONE, AT LOCAL */
                                900                 :                : %left       COLLATE
                                901                 :                : %right      UMINUS
                                902                 :                : %left       '[' ']'
                                903                 :                : %left       '(' ')'
                                904                 :                : %left       TYPECAST
                                905                 :                : %left       '.'
                                906                 :                : /*
                                907                 :                :  * These might seem to be low-precedence, but actually they are not part
                                908                 :                :  * of the arithmetic hierarchy at all in their use as JOIN operators.
                                909                 :                :  * We make them high-precedence to support their use as function names.
                                910                 :                :  * They wouldn't be given a precedence at all, were it not that we need
                                911                 :                :  * left-associativity among the JOIN rules themselves.
                                912                 :                :  */
                                913                 :                : %left       JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
                                914                 :                : 
                                915                 :                : %%
                                916                 :                : 
                                917                 :                : /*
                                918                 :                :  *  The target production for the whole parse.
                                919                 :                :  *
                                920                 :                :  * Ordinarily we parse a list of statements, but if we see one of the
                                921                 :                :  * special MODE_XXX symbols as first token, we parse something else.
                                922                 :                :  * The options here correspond to enum RawParseMode, which see for details.
                                923                 :                :  */
                                924                 :                : parse_toplevel:
                                925                 :                :             stmtmulti
                                926                 :                :             {
 5389 tgl@sss.pgh.pa.us         927                 :CBC      339324 :                 pg_yyget_extra(yyscanner)->parsetree = $1;
                                928                 :                :                 (void) yynerrs;     /* suppress compiler warning */
                                929                 :                :             }
                                930                 :                :             | MODE_TYPE_NAME Typename
                                931                 :                :             {
 1196                           932                 :           5195 :                 pg_yyget_extra(yyscanner)->parsetree = list_make1($2);
                                933                 :                :             }
                                934                 :                :             | MODE_PLPGSQL_EXPR PLpgSQL_Expr
                                935                 :                :             {
                                936                 :          16645 :                 pg_yyget_extra(yyscanner)->parsetree =
                                937                 :          16645 :                     list_make1(makeRawStmt($2, 0));
                                938                 :                :             }
                                939                 :                :             | MODE_PLPGSQL_ASSIGN1 PLAssignStmt
                                940                 :                :             {
                                941                 :           3513 :                 PLAssignStmt *n = (PLAssignStmt *) $2;
                                942                 :                : 
                                943                 :           3513 :                 n->nnames = 1;
                                944                 :           3513 :                 pg_yyget_extra(yyscanner)->parsetree =
                                945                 :           3513 :                     list_make1(makeRawStmt((Node *) n, 0));
                                946                 :                :             }
                                947                 :                :             | MODE_PLPGSQL_ASSIGN2 PLAssignStmt
                                948                 :                :             {
                                949                 :            310 :                 PLAssignStmt *n = (PLAssignStmt *) $2;
                                950                 :                : 
                                951                 :            310 :                 n->nnames = 2;
                                952                 :            310 :                 pg_yyget_extra(yyscanner)->parsetree =
                                953                 :            310 :                     list_make1(makeRawStmt((Node *) n, 0));
                                954                 :                :             }
                                955                 :                :             | MODE_PLPGSQL_ASSIGN3 PLAssignStmt
                                956                 :                :             {
                                957                 :             14 :                 PLAssignStmt *n = (PLAssignStmt *) $2;
                                958                 :                : 
                                959                 :             14 :                 n->nnames = 3;
                                960                 :             14 :                 pg_yyget_extra(yyscanner)->parsetree =
                                961                 :             14 :                     list_make1(makeRawStmt((Node *) n, 0));
                                962                 :                :             }
                                963                 :                :         ;
                                964                 :                : 
                                965                 :                : /*
                                966                 :                :  * At top level, we wrap each stmt with a RawStmt node carrying start location
                                967                 :                :  * and length of the stmt's text.  Notice that the start loc/len are driven
                                968                 :                :  * entirely from semicolon locations (@2).  It would seem natural to use
                                969                 :                :  * @1 or @3 to get the true start location of a stmt, but that doesn't work
                                970                 :                :  * for statements that can start with empty nonterminals (opt_with_clause is
                                971                 :                :  * the main offender here); as noted in the comments for YYLLOC_DEFAULT,
                                972                 :                :  * we'd get -1 for the location in such cases.
                                973                 :                :  * We also take care to discard empty statements entirely.
                                974                 :                :  */
                                975                 :                : stmtmulti:  stmtmulti ';' toplevel_stmt
                                976                 :                :                 {
 2647                           977         [ +  + ]:         275822 :                     if ($1 != NIL)
                                978                 :                :                     {
                                979                 :                :                         /* update length of previous stmt */
 2561                           980                 :         275774 :                         updateRawStmtEnd(llast_node(RawStmt, $1), @2);
                                981                 :                :                     }
 5389                           982         [ +  + ]:         275822 :                     if ($3 != NULL)
 2647                           983                 :          24326 :                         $$ = lappend($1, makeRawStmt($3, @2 + 1));
                                984                 :                :                     else
 5389                           985                 :         251496 :                         $$ = $1;
                                986                 :                :                 }
                                987                 :                :             | toplevel_stmt
                                988                 :                :                 {
                                989         [ +  + ]:         339327 :                     if ($1 != NULL)
 2647                           990                 :         339085 :                         $$ = list_make1(makeRawStmt($1, 0));
                                991                 :                :                     else
 7972 bruce@momjian.us          992                 :            242 :                         $$ = NIL;
                                993                 :                :                 }
                                994                 :                :         ;
                                995                 :                : 
                                996                 :                : /*
                                997                 :                :  * toplevel_stmt includes BEGIN and END.  stmt does not include them, because
                                998                 :                :  * those words have different meanings in function bodies.
                                999                 :                :  */
                               1000                 :                : toplevel_stmt:
                               1001                 :                :             stmt
                               1002                 :                :             | TransactionStmtLegacy
                               1003                 :                :         ;
                               1004                 :                : 
                               1005                 :                : stmt:
                               1006                 :                :             AlterEventTrigStmt
                               1007                 :                :             | AlterCollationStmt
                               1008                 :                :             | AlterDatabaseStmt
                               1009                 :                :             | AlterDatabaseSetStmt
                               1010                 :                :             | AlterDefaultPrivilegesStmt
                               1011                 :                :             | AlterDomainStmt
                               1012                 :                :             | AlterEnumStmt
                               1013                 :                :             | AlterExtensionStmt
                               1014                 :                :             | AlterExtensionContentsStmt
                               1015                 :                :             | AlterFdwStmt
                               1016                 :                :             | AlterForeignServerStmt
                               1017                 :                :             | AlterFunctionStmt
                               1018                 :                :             | AlterGroupStmt
                               1019                 :                :             | AlterObjectDependsStmt
                               1020                 :                :             | AlterObjectSchemaStmt
                               1021                 :                :             | AlterOwnerStmt
                               1022                 :                :             | AlterOperatorStmt
                               1023                 :                :             | AlterTypeStmt
                               1024                 :                :             | AlterPolicyStmt
                               1025                 :                :             | AlterSeqStmt
                               1026                 :                :             | AlterSystemStmt
                               1027                 :                :             | AlterTableStmt
                               1028                 :                :             | AlterTblSpcStmt
                               1029                 :                :             | AlterCompositeTypeStmt
                               1030                 :                :             | AlterPublicationStmt
                               1031                 :                :             | AlterRoleSetStmt
                               1032                 :                :             | AlterRoleStmt
                               1033                 :                :             | AlterSubscriptionStmt
                               1034                 :                :             | AlterStatsStmt
                               1035                 :                :             | AlterTSConfigurationStmt
                               1036                 :                :             | AlterTSDictionaryStmt
                               1037                 :                :             | AlterUserMappingStmt
                               1038                 :                :             | AnalyzeStmt
                               1039                 :                :             | CallStmt
                               1040                 :                :             | CheckPointStmt
                               1041                 :                :             | ClosePortalStmt
                               1042                 :                :             | ClusterStmt
                               1043                 :                :             | CommentStmt
                               1044                 :                :             | ConstraintsSetStmt
                               1045                 :                :             | CopyStmt
                               1046                 :                :             | CreateAmStmt
                               1047                 :                :             | CreateAsStmt
                               1048                 :                :             | CreateAssertionStmt
                               1049                 :                :             | CreateCastStmt
                               1050                 :                :             | CreateConversionStmt
                               1051                 :                :             | CreateDomainStmt
                               1052                 :                :             | CreateExtensionStmt
                               1053                 :                :             | CreateFdwStmt
                               1054                 :                :             | CreateForeignServerStmt
                               1055                 :                :             | CreateForeignTableStmt
                               1056                 :                :             | CreateFunctionStmt
                               1057                 :                :             | CreateGroupStmt
                               1058                 :                :             | CreateMatViewStmt
                               1059                 :                :             | CreateOpClassStmt
                               1060                 :                :             | CreateOpFamilyStmt
                               1061                 :                :             | CreatePublicationStmt
                               1062                 :                :             | AlterOpFamilyStmt
                               1063                 :                :             | CreatePolicyStmt
                               1064                 :                :             | CreatePLangStmt
                               1065                 :                :             | CreateSchemaStmt
                               1066                 :                :             | CreateSeqStmt
                               1067                 :                :             | CreateStmt
                               1068                 :                :             | CreateSubscriptionStmt
                               1069                 :                :             | CreateStatsStmt
                               1070                 :                :             | CreateTableSpaceStmt
                               1071                 :                :             | CreateTransformStmt
                               1072                 :                :             | CreateTrigStmt
                               1073                 :                :             | CreateEventTrigStmt
                               1074                 :                :             | CreateRoleStmt
                               1075                 :                :             | CreateUserStmt
                               1076                 :                :             | CreateUserMappingStmt
                               1077                 :                :             | CreatedbStmt
                               1078                 :                :             | DeallocateStmt
                               1079                 :                :             | DeclareCursorStmt
                               1080                 :                :             | DefineStmt
                               1081                 :                :             | DeleteStmt
                               1082                 :                :             | DiscardStmt
                               1083                 :                :             | DoStmt
                               1084                 :                :             | DropCastStmt
                               1085                 :                :             | DropOpClassStmt
                               1086                 :                :             | DropOpFamilyStmt
                               1087                 :                :             | DropOwnedStmt
                               1088                 :                :             | DropStmt
                               1089                 :                :             | DropSubscriptionStmt
                               1090                 :                :             | DropTableSpaceStmt
                               1091                 :                :             | DropTransformStmt
                               1092                 :                :             | DropRoleStmt
                               1093                 :                :             | DropUserMappingStmt
                               1094                 :                :             | DropdbStmt
                               1095                 :                :             | ExecuteStmt
                               1096                 :                :             | ExplainStmt
                               1097                 :                :             | FetchStmt
                               1098                 :                :             | GrantStmt
                               1099                 :                :             | GrantRoleStmt
                               1100                 :                :             | ImportForeignSchemaStmt
                               1101                 :                :             | IndexStmt
                               1102                 :                :             | InsertStmt
                               1103                 :                :             | ListenStmt
                               1104                 :                :             | RefreshMatViewStmt
                               1105                 :                :             | LoadStmt
                               1106                 :                :             | LockStmt
                               1107                 :                :             | MergeStmt
                               1108                 :                :             | NotifyStmt
                               1109                 :                :             | PrepareStmt
                               1110                 :                :             | ReassignOwnedStmt
                               1111                 :                :             | ReindexStmt
                               1112                 :                :             | RemoveAggrStmt
                               1113                 :                :             | RemoveFuncStmt
                               1114                 :                :             | RemoveOperStmt
                               1115                 :                :             | RenameStmt
                               1116                 :                :             | RevokeStmt
                               1117                 :                :             | RevokeRoleStmt
                               1118                 :                :             | RuleStmt
                               1119                 :                :             | SecLabelStmt
                               1120                 :                :             | SelectStmt
                               1121                 :                :             | TransactionStmt
                               1122                 :                :             | TruncateStmt
                               1123                 :                :             | UnlistenStmt
                               1124                 :                :             | UpdateStmt
                               1125                 :                :             | VacuumStmt
                               1126                 :                :             | VariableResetStmt
                               1127                 :                :             | VariableSetStmt
                               1128                 :                :             | VariableShowStmt
                               1129                 :                :             | ViewStmt
                               1130                 :                :             | /*EMPTY*/
 7403 neilc@samurai.com        1131                 :         251747 :                 { $$ = NULL; }
                               1132                 :                :         ;
                               1133                 :                : 
                               1134                 :                : /*
                               1135                 :                :  * Generic supporting productions for DDL
                               1136                 :                :  */
                               1137                 :                : opt_single_name:
  632 alvherre@alvh.no-ip.     1138                 :           2570 :             ColId                           { $$ = $1; }
                               1139                 :            736 :             | /* EMPTY */                   { $$ = NULL; }
                               1140                 :                :         ;
                               1141                 :                : 
                               1142                 :                : opt_qualified_name:
                               1143                 :            842 :             any_name                        { $$ = $1; }
                               1144                 :           7203 :             | /*EMPTY*/                     { $$ = NIL; }
                               1145                 :                :         ;
                               1146                 :                : 
                               1147                 :                : opt_concurrently:
                               1148                 :            486 :             CONCURRENTLY                    { $$ = true; }
                               1149                 :           3626 :             | /*EMPTY*/                     { $$ = false; }
                               1150                 :                :         ;
                               1151                 :                : 
                               1152                 :                : opt_drop_behavior:
                               1153                 :            953 :             CASCADE                         { $$ = DROP_CASCADE; }
                               1154                 :             84 :             | RESTRICT                      { $$ = DROP_RESTRICT; }
                               1155                 :          16842 :             | /* EMPTY */                   { $$ = DROP_RESTRICT; /* default */ }
                               1156                 :                :         ;
                               1157                 :                : 
                               1158                 :                : /*****************************************************************************
                               1159                 :                :  *
                               1160                 :                :  * CALL statement
                               1161                 :                :  *
                               1162                 :                :  *****************************************************************************/
                               1163                 :                : 
                               1164                 :                : CallStmt:   CALL func_application
                               1165                 :                :                 {
  702 peter@eisentraut.org     1166                 :            264 :                     CallStmt   *n = makeNode(CallStmt);
                               1167                 :                : 
 2327 peter_e@gmx.net          1168                 :            264 :                     n->funccall = castNode(FuncCall, $2);
  702 peter@eisentraut.org     1169                 :            264 :                     $$ = (Node *) n;
                               1170                 :                :                 }
                               1171                 :                :         ;
                               1172                 :                : 
                               1173                 :                : /*****************************************************************************
                               1174                 :                :  *
                               1175                 :                :  * Create a new Postgres DBMS role
                               1176                 :                :  *
                               1177                 :                :  *****************************************************************************/
                               1178                 :                : 
                               1179                 :                : CreateRoleStmt:
                               1180                 :                :             CREATE ROLE RoleId opt_with OptRoleList
                               1181                 :                :                 {
 6865 tgl@sss.pgh.pa.us        1182                 :            617 :                     CreateRoleStmt *n = makeNode(CreateRoleStmt);
                               1183                 :                : 
 6837                          1184                 :            617 :                     n->stmt_type = ROLESTMT_ROLE;
 6865                          1185                 :            617 :                     n->role = $3;
 8314                          1186                 :            617 :                     n->options = $5;
  702 peter@eisentraut.org     1187                 :            617 :                     $$ = (Node *) n;
                               1188                 :                :                 }
                               1189                 :                :         ;
                               1190                 :                : 
                               1191                 :                : 
                               1192                 :                : opt_with:   WITH
                               1193                 :                :             | WITH_LA
                               1194                 :                :             | /*EMPTY*/
                               1195                 :                :         ;
                               1196                 :                : 
                               1197                 :                : /*
                               1198                 :                :  * Options for CREATE ROLE and ALTER ROLE (also used by CREATE/ALTER USER
                               1199                 :                :  * for backwards compatibility).  Note: the only option required by SQL99
                               1200                 :                :  * is "WITH ADMIN name".
                               1201                 :                :  */
                               1202                 :                : OptRoleList:
 5303 alvherre@alvh.no-ip.     1203                 :            572 :             OptRoleList CreateOptRoleElem           { $$ = lappend($1, $2); }
 6865 tgl@sss.pgh.pa.us        1204                 :            849 :             | /* EMPTY */                           { $$ = NIL; }
                               1205                 :                :         ;
                               1206                 :                : 
                               1207                 :                : AlterOptRoleList:
 5303 alvherre@alvh.no-ip.     1208                 :            283 :             AlterOptRoleList AlterOptRoleElem       { $$ = lappend($1, $2); }
                               1209                 :            193 :             | /* EMPTY */                           { $$ = NIL; }
                               1210                 :                :         ;
                               1211                 :                : 
                               1212                 :                : AlterOptRoleElem:
                               1213                 :                :             PASSWORD Sconst
                               1214                 :                :                 {
 6865 tgl@sss.pgh.pa.us        1215                 :             81 :                     $$ = makeDefElem("password",
  702 peter@eisentraut.org     1216                 :             81 :                                      (Node *) makeString($2), @1);
                               1217                 :                :                 }
                               1218                 :                :             | PASSWORD NULL_P
                               1219                 :                :                 {
 2777 peter_e@gmx.net          1220                 :              6 :                     $$ = makeDefElem("password", NULL, @1);
                               1221                 :                :                 }
                               1222                 :                :             | ENCRYPTED PASSWORD Sconst
                               1223                 :                :                 {
                               1224                 :                :                     /*
                               1225                 :                :                      * These days, passwords are always stored in encrypted
                               1226                 :                :                      * form, so there is no difference between PASSWORD and
                               1227                 :                :                      * ENCRYPTED PASSWORD.
                               1228                 :                :                      */
 2533 heikki.linnakangas@i     1229                 :              6 :                     $$ = makeDefElem("password",
  702 peter@eisentraut.org     1230                 :              6 :                                      (Node *) makeString($3), @1);
                               1231                 :                :                 }
                               1232                 :                :             | UNENCRYPTED PASSWORD Sconst
                               1233                 :                :                 {
 2533 heikki.linnakangas@i     1234         [ #  # ]:UBC           0 :                     ereport(ERROR,
                               1235                 :                :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               1236                 :                :                              errmsg("UNENCRYPTED PASSWORD is no longer supported"),
                               1237                 :                :                              errhint("Remove UNENCRYPTED to store the password in encrypted form instead."),
                               1238                 :                :                              parser_errposition(@1)));
                               1239                 :                :                 }
                               1240                 :                :             | INHERIT
                               1241                 :                :                 {
  702 peter@eisentraut.org     1242                 :CBC          43 :                     $$ = makeDefElem("inherit", (Node *) makeBoolean(true), @1);
                               1243                 :                :                 }
                               1244                 :                :             | CONNECTION LIMIT SignedIconst
                               1245                 :                :                 {
                               1246                 :             12 :                     $$ = makeDefElem("connectionlimit", (Node *) makeInteger($3), @1);
                               1247                 :                :                 }
                               1248                 :                :             | VALID UNTIL Sconst
                               1249                 :                :                 {
                               1250                 :              1 :                     $$ = makeDefElem("validUntil", (Node *) makeString($3), @1);
                               1251                 :                :                 }
                               1252                 :                :         /*  Supported but not documented for roles, for use by ALTER GROUP. */
                               1253                 :                :             | USER role_list
                               1254                 :                :                 {
                               1255                 :              3 :                     $$ = makeDefElem("rolemembers", (Node *) $2, @1);
                               1256                 :                :                 }
                               1257                 :                :             | IDENT
                               1258                 :                :                 {
                               1259                 :                :                     /*
                               1260                 :                :                      * We handle identifiers that aren't parser keywords with
                               1261                 :                :                      * the following special-case codes, to avoid bloating the
                               1262                 :                :                      * size of the main parser.
                               1263                 :                :                      */
 4779 rhaas@postgresql.org     1264         [ +  + ]:            631 :                     if (strcmp($1, "superuser") == 0)
  702 peter@eisentraut.org     1265                 :             86 :                         $$ = makeDefElem("superuser", (Node *) makeBoolean(true), @1);
 4779 rhaas@postgresql.org     1266         [ +  + ]:            545 :                     else if (strcmp($1, "nosuperuser") == 0)
  702 peter@eisentraut.org     1267                 :             50 :                         $$ = makeDefElem("superuser", (Node *) makeBoolean(false), @1);
 4779 rhaas@postgresql.org     1268         [ +  + ]:            495 :                     else if (strcmp($1, "createrole") == 0)
  702 peter@eisentraut.org     1269                 :             46 :                         $$ = makeDefElem("createrole", (Node *) makeBoolean(true), @1);
 4779 rhaas@postgresql.org     1270         [ +  + ]:            449 :                     else if (strcmp($1, "nocreaterole") == 0)
  702 peter@eisentraut.org     1271                 :             19 :                         $$ = makeDefElem("createrole", (Node *) makeBoolean(false), @1);
 4779 rhaas@postgresql.org     1272         [ +  + ]:            430 :                     else if (strcmp($1, "replication") == 0)
  702 peter@eisentraut.org     1273                 :             60 :                         $$ = makeDefElem("isreplication", (Node *) makeBoolean(true), @1);
 4779 rhaas@postgresql.org     1274         [ +  + ]:            370 :                     else if (strcmp($1, "noreplication") == 0)
  702 peter@eisentraut.org     1275                 :             48 :                         $$ = makeDefElem("isreplication", (Node *) makeBoolean(false), @1);
 4779 rhaas@postgresql.org     1276         [ +  + ]:            322 :                     else if (strcmp($1, "createdb") == 0)
  702 peter@eisentraut.org     1277                 :             41 :                         $$ = makeDefElem("createdb", (Node *) makeBoolean(true), @1);
 4779 rhaas@postgresql.org     1278         [ +  + ]:            281 :                     else if (strcmp($1, "nocreatedb") == 0)
  702 peter@eisentraut.org     1279                 :             23 :                         $$ = makeDefElem("createdb", (Node *) makeBoolean(false), @1);
 4779 rhaas@postgresql.org     1280         [ +  + ]:            258 :                     else if (strcmp($1, "login") == 0)
  702 peter@eisentraut.org     1281                 :            127 :                         $$ = makeDefElem("canlogin", (Node *) makeBoolean(true), @1);
 4779 rhaas@postgresql.org     1282         [ +  + ]:            131 :                     else if (strcmp($1, "nologin") == 0)
  702 peter@eisentraut.org     1283                 :             43 :                         $$ = makeDefElem("canlogin", (Node *) makeBoolean(false), @1);
 3495 sfrost@snowman.net       1284         [ +  + ]:             88 :                     else if (strcmp($1, "bypassrls") == 0)
  702 peter@eisentraut.org     1285                 :             36 :                         $$ = makeDefElem("bypassrls", (Node *) makeBoolean(true), @1);
 3495 sfrost@snowman.net       1286         [ +  + ]:             52 :                     else if (strcmp($1, "nobypassrls") == 0)
  702 peter@eisentraut.org     1287                 :             34 :                         $$ = makeDefElem("bypassrls", (Node *) makeBoolean(false), @1);
 4779 rhaas@postgresql.org     1288         [ +  - ]:             18 :                     else if (strcmp($1, "noinherit") == 0)
                               1289                 :                :                     {
                               1290                 :                :                         /*
                               1291                 :                :                          * Note that INHERIT is a keyword, so it's handled by main parser, but
                               1292                 :                :                          * NOINHERIT is handled here.
                               1293                 :                :                          */
  702 peter@eisentraut.org     1294                 :             18 :                         $$ = makeDefElem("inherit", (Node *) makeBoolean(false), @1);
                               1295                 :                :                     }
                               1296                 :                :                     else
 4779 rhaas@postgresql.org     1297         [ #  # ]:UBC           0 :                         ereport(ERROR,
                               1298                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               1299                 :                :                                  errmsg("unrecognized role option \"%s\"", $1),
                               1300                 :                :                                      parser_errposition(@1)));
                               1301                 :                :                 }
                               1302                 :                :         ;
                               1303                 :                : 
                               1304                 :                : CreateOptRoleElem:
 5303 alvherre@alvh.no-ip.     1305                 :CBC         500 :             AlterOptRoleElem            { $$ = $1; }
                               1306                 :                :             /* The following are not supported by ALTER ROLE/USER/GROUP */
                               1307                 :                :             | SYSID Iconst
                               1308                 :                :                 {
  702 peter@eisentraut.org     1309                 :              3 :                     $$ = makeDefElem("sysid", (Node *) makeInteger($2), @1);
                               1310                 :                :                 }
                               1311                 :                :             | ADMIN role_list
                               1312                 :                :                 {
                               1313                 :             11 :                     $$ = makeDefElem("adminmembers", (Node *) $2, @1);
                               1314                 :                :                 }
                               1315                 :                :             | ROLE role_list
                               1316                 :                :                 {
                               1317                 :              8 :                     $$ = makeDefElem("rolemembers", (Node *) $2, @1);
                               1318                 :                :                 }
                               1319                 :                :             | IN_P ROLE role_list
                               1320                 :                :                 {
                               1321                 :             50 :                     $$ = makeDefElem("addroleto", (Node *) $3, @1);
                               1322                 :                :                 }
                               1323                 :                :             | IN_P GROUP_P role_list
                               1324                 :                :                 {
  702 peter@eisentraut.org     1325                 :UBC           0 :                     $$ = makeDefElem("addroleto", (Node *) $3, @1);
                               1326                 :                :                 }
                               1327                 :                :         ;
                               1328                 :                : 
                               1329                 :                : 
                               1330                 :                : /*****************************************************************************
                               1331                 :                :  *
                               1332                 :                :  * Create a new Postgres DBMS user (role with implied login ability)
                               1333                 :                :  *
                               1334                 :                :  *****************************************************************************/
                               1335                 :                : 
                               1336                 :                : CreateUserStmt:
                               1337                 :                :             CREATE USER RoleId opt_with OptRoleList
                               1338                 :                :                 {
 6865 tgl@sss.pgh.pa.us        1339                 :CBC         220 :                     CreateRoleStmt *n = makeNode(CreateRoleStmt);
                               1340                 :                : 
 6837                          1341                 :            220 :                     n->stmt_type = ROLESTMT_USER;
 6865                          1342                 :            220 :                     n->role = $3;
 6837                          1343                 :            220 :                     n->options = $5;
  702 peter@eisentraut.org     1344                 :            220 :                     $$ = (Node *) n;
                               1345                 :                :                 }
                               1346                 :                :         ;
                               1347                 :                : 
                               1348                 :                : 
                               1349                 :                : /*****************************************************************************
                               1350                 :                :  *
                               1351                 :                :  * Alter a postgresql DBMS role
                               1352                 :                :  *
                               1353                 :                :  *****************************************************************************/
                               1354                 :                : 
                               1355                 :                : AlterRoleStmt:
                               1356                 :                :             ALTER ROLE RoleSpec opt_with AlterOptRoleList
                               1357                 :                :                  {
 6865 tgl@sss.pgh.pa.us        1358                 :            153 :                     AlterRoleStmt *n = makeNode(AlterRoleStmt);
                               1359                 :                : 
                               1360                 :            153 :                     n->role = $3;
 6837                          1361                 :            153 :                     n->action = +1;  /* add, if there are members */
 6865                          1362                 :            153 :                     n->options = $5;
  702 peter@eisentraut.org     1363                 :            153 :                     $$ = (Node *) n;
                               1364                 :                :                  }
                               1365                 :                :             | ALTER USER RoleSpec opt_with AlterOptRoleList
                               1366                 :                :                  {
 2449 peter_e@gmx.net          1367                 :             40 :                     AlterRoleStmt *n = makeNode(AlterRoleStmt);
                               1368                 :                : 
                               1369                 :             40 :                     n->role = $3;
                               1370                 :             40 :                     n->action = +1;  /* add, if there are members */
                               1371                 :             40 :                     n->options = $5;
  702 peter@eisentraut.org     1372                 :             40 :                     $$ = (Node *) n;
                               1373                 :                :                  }
                               1374                 :                :         ;
                               1375                 :                : 
                               1376                 :                : opt_in_database:
 5303 alvherre@alvh.no-ip.     1377                 :             41 :                /* EMPTY */                  { $$ = NULL; }
 1404 peter@eisentraut.org     1378                 :UBC           0 :             | IN_P DATABASE name    { $$ = $3; }
                               1379                 :                :         ;
                               1380                 :                : 
                               1381                 :                : AlterRoleSetStmt:
                               1382                 :                :             ALTER ROLE RoleSpec opt_in_database SetResetClause
                               1383                 :                :                 {
 6865 tgl@sss.pgh.pa.us        1384                 :CBC          22 :                     AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
                               1385                 :                : 
                               1386                 :             22 :                     n->role = $3;
 5303 alvherre@alvh.no-ip.     1387                 :             22 :                     n->database = $4;
                               1388                 :             22 :                     n->setstmt = $5;
  702 peter@eisentraut.org     1389                 :             22 :                     $$ = (Node *) n;
                               1390                 :                :                 }
                               1391                 :                :             | ALTER ROLE ALL opt_in_database SetResetClause
                               1392                 :                :                 {
 4074 peter_e@gmx.net          1393                 :              2 :                     AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
                               1394                 :                : 
                               1395                 :              2 :                     n->role = NULL;
                               1396                 :              2 :                     n->database = $4;
                               1397                 :              2 :                     n->setstmt = $5;
  702 peter@eisentraut.org     1398                 :              2 :                     $$ = (Node *) n;
                               1399                 :                :                 }
                               1400                 :                :             | ALTER USER RoleSpec opt_in_database SetResetClause
                               1401                 :                :                 {
 2449 peter_e@gmx.net          1402                 :             13 :                     AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
                               1403                 :                : 
 6865 tgl@sss.pgh.pa.us        1404                 :             13 :                     n->role = $3;
 2449 peter_e@gmx.net          1405                 :             13 :                     n->database = $4;
                               1406                 :             13 :                     n->setstmt = $5;
  702 peter@eisentraut.org     1407                 :             13 :                     $$ = (Node *) n;
                               1408                 :                :                 }
                               1409                 :                :             | ALTER USER ALL opt_in_database SetResetClause
                               1410                 :                :                 {
 6865 tgl@sss.pgh.pa.us        1411                 :              2 :                     AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
                               1412                 :                : 
 2449 peter_e@gmx.net          1413                 :              2 :                     n->role = NULL;
                               1414                 :              2 :                     n->database = $4;
                               1415                 :              2 :                     n->setstmt = $5;
  702 peter@eisentraut.org     1416                 :              2 :                     $$ = (Node *) n;
                               1417                 :                :                 }
                               1418                 :                :         ;
                               1419                 :                : 
                               1420                 :                : 
                               1421                 :                : /*****************************************************************************
                               1422                 :                :  *
                               1423                 :                :  * Drop a postgresql DBMS role
                               1424                 :                :  *
                               1425                 :                :  * XXX Ideally this would have CASCADE/RESTRICT options, but a role
                               1426                 :                :  * might own objects in multiple databases, and there is presently no way to
                               1427                 :                :  * implement cascading to other databases.  So we always behave as RESTRICT.
                               1428                 :                :  *****************************************************************************/
                               1429                 :                : 
                               1430                 :                : DropRoleStmt:
                               1431                 :                :             DROP ROLE role_list
                               1432                 :                :                 {
 6865 tgl@sss.pgh.pa.us        1433                 :            522 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
                               1434                 :                : 
 2433 peter_e@gmx.net          1435                 :            522 :                     n->missing_ok = false;
 6865 tgl@sss.pgh.pa.us        1436                 :            522 :                     n->roles = $3;
  702 peter@eisentraut.org     1437                 :            522 :                     $$ = (Node *) n;
                               1438                 :                :                 }
                               1439                 :                :             | DROP ROLE IF_P EXISTS role_list
                               1440                 :                :                 {
 6644 andrew@dunslane.net      1441                 :             67 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
                               1442                 :                : 
 2433 peter_e@gmx.net          1443                 :             67 :                     n->missing_ok = true;
 6644 andrew@dunslane.net      1444                 :             67 :                     n->roles = $5;
  702 peter@eisentraut.org     1445                 :             67 :                     $$ = (Node *) n;
                               1446                 :                :                 }
                               1447                 :                :             | DROP USER role_list
                               1448                 :                :                 {
 6865 tgl@sss.pgh.pa.us        1449                 :            198 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
                               1450                 :                : 
 2433 peter_e@gmx.net          1451                 :            198 :                     n->missing_ok = false;
 6865 tgl@sss.pgh.pa.us        1452                 :            198 :                     n->roles = $3;
  702 peter@eisentraut.org     1453                 :            198 :                     $$ = (Node *) n;
                               1454                 :                :                 }
                               1455                 :                :             | DROP USER IF_P EXISTS role_list
                               1456                 :                :                 {
 6644 andrew@dunslane.net      1457                 :             18 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
                               1458                 :                : 
                               1459                 :             18 :                     n->roles = $5;
 2433 peter_e@gmx.net          1460                 :             18 :                     n->missing_ok = true;
  702 peter@eisentraut.org     1461                 :             18 :                     $$ = (Node *) n;
                               1462                 :                :                 }
                               1463                 :                :             | DROP GROUP_P role_list
                               1464                 :                :                 {
 2449 peter_e@gmx.net          1465                 :             18 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
                               1466                 :                : 
 2433                          1467                 :             18 :                     n->missing_ok = false;
 2449                          1468                 :             18 :                     n->roles = $3;
  702 peter@eisentraut.org     1469                 :             18 :                     $$ = (Node *) n;
                               1470                 :                :                 }
                               1471                 :                :             | DROP GROUP_P IF_P EXISTS role_list
                               1472                 :                :                 {
 2449 peter_e@gmx.net          1473                 :              3 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
                               1474                 :                : 
 2433                          1475                 :              3 :                     n->missing_ok = true;
 2449                          1476                 :              3 :                     n->roles = $5;
  702 peter@eisentraut.org     1477                 :              3 :                     $$ = (Node *) n;
                               1478                 :                :                 }
                               1479                 :                :             ;
                               1480                 :                : 
                               1481                 :                : 
                               1482                 :                : /*****************************************************************************
                               1483                 :                :  *
                               1484                 :                :  * Create a postgresql group (role without login ability)
                               1485                 :                :  *
                               1486                 :                :  *****************************************************************************/
                               1487                 :                : 
                               1488                 :                : CreateGroupStmt:
                               1489                 :                :             CREATE GROUP_P RoleId opt_with OptRoleList
                               1490                 :                :                 {
 6865 tgl@sss.pgh.pa.us        1491                 :             12 :                     CreateRoleStmt *n = makeNode(CreateRoleStmt);
                               1492                 :                : 
 6837                          1493                 :             12 :                     n->stmt_type = ROLESTMT_GROUP;
 6865                          1494                 :             12 :                     n->role = $3;
 8312                          1495                 :             12 :                     n->options = $5;
  702 peter@eisentraut.org     1496                 :             12 :                     $$ = (Node *) n;
                               1497                 :                :                 }
                               1498                 :                :         ;
                               1499                 :                : 
                               1500                 :                : 
                               1501                 :                : /*****************************************************************************
                               1502                 :                :  *
                               1503                 :                :  * Alter a postgresql group
                               1504                 :                :  *
                               1505                 :                :  *****************************************************************************/
                               1506                 :                : 
                               1507                 :                : AlterGroupStmt:
                               1508                 :                :             ALTER GROUP_P RoleSpec add_drop USER role_list
                               1509                 :                :                 {
 6865 tgl@sss.pgh.pa.us        1510                 :             15 :                     AlterRoleStmt *n = makeNode(AlterRoleStmt);
                               1511                 :                : 
                               1512                 :             15 :                     n->role = $3;
 7972 bruce@momjian.us         1513                 :             15 :                     n->action = $4;
 6865 tgl@sss.pgh.pa.us        1514                 :             15 :                     n->options = list_make1(makeDefElem("rolemembers",
                               1515                 :                :                                                         (Node *) $6, @6));
  702 peter@eisentraut.org     1516                 :             15 :                     $$ = (Node *) n;
                               1517                 :                :                 }
                               1518                 :                :         ;
                               1519                 :                : 
 6291 tgl@sss.pgh.pa.us        1520                 :             40 : add_drop:   ADD_P                                   { $$ = +1; }
 6865                          1521                 :             75 :             | DROP                                  { $$ = -1; }
                               1522                 :                :         ;
                               1523                 :                : 
                               1524                 :                : 
                               1525                 :                : /*****************************************************************************
                               1526                 :                :  *
                               1527                 :                :  * Manipulate a schema
                               1528                 :                :  *
                               1529                 :                :  *****************************************************************************/
                               1530                 :                : 
                               1531                 :                : CreateSchemaStmt:
                               1532                 :                :             CREATE SCHEMA opt_single_name AUTHORIZATION RoleSpec OptSchemaEltList
                               1533                 :                :                 {
 8060                          1534                 :             79 :                     CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
                               1535                 :                : 
                               1536                 :                :                     /* One can omit the schema name or the authorization id. */
 3324 alvherre@alvh.no-ip.     1537                 :             79 :                     n->schemaname = $3;
                               1538                 :             79 :                     n->authrole = $5;
 7100 tgl@sss.pgh.pa.us        1539                 :             79 :                     n->schemaElts = $6;
 4211                          1540                 :             79 :                     n->if_not_exists = false;
  702 peter@eisentraut.org     1541                 :             79 :                     $$ = (Node *) n;
                               1542                 :                :                 }
                               1543                 :                :             | CREATE SCHEMA ColId OptSchemaEltList
                               1544                 :                :                 {
 8060 tgl@sss.pgh.pa.us        1545                 :            391 :                     CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
                               1546                 :                : 
                               1547                 :                :                     /* ...but not both */
                               1548                 :            391 :                     n->schemaname = $3;
 3324 alvherre@alvh.no-ip.     1549                 :            391 :                     n->authrole = NULL;
 7100 tgl@sss.pgh.pa.us        1550                 :            391 :                     n->schemaElts = $4;
 4211                          1551                 :            391 :                     n->if_not_exists = false;
  702 peter@eisentraut.org     1552                 :            391 :                     $$ = (Node *) n;
                               1553                 :                :                 }
                               1554                 :                :             | CREATE SCHEMA IF_P NOT EXISTS opt_single_name AUTHORIZATION RoleSpec OptSchemaEltList
                               1555                 :                :                 {
 4211 tgl@sss.pgh.pa.us        1556                 :              9 :                     CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
                               1557                 :                : 
                               1558                 :                :                     /* schema name can be omitted here, too */
 3324 alvherre@alvh.no-ip.     1559                 :              9 :                     n->schemaname = $6;
                               1560                 :              9 :                     n->authrole = $8;
 4211 tgl@sss.pgh.pa.us        1561         [ -  + ]:              9 :                     if ($9 != NIL)
 4211 tgl@sss.pgh.pa.us        1562         [ #  # ]:UBC           0 :                         ereport(ERROR,
                               1563                 :                :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               1564                 :                :                                  errmsg("CREATE SCHEMA IF NOT EXISTS cannot include schema elements"),
                               1565                 :                :                                  parser_errposition(@9)));
 4211 tgl@sss.pgh.pa.us        1566                 :CBC           9 :                     n->schemaElts = $9;
                               1567                 :              9 :                     n->if_not_exists = true;
  702 peter@eisentraut.org     1568                 :              9 :                     $$ = (Node *) n;
                               1569                 :                :                 }
                               1570                 :                :             | CREATE SCHEMA IF_P NOT EXISTS ColId OptSchemaEltList
                               1571                 :                :                 {
 4211 tgl@sss.pgh.pa.us        1572                 :             17 :                     CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
                               1573                 :                : 
                               1574                 :                :                     /* ...but not here */
                               1575                 :             17 :                     n->schemaname = $6;
 3324 alvherre@alvh.no-ip.     1576                 :             17 :                     n->authrole = NULL;
 4211 tgl@sss.pgh.pa.us        1577         [ +  + ]:             17 :                     if ($7 != NIL)
                               1578         [ +  - ]:              3 :                         ereport(ERROR,
                               1579                 :                :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               1580                 :                :                                  errmsg("CREATE SCHEMA IF NOT EXISTS cannot include schema elements"),
                               1581                 :                :                                  parser_errposition(@7)));
                               1582                 :             14 :                     n->schemaElts = $7;
                               1583                 :             14 :                     n->if_not_exists = true;
  702 peter@eisentraut.org     1584                 :             14 :                     $$ = (Node *) n;
                               1585                 :                :                 }
                               1586                 :                :         ;
                               1587                 :                : 
                               1588                 :                : OptSchemaEltList:
                               1589                 :                :             OptSchemaEltList schema_stmt
                               1590                 :                :                 {
 4210 tgl@sss.pgh.pa.us        1591         [ +  + ]:            254 :                     if (@$ < 0)          /* see comments for YYLLOC_DEFAULT */
                               1592                 :            118 :                         @$ = @2;
                               1593                 :            254 :                     $$ = lappend($1, $2);
                               1594                 :                :                 }
                               1595                 :                :             | /* EMPTY */
                               1596                 :            496 :                 { $$ = NIL; }
                               1597                 :                :         ;
                               1598                 :                : 
                               1599                 :                : /*
                               1600                 :                :  *  schema_stmt are the ones that can show up inside a CREATE SCHEMA
                               1601                 :                :  *  statement (in addition to by themselves).
                               1602                 :                :  */
                               1603                 :                : schema_stmt:
                               1604                 :                :             CreateStmt
                               1605                 :                :             | IndexStmt
                               1606                 :                :             | CreateSeqStmt
                               1607                 :                :             | CreateTrigStmt
                               1608                 :                :             | GrantStmt
                               1609                 :                :             | ViewStmt
                               1610                 :                :         ;
                               1611                 :                : 
                               1612                 :                : 
                               1613                 :                : /*****************************************************************************
                               1614                 :                :  *
                               1615                 :                :  * Set PG internal variable
                               1616                 :                :  *    SET name TO 'var_value'
                               1617                 :                :  * Include SQL syntax (thomas 1997-10-22):
                               1618                 :                :  *    SET TIME ZONE 'var_value'
                               1619                 :                :  *
                               1620                 :                :  *****************************************************************************/
                               1621                 :                : 
                               1622                 :                : VariableSetStmt:
                               1623                 :                :             SET set_rest
                               1624                 :                :                 {
 8003                          1625                 :           9315 :                     VariableSetStmt *n = $2;
                               1626                 :                : 
                               1627                 :           9315 :                     n->is_local = false;
 9715 bruce@momjian.us         1628                 :           9315 :                     $$ = (Node *) n;
                               1629                 :                :                 }
                               1630                 :                :             | SET LOCAL set_rest
                               1631                 :                :                 {
 8003 tgl@sss.pgh.pa.us        1632                 :            554 :                     VariableSetStmt *n = $3;
                               1633                 :                : 
                               1634                 :            554 :                     n->is_local = true;
 9715 bruce@momjian.us         1635                 :            554 :                     $$ = (Node *) n;
                               1636                 :                :                 }
                               1637                 :                :             | SET SESSION set_rest
                               1638                 :                :                 {
 8003 tgl@sss.pgh.pa.us        1639                 :             40 :                     VariableSetStmt *n = $3;
                               1640                 :                : 
                               1641                 :             40 :                     n->is_local = false;
 9715 bruce@momjian.us         1642                 :             40 :                     $$ = (Node *) n;
                               1643                 :                :                 }
                               1644                 :                :         ;
                               1645                 :                : 
                               1646                 :                : set_rest:
                               1647                 :                :             TRANSACTION transaction_mode_list
                               1648                 :                :                 {
 4442 rhaas@postgresql.org     1649                 :            264 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1650                 :                : 
                               1651                 :            264 :                     n->kind = VAR_SET_MULTI;
                               1652                 :            264 :                     n->name = "TRANSACTION";
                               1653                 :            264 :                     n->args = $2;
                               1654                 :            264 :                     $$ = n;
                               1655                 :                :                 }
                               1656                 :                :             | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
                               1657                 :                :                 {
                               1658                 :              6 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1659                 :                : 
                               1660                 :              6 :                     n->kind = VAR_SET_MULTI;
                               1661                 :              6 :                     n->name = "SESSION CHARACTERISTICS";
                               1662                 :              6 :                     n->args = $5;
                               1663                 :              6 :                     $$ = n;
                               1664                 :                :                 }
                               1665                 :                :             | set_rest_more
                               1666                 :                :             ;
                               1667                 :                : 
                               1668                 :                : generic_set:
                               1669                 :                :             var_name TO var_list
                               1670                 :                :                 {
 9249 vadim4o@yahoo.com        1671                 :           2195 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1672                 :                : 
 6068 tgl@sss.pgh.pa.us        1673                 :           2195 :                     n->kind = VAR_SET_VALUE;
 8003                          1674                 :           2195 :                     n->name = $1;
                               1675                 :           2195 :                     n->args = $3;
                               1676                 :           2195 :                     $$ = n;
                               1677                 :                :                 }
                               1678                 :                :             | var_name '=' var_list
                               1679                 :                :                 {
 8542 peter_e@gmx.net          1680                 :           6307 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1681                 :                : 
 6068 tgl@sss.pgh.pa.us        1682                 :           6307 :                     n->kind = VAR_SET_VALUE;
 8003                          1683                 :           6307 :                     n->name = $1;
                               1684                 :           6307 :                     n->args = $3;
  492 akorotkov@postgresql     1685                 :           6307 :                     $$ = n;
                               1686                 :                :                 }
                               1687                 :                :             | var_name TO DEFAULT
                               1688                 :                :                 {
 6068 tgl@sss.pgh.pa.us        1689                 :             63 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1690                 :                : 
                               1691                 :             63 :                     n->kind = VAR_SET_DEFAULT;
                               1692                 :             63 :                     n->name = $1;
                               1693                 :             63 :                     $$ = n;
                               1694                 :                :                 }
                               1695                 :                :             | var_name '=' DEFAULT
                               1696                 :                :                 {
                               1697                 :              3 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1698                 :                : 
                               1699                 :              3 :                     n->kind = VAR_SET_DEFAULT;
                               1700                 :              3 :                     n->name = $1;
                               1701                 :              3 :                     $$ = n;
                               1702                 :                :                 }
                               1703                 :                :         ;
                               1704                 :                : 
                               1705                 :                : set_rest_more:  /* Generic SET syntaxes: */
 1250 peter@eisentraut.org     1706                 :           8513 :             generic_set                         {$$ = $1;}
                               1707                 :                :             | var_name FROM CURRENT_P
                               1708                 :                :                 {
 6068 tgl@sss.pgh.pa.us        1709                 :UBC           0 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1710                 :                : 
                               1711                 :              0 :                     n->kind = VAR_SET_CURRENT;
                               1712                 :              0 :                     n->name = $1;
                               1713                 :              0 :                     $$ = n;
                               1714                 :                :                 }
                               1715                 :                :             /* Special syntaxes mandated by SQL standard: */
                               1716                 :                :             | TIME ZONE zone_value
                               1717                 :                :                 {
 9396 scrappy@hub.org          1718                 :CBC          46 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1719                 :                : 
 6068 tgl@sss.pgh.pa.us        1720                 :             46 :                     n->kind = VAR_SET_VALUE;
 8003                          1721                 :             46 :                     n->name = "timezone";
 8072 lockhart@fourpalms.o     1722         [ +  + ]:             46 :                     if ($3 != NULL)
 7259 neilc@samurai.com        1723                 :             40 :                         n->args = list_make1($3);
                               1724                 :                :                     else
 6068 tgl@sss.pgh.pa.us        1725                 :              6 :                         n->kind = VAR_SET_DEFAULT;
 8003                          1726                 :             46 :                     $$ = n;
                               1727                 :                :                 }
                               1728                 :                :             | CATALOG_P Sconst
                               1729                 :                :                 {
 5648 peter_e@gmx.net          1730         [ #  # ]:UBC           0 :                     ereport(ERROR,
                               1731                 :                :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               1732                 :                :                              errmsg("current database cannot be changed"),
                               1733                 :                :                              parser_errposition(@2)));
                               1734                 :                :                     $$ = NULL; /*not reached*/
                               1735                 :                :                 }
                               1736                 :                :             | SCHEMA Sconst
                               1737                 :                :                 {
                               1738                 :              0 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1739                 :                : 
                               1740                 :              0 :                     n->kind = VAR_SET_VALUE;
                               1741                 :              0 :                     n->name = "search_path";
                               1742                 :              0 :                     n->args = list_make1(makeStringConst($2, @2));
                               1743                 :              0 :                     $$ = n;
                               1744                 :                :                 }
                               1745                 :                :             | NAMES opt_encoding
                               1746                 :                :                 {
 8003 tgl@sss.pgh.pa.us        1747                 :              0 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1748                 :                : 
 6068                          1749                 :              0 :                     n->kind = VAR_SET_VALUE;
 8003                          1750                 :              0 :                     n->name = "client_encoding";
                               1751         [ #  # ]:              0 :                     if ($2 != NULL)
 5708                          1752                 :              0 :                         n->args = list_make1(makeStringConst($2, @2));
                               1753                 :                :                     else
 6068                          1754                 :              0 :                         n->kind = VAR_SET_DEFAULT;
 8003                          1755                 :              0 :                     $$ = n;
                               1756                 :                :                 }
                               1757                 :                :             | ROLE NonReservedWord_or_Sconst
                               1758                 :                :                 {
 6838 tgl@sss.pgh.pa.us        1759                 :CBC         411 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1760                 :                : 
 6068                          1761                 :            411 :                     n->kind = VAR_SET_VALUE;
 6838                          1762                 :            411 :                     n->name = "role";
 5708                          1763                 :            411 :                     n->args = list_make1(makeStringConst($2, @2));
 6838                          1764                 :            411 :                     $$ = n;
                               1765                 :                :                 }
                               1766                 :                :             | SESSION AUTHORIZATION NonReservedWord_or_Sconst
                               1767                 :                :                 {
 8003                          1768                 :           1247 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1769                 :                : 
 6068                          1770                 :           1247 :                     n->kind = VAR_SET_VALUE;
 8003                          1771                 :           1247 :                     n->name = "session_authorization";
 5708                          1772                 :           1247 :                     n->args = list_make1(makeStringConst($3, @3));
 8003                          1773                 :           1247 :                     $$ = n;
                               1774                 :                :                 }
                               1775                 :                :             | SESSION AUTHORIZATION DEFAULT
                               1776                 :                :                 {
 8014                          1777                 :              2 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1778                 :                : 
 6068                          1779                 :              2 :                     n->kind = VAR_SET_DEFAULT;
 8014                          1780                 :              2 :                     n->name = "session_authorization";
 8003                          1781                 :              2 :                     $$ = n;
                               1782                 :                :                 }
                               1783                 :                :             | XML_P OPTION document_or_content
                               1784                 :                :                 {
 6289 peter_e@gmx.net          1785                 :              6 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1786                 :                : 
 6068 tgl@sss.pgh.pa.us        1787                 :              6 :                     n->kind = VAR_SET_VALUE;
 6289 peter_e@gmx.net          1788                 :              6 :                     n->name = "xmloption";
 5708 tgl@sss.pgh.pa.us        1789         [ +  + ]:              6 :                     n->args = list_make1(makeStringConst($3 == XMLOPTION_DOCUMENT ? "DOCUMENT" : "CONTENT", @3));
 6289 peter_e@gmx.net          1790                 :              6 :                     $$ = n;
                               1791                 :                :                 }
                               1792                 :                :             /* Special syntaxes invented by PostgreSQL: */
                               1793                 :                :             | TRANSACTION SNAPSHOT Sconst
                               1794                 :                :                 {
 4558 tgl@sss.pgh.pa.us        1795                 :             24 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1796                 :                : 
                               1797                 :             24 :                     n->kind = VAR_SET_MULTI;
                               1798                 :             24 :                     n->name = "TRANSACTION SNAPSHOT";
                               1799                 :             24 :                     n->args = list_make1(makeStringConst($3, @3));
                               1800                 :             24 :                     $$ = n;
                               1801                 :                :                 }
                               1802                 :                :         ;
                               1803                 :                : 
 6068                          1804                 :          10600 : var_name:   ColId                               { $$ = $1; }
                               1805                 :                :             | var_name '.' ColId
 3836 peter_e@gmx.net          1806                 :            193 :                 { $$ = psprintf("%s.%s", $1, $3); }
                               1807                 :                :         ;
                               1808                 :                : 
 7259 neilc@samurai.com        1809                 :           8502 : var_list:   var_value                               { $$ = list_make1($1); }
 7972 bruce@momjian.us         1810                 :             89 :             | var_list ',' var_value                { $$ = lappend($1, $3); }
                               1811                 :                :         ;
                               1812                 :                : 
                               1813                 :                : var_value:  opt_boolean_or_string
 5708 tgl@sss.pgh.pa.us        1814                 :           6428 :                 { $$ = makeStringConst($1, @1); }
                               1815                 :                :             | NumericOnly
                               1816                 :           2163 :                 { $$ = makeAConst($1, @1); }
                               1817                 :                :         ;
                               1818                 :                : 
 7465 peter_e@gmx.net          1819                 :UBC           0 : iso_level:  READ UNCOMMITTED                        { $$ = "read uncommitted"; }
 7465 peter_e@gmx.net          1820                 :CBC         442 :             | READ COMMITTED                        { $$ = "read committed"; }
                               1821                 :           1235 :             | REPEATABLE READ                       { $$ = "repeatable read"; }
 7972 bruce@momjian.us         1822                 :           1610 :             | SERIALIZABLE                          { $$ = "serializable"; }
                               1823                 :                :         ;
                               1824                 :                : 
                               1825                 :                : opt_boolean_or_string:
                               1826                 :            274 :             TRUE_P                                  { $$ = "true"; }
                               1827                 :            629 :             | FALSE_P                               { $$ = "false"; }
                               1828                 :            964 :             | ON                                    { $$ = "on"; }
                               1829                 :                :             /*
                               1830                 :                :              * OFF is also accepted as a boolean value, but is handled by
                               1831                 :                :              * the NonReservedWord rule.  The action for booleans and strings
                               1832                 :                :              * is the same, so we don't need to distinguish them here.
                               1833                 :                :              */
 3969 tgl@sss.pgh.pa.us        1834                 :          12728 :             | NonReservedWord_or_Sconst             { $$ = $1; }
                               1835                 :                :         ;
                               1836                 :                : 
                               1837                 :                : /* Timezone values can be:
                               1838                 :                :  * - a string such as 'pst8pdt'
                               1839                 :                :  * - an identifier such as "pst8pdt"
                               1840                 :                :  * - an integer or floating point number
                               1841                 :                :  * - a time interval per SQL99
                               1842                 :                :  * ColId gives reduce/reduce errors against ConstInterval and LOCAL,
                               1843                 :                :  * so use IDENT (meaning we reject anything that is a key word).
                               1844                 :                :  */
                               1845                 :                : zone_value:
                               1846                 :                :             Sconst
                               1847                 :                :                 {
 5708                          1848                 :             27 :                     $$ = makeStringConst($1, @1);
                               1849                 :                :                 }
                               1850                 :                :             | IDENT
                               1851                 :                :                 {
                               1852                 :              1 :                     $$ = makeStringConst($1, @1);
                               1853                 :                :                 }
                               1854                 :                :             | ConstInterval Sconst opt_interval
                               1855                 :                :                 {
  702 peter@eisentraut.org     1856                 :UBC           0 :                     TypeName   *t = $1;
                               1857                 :                : 
 5694 tgl@sss.pgh.pa.us        1858         [ #  # ]:              0 :                     if ($3 != NIL)
                               1859                 :                :                     {
  702 peter@eisentraut.org     1860                 :              0 :                         A_Const    *n = (A_Const *) linitial($3);
                               1861                 :                : 
  821                          1862         [ #  # ]:              0 :                         if ((n->val.ival.ival & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
 7575 tgl@sss.pgh.pa.us        1863         [ #  # ]:              0 :                             ereport(ERROR,
                               1864                 :                :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                               1865                 :                :                                      errmsg("time zone interval must be HOUR or HOUR TO MINUTE"),
                               1866                 :                :                                      parser_errposition(@3)));
                               1867                 :                :                     }
 5694                          1868                 :              0 :                     t->typmods = $3;
 5708                          1869                 :              0 :                     $$ = makeStringConstCast($2, @2, t);
                               1870                 :                :                 }
                               1871                 :                :             | ConstInterval '(' Iconst ')' Sconst
                               1872                 :                :                 {
  702 peter@eisentraut.org     1873                 :              0 :                     TypeName   *t = $1;
                               1874                 :                : 
 3466 bruce@momjian.us         1875                 :              0 :                     t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
                               1876                 :                :                                             makeIntConst($3, @3));
 5708 tgl@sss.pgh.pa.us        1877                 :              0 :                     $$ = makeStringConstCast($5, @5, t);
                               1878                 :                :                 }
 5708 tgl@sss.pgh.pa.us        1879                 :CBC          12 :             | NumericOnly                           { $$ = makeAConst($1, @1); }
 7972 bruce@momjian.us         1880                 :              6 :             | DEFAULT                               { $$ = NULL; }
 7972 bruce@momjian.us         1881                 :UBC           0 :             | LOCAL                                 { $$ = NULL; }
                               1882                 :                :         ;
                               1883                 :                : 
                               1884                 :                : opt_encoding:
                               1885                 :              0 :             Sconst                                  { $$ = $1; }
                               1886                 :              0 :             | DEFAULT                               { $$ = NULL; }
                               1887                 :              0 :             | /*EMPTY*/                             { $$ = NULL; }
                               1888                 :                :         ;
                               1889                 :                : 
                               1890                 :                : NonReservedWord_or_Sconst:
 3969 tgl@sss.pgh.pa.us        1891                 :CBC       22331 :             NonReservedWord                         { $$ = $1; }
 5632 meskes@postgresql.or     1892                 :           2388 :             | Sconst                                { $$ = $1; }
                               1893                 :                :         ;
                               1894                 :                : 
                               1895                 :                : VariableResetStmt:
 3512 fujii@postgresql.org     1896                 :           1997 :             RESET reset_rest                        { $$ = (Node *) $2; }
                               1897                 :                :         ;
                               1898                 :                : 
                               1899                 :                : reset_rest:
                               1900                 :           1619 :             generic_reset                           { $$ = $1; }
                               1901                 :                :             | TIME ZONE
                               1902                 :                :                 {
 6068 tgl@sss.pgh.pa.us        1903                 :              6 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1904                 :                : 
                               1905                 :              6 :                     n->kind = VAR_RESET;
 3512 fujii@postgresql.org     1906                 :              6 :                     n->name = "timezone";
                               1907                 :              6 :                     $$ = n;
                               1908                 :                :                 }
                               1909                 :                :             | TRANSACTION ISOLATION LEVEL
                               1910                 :                :                 {
 6068 tgl@sss.pgh.pa.us        1911                 :UBC           0 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1912                 :                : 
                               1913                 :              0 :                     n->kind = VAR_RESET;
 3512 fujii@postgresql.org     1914                 :              0 :                     n->name = "transaction_isolation";
                               1915                 :              0 :                     $$ = n;
                               1916                 :                :                 }
                               1917                 :                :             | SESSION AUTHORIZATION
                               1918                 :                :                 {
 6068 tgl@sss.pgh.pa.us        1919                 :CBC         372 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1920                 :                : 
                               1921                 :            372 :                     n->kind = VAR_RESET;
 3512 fujii@postgresql.org     1922                 :            372 :                     n->name = "session_authorization";
                               1923                 :            372 :                     $$ = n;
                               1924                 :                :                 }
                               1925                 :                :         ;
                               1926                 :                : 
                               1927                 :                : generic_reset:
                               1928                 :                :             var_name
                               1929                 :                :                 {
 6068 tgl@sss.pgh.pa.us        1930                 :           1635 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1931                 :                : 
                               1932                 :           1635 :                     n->kind = VAR_RESET;
 3512 fujii@postgresql.org     1933                 :           1635 :                     n->name = $1;
                               1934                 :           1635 :                     $$ = n;
                               1935                 :                :                 }
                               1936                 :                :             | ALL
                               1937                 :                :                 {
 6068 tgl@sss.pgh.pa.us        1938                 :              8 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1939                 :                : 
                               1940                 :              8 :                     n->kind = VAR_RESET_ALL;
 3512 fujii@postgresql.org     1941                 :              8 :                     $$ = n;
                               1942                 :                :                 }
                               1943                 :                :         ;
                               1944                 :                : 
                               1945                 :                : /* SetResetClause allows SET or RESET without LOCAL */
                               1946                 :                : SetResetClause:
 6068 tgl@sss.pgh.pa.us        1947                 :            560 :             SET set_rest                    { $$ = $2; }
                               1948                 :             14 :             | VariableResetStmt             { $$ = (VariableSetStmt *) $1; }
                               1949                 :                :         ;
                               1950                 :                : 
                               1951                 :                : /* SetResetClause allows SET or RESET without LOCAL */
                               1952                 :                : FunctionSetResetClause:
 4442 rhaas@postgresql.org     1953                 :             50 :             SET set_rest_more               { $$ = $2; }
                               1954                 :              6 :             | VariableResetStmt             { $$ = (VariableSetStmt *) $1; }
                               1955                 :                :         ;
                               1956                 :                : 
                               1957                 :                : 
                               1958                 :                : VariableShowStmt:
                               1959                 :                :             SHOW var_name
                               1960                 :                :                 {
 6068 tgl@sss.pgh.pa.us        1961                 :            397 :                     VariableShowStmt *n = makeNode(VariableShowStmt);
                               1962                 :                : 
 8003                          1963                 :            397 :                     n->name = $2;
 9715 bruce@momjian.us         1964                 :            397 :                     $$ = (Node *) n;
                               1965                 :                :                 }
                               1966                 :                :             | SHOW TIME ZONE
                               1967                 :                :                 {
 6068 tgl@sss.pgh.pa.us        1968                 :              4 :                     VariableShowStmt *n = makeNode(VariableShowStmt);
                               1969                 :                : 
 8003                          1970                 :              4 :                     n->name = "timezone";
 9663 lockhart@fourpalms.o     1971                 :              4 :                     $$ = (Node *) n;
                               1972                 :                :                 }
                               1973                 :                :             | SHOW TRANSACTION ISOLATION LEVEL
                               1974                 :                :                 {
 6068 tgl@sss.pgh.pa.us        1975                 :              1 :                     VariableShowStmt *n = makeNode(VariableShowStmt);
                               1976                 :                : 
 7765 peter_e@gmx.net          1977                 :              1 :                     n->name = "transaction_isolation";
 9249 vadim4o@yahoo.com        1978                 :              1 :                     $$ = (Node *) n;
                               1979                 :                :                 }
                               1980                 :                :             | SHOW SESSION AUTHORIZATION
                               1981                 :                :                 {
 6068 tgl@sss.pgh.pa.us        1982                 :UBC           0 :                     VariableShowStmt *n = makeNode(VariableShowStmt);
                               1983                 :                : 
 8014                          1984                 :              0 :                     n->name = "session_authorization";
                               1985                 :              0 :                     $$ = (Node *) n;
                               1986                 :                :                 }
                               1987                 :                :             | SHOW ALL
                               1988                 :                :                 {
 6068                          1989                 :              0 :                     VariableShowStmt *n = makeNode(VariableShowStmt);
                               1990                 :                : 
 8003                          1991                 :              0 :                     n->name = "all";
 8347 bruce@momjian.us         1992                 :              0 :                     $$ = (Node *) n;
                               1993                 :                :                 }
                               1994                 :                :         ;
                               1995                 :                : 
                               1996                 :                : 
                               1997                 :                : ConstraintsSetStmt:
                               1998                 :                :             SET CONSTRAINTS constraints_set_list constraints_set_mode
                               1999                 :                :                 {
 8964 JanWieck@Yahoo.com       2000                 :CBC          52 :                     ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt);
                               2001                 :                : 
                               2002                 :             52 :                     n->constraints = $3;
 4548 peter_e@gmx.net          2003                 :             52 :                     n->deferred = $4;
 8964 JanWieck@Yahoo.com       2004                 :             52 :                     $$ = (Node *) n;
                               2005                 :                :                 }
                               2006                 :                :         ;
                               2007                 :                : 
                               2008                 :                : constraints_set_list:
 7972 bruce@momjian.us         2009                 :             28 :             ALL                                     { $$ = NIL; }
 6562                          2010                 :             24 :             | qualified_name_list                   { $$ = $1; }
                               2011                 :                :         ;
                               2012                 :                : 
                               2013                 :                : constraints_set_mode:
 2433 peter_e@gmx.net          2014                 :             34 :             DEFERRED                                { $$ = true; }
                               2015                 :             18 :             | IMMEDIATE                             { $$ = false; }
                               2016                 :                :         ;
                               2017                 :                : 
                               2018                 :                : 
                               2019                 :                : /*
                               2020                 :                :  * Checkpoint statement
                               2021                 :                :  */
                               2022                 :                : CheckPointStmt:
                               2023                 :                :             CHECKPOINT
                               2024                 :                :                 {
 8561 vadim4o@yahoo.com        2025                 :            104 :                     CheckPointStmt *n = makeNode(CheckPointStmt);
                               2026                 :                : 
  702 peter@eisentraut.org     2027                 :            104 :                     $$ = (Node *) n;
                               2028                 :                :                 }
                               2029                 :                :         ;
                               2030                 :                : 
                               2031                 :                : 
                               2032                 :                : /*****************************************************************************
                               2033                 :                :  *
                               2034                 :                :  * DISCARD { ALL | TEMP | PLANS | SEQUENCES }
                               2035                 :                :  *
                               2036                 :                :  *****************************************************************************/
                               2037                 :                : 
                               2038                 :                : DiscardStmt:
                               2039                 :                :             DISCARD ALL
                               2040                 :                :                 {
 6198 neilc@samurai.com        2041                 :              3 :                     DiscardStmt *n = makeNode(DiscardStmt);
                               2042                 :                : 
                               2043                 :              3 :                     n->target = DISCARD_ALL;
                               2044                 :              3 :                     $$ = (Node *) n;
                               2045                 :                :                 }
                               2046                 :                :             | DISCARD TEMP
                               2047                 :                :                 {
                               2048                 :              4 :                     DiscardStmt *n = makeNode(DiscardStmt);
                               2049                 :                : 
                               2050                 :              4 :                     n->target = DISCARD_TEMP;
                               2051                 :              4 :                     $$ = (Node *) n;
                               2052                 :                :                 }
                               2053                 :                :             | DISCARD TEMPORARY
                               2054                 :                :                 {
 6198 neilc@samurai.com        2055                 :UBC           0 :                     DiscardStmt *n = makeNode(DiscardStmt);
                               2056                 :                : 
                               2057                 :              0 :                     n->target = DISCARD_TEMP;
                               2058                 :              0 :                     $$ = (Node *) n;
                               2059                 :                :                 }
                               2060                 :                :             | DISCARD PLANS
                               2061                 :                :                 {
 6198 neilc@samurai.com        2062                 :CBC           2 :                     DiscardStmt *n = makeNode(DiscardStmt);
                               2063                 :                : 
                               2064                 :              2 :                     n->target = DISCARD_PLANS;
                               2065                 :              2 :                     $$ = (Node *) n;
                               2066                 :                :                 }
                               2067                 :                :             | DISCARD SEQUENCES
                               2068                 :                :                 {
 3846 rhaas@postgresql.org     2069                 :              6 :                     DiscardStmt *n = makeNode(DiscardStmt);
                               2070                 :                : 
                               2071                 :              6 :                     n->target = DISCARD_SEQUENCES;
                               2072                 :              6 :                     $$ = (Node *) n;
                               2073                 :                :                 }
                               2074                 :                : 
                               2075                 :                :         ;
                               2076                 :                : 
                               2077                 :                : 
                               2078                 :                : /*****************************************************************************
                               2079                 :                :  *
                               2080                 :                :  *  ALTER [ TABLE | INDEX | SEQUENCE | VIEW | MATERIALIZED VIEW | FOREIGN TABLE ] variations
                               2081                 :                :  *
                               2082                 :                :  * Note: we accept all subcommands for each of the variants, and sort
                               2083                 :                :  * out what's really legal at execution time.
                               2084                 :                :  *****************************************************************************/
                               2085                 :                : 
                               2086                 :                : AlterTableStmt:
                               2087                 :                :             ALTER TABLE relation_expr alter_table_cmds
                               2088                 :                :                 {
 8825 lockhart@fourpalms.o     2089                 :          10946 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2090                 :                : 
 8060 tgl@sss.pgh.pa.us        2091                 :          10946 :                     n->relation = $3;
 7284                          2092                 :          10946 :                     n->cmds = $4;
 1373 michael@paquier.xyz      2093                 :          10946 :                     n->objtype = OBJECT_TABLE;
 4465 simon@2ndQuadrant.co     2094                 :          10946 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2095                 :          10946 :                     $$ = (Node *) n;
                               2096                 :                :                 }
                               2097                 :                :         |   ALTER TABLE IF_P EXISTS relation_expr alter_table_cmds
                               2098                 :                :                 {
 4465 simon@2ndQuadrant.co     2099                 :             27 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2100                 :                : 
                               2101                 :             27 :                     n->relation = $5;
                               2102                 :             27 :                     n->cmds = $6;
 1373 michael@paquier.xyz      2103                 :             27 :                     n->objtype = OBJECT_TABLE;
 4465 simon@2ndQuadrant.co     2104                 :             27 :                     n->missing_ok = true;
  702 peter@eisentraut.org     2105                 :             27 :                     $$ = (Node *) n;
                               2106                 :                :                 }
                               2107                 :                :         |   ALTER TABLE relation_expr partition_cmd
                               2108                 :                :                 {
 2685 rhaas@postgresql.org     2109                 :           1566 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2110                 :                : 
                               2111                 :           1566 :                     n->relation = $3;
                               2112                 :           1566 :                     n->cmds = list_make1($4);
 1373 michael@paquier.xyz      2113                 :           1566 :                     n->objtype = OBJECT_TABLE;
 2685 rhaas@postgresql.org     2114                 :           1566 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2115                 :           1566 :                     $$ = (Node *) n;
                               2116                 :                :                 }
                               2117                 :                :         |   ALTER TABLE IF_P EXISTS relation_expr partition_cmd
                               2118                 :                :                 {
 2685 rhaas@postgresql.org     2119                 :UBC           0 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2120                 :                : 
                               2121                 :              0 :                     n->relation = $5;
                               2122                 :              0 :                     n->cmds = list_make1($6);
 1373 michael@paquier.xyz      2123                 :              0 :                     n->objtype = OBJECT_TABLE;
 2685 rhaas@postgresql.org     2124                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     2125                 :              0 :                     $$ = (Node *) n;
                               2126                 :                :                 }
                               2127                 :                :         |   ALTER TABLE ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
                               2128                 :                :                 {
 3524 sfrost@snowman.net       2129                 :ECB         (6) :                     AlterTableMoveAllStmt *n =
 3524 sfrost@snowman.net       2130                 :CBC           6 :                         makeNode(AlterTableMoveAllStmt);
                               2131                 :                : 
                               2132                 :              6 :                     n->orig_tablespacename = $6;
                               2133                 :              6 :                     n->objtype = OBJECT_TABLE;
                               2134                 :              6 :                     n->roles = NIL;
                               2135                 :              6 :                     n->new_tablespacename = $9;
                               2136                 :              6 :                     n->nowait = $10;
  702 peter@eisentraut.org     2137                 :              6 :                     $$ = (Node *) n;
                               2138                 :                :                 }
                               2139                 :                :         |   ALTER TABLE ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
                               2140                 :                :                 {
 3524 sfrost@snowman.net       2141                 :EUB             :                     AlterTableMoveAllStmt *n =
 3524 sfrost@snowman.net       2142                 :UBC           0 :                         makeNode(AlterTableMoveAllStmt);
                               2143                 :                : 
                               2144                 :              0 :                     n->orig_tablespacename = $6;
                               2145                 :              0 :                     n->objtype = OBJECT_TABLE;
                               2146                 :              0 :                     n->roles = $9;
                               2147                 :              0 :                     n->new_tablespacename = $12;
                               2148                 :              0 :                     n->nowait = $13;
  702 peter@eisentraut.org     2149                 :              0 :                     $$ = (Node *) n;
                               2150                 :                :                 }
                               2151                 :                :         |   ALTER INDEX qualified_name alter_table_cmds
                               2152                 :                :                 {
 7177 bruce@momjian.us         2153                 :CBC         113 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2154                 :                : 
                               2155                 :            113 :                     n->relation = $3;
                               2156                 :            113 :                     n->cmds = $4;
 1373 michael@paquier.xyz      2157                 :            113 :                     n->objtype = OBJECT_INDEX;
 4465 simon@2ndQuadrant.co     2158                 :            113 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2159                 :            113 :                     $$ = (Node *) n;
                               2160                 :                :                 }
                               2161                 :                :         |   ALTER INDEX IF_P EXISTS qualified_name alter_table_cmds
                               2162                 :                :                 {
 4465 simon@2ndQuadrant.co     2163                 :UBC           0 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2164                 :                : 
                               2165                 :              0 :                     n->relation = $5;
                               2166                 :              0 :                     n->cmds = $6;
 1373 michael@paquier.xyz      2167                 :              0 :                     n->objtype = OBJECT_INDEX;
 4465 simon@2ndQuadrant.co     2168                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     2169                 :              0 :                     $$ = (Node *) n;
                               2170                 :                :                 }
                               2171                 :                :         |   ALTER INDEX qualified_name index_partition_cmd
                               2172                 :                :                 {
 2277 alvherre@alvh.no-ip.     2173                 :CBC         195 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2174                 :                : 
                               2175                 :            195 :                     n->relation = $3;
                               2176                 :            195 :                     n->cmds = list_make1($4);
 1373 michael@paquier.xyz      2177                 :            195 :                     n->objtype = OBJECT_INDEX;
 2277 alvherre@alvh.no-ip.     2178                 :            195 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2179                 :            195 :                     $$ = (Node *) n;
                               2180                 :                :                 }
                               2181                 :                :         |   ALTER INDEX ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
                               2182                 :                :                 {
 3524 sfrost@snowman.net       2183                 :ECB         (3) :                     AlterTableMoveAllStmt *n =
 3524 sfrost@snowman.net       2184                 :CBC           3 :                         makeNode(AlterTableMoveAllStmt);
                               2185                 :                : 
                               2186                 :              3 :                     n->orig_tablespacename = $6;
                               2187                 :              3 :                     n->objtype = OBJECT_INDEX;
                               2188                 :              3 :                     n->roles = NIL;
                               2189                 :              3 :                     n->new_tablespacename = $9;
                               2190                 :              3 :                     n->nowait = $10;
  702 peter@eisentraut.org     2191                 :              3 :                     $$ = (Node *) n;
                               2192                 :                :                 }
                               2193                 :                :         |   ALTER INDEX ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
                               2194                 :                :                 {
 3524 sfrost@snowman.net       2195                 :EUB             :                     AlterTableMoveAllStmt *n =
 3524 sfrost@snowman.net       2196                 :UBC           0 :                         makeNode(AlterTableMoveAllStmt);
                               2197                 :                : 
                               2198                 :              0 :                     n->orig_tablespacename = $6;
                               2199                 :              0 :                     n->objtype = OBJECT_INDEX;
                               2200                 :              0 :                     n->roles = $9;
                               2201                 :              0 :                     n->new_tablespacename = $12;
                               2202                 :              0 :                     n->nowait = $13;
  702 peter@eisentraut.org     2203                 :              0 :                     $$ = (Node *) n;
                               2204                 :                :                 }
                               2205                 :                :         |   ALTER SEQUENCE qualified_name alter_table_cmds
                               2206                 :                :                 {
 5782 tgl@sss.pgh.pa.us        2207                 :CBC          37 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2208                 :                : 
                               2209                 :             37 :                     n->relation = $3;
                               2210                 :             37 :                     n->cmds = $4;
 1373 michael@paquier.xyz      2211                 :             37 :                     n->objtype = OBJECT_SEQUENCE;
 4465 simon@2ndQuadrant.co     2212                 :             37 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2213                 :             37 :                     $$ = (Node *) n;
                               2214                 :                :                 }
                               2215                 :                :         |   ALTER SEQUENCE IF_P EXISTS qualified_name alter_table_cmds
                               2216                 :                :                 {
 4465 simon@2ndQuadrant.co     2217                 :UBC           0 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2218                 :                : 
                               2219                 :              0 :                     n->relation = $5;
                               2220                 :              0 :                     n->cmds = $6;
 1373 michael@paquier.xyz      2221                 :              0 :                     n->objtype = OBJECT_SEQUENCE;
 4465 simon@2ndQuadrant.co     2222                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     2223                 :              0 :                     $$ = (Node *) n;
                               2224                 :                :                 }
                               2225                 :                :         |   ALTER VIEW qualified_name alter_table_cmds
                               2226                 :                :                 {
 5782 tgl@sss.pgh.pa.us        2227                 :CBC         120 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2228                 :                : 
                               2229                 :            120 :                     n->relation = $3;
                               2230                 :            120 :                     n->cmds = $4;
 1373 michael@paquier.xyz      2231                 :            120 :                     n->objtype = OBJECT_VIEW;
 4465 simon@2ndQuadrant.co     2232                 :            120 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2233                 :            120 :                     $$ = (Node *) n;
                               2234                 :                :                 }
                               2235                 :                :         |   ALTER VIEW IF_P EXISTS qualified_name alter_table_cmds
                               2236                 :                :                 {
 4465 simon@2ndQuadrant.co     2237                 :UBC           0 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2238                 :                : 
                               2239                 :              0 :                     n->relation = $5;
                               2240                 :              0 :                     n->cmds = $6;
 1373 michael@paquier.xyz      2241                 :              0 :                     n->objtype = OBJECT_VIEW;
 4465 simon@2ndQuadrant.co     2242                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     2243                 :              0 :                     $$ = (Node *) n;
                               2244                 :                :                 }
                               2245                 :                :         |   ALTER MATERIALIZED VIEW qualified_name alter_table_cmds
                               2246                 :                :                 {
 4060 kgrittn@postgresql.o     2247                 :CBC          24 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2248                 :                : 
                               2249                 :             24 :                     n->relation = $4;
                               2250                 :             24 :                     n->cmds = $5;
 1373 michael@paquier.xyz      2251                 :             24 :                     n->objtype = OBJECT_MATVIEW;
 4060 kgrittn@postgresql.o     2252                 :             24 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2253                 :             24 :                     $$ = (Node *) n;
                               2254                 :                :                 }
                               2255                 :                :         |   ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name alter_table_cmds
                               2256                 :                :                 {
 4060 kgrittn@postgresql.o     2257                 :UBC           0 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2258                 :                : 
                               2259                 :              0 :                     n->relation = $6;
                               2260                 :              0 :                     n->cmds = $7;
 1373 michael@paquier.xyz      2261                 :              0 :                     n->objtype = OBJECT_MATVIEW;
 4060 kgrittn@postgresql.o     2262                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     2263                 :              0 :                     $$ = (Node *) n;
                               2264                 :                :                 }
                               2265                 :                :         |   ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
                               2266                 :                :                 {
 3524 sfrost@snowman.net       2267                 :ECB         (6) :                     AlterTableMoveAllStmt *n =
 3524 sfrost@snowman.net       2268                 :CBC           6 :                         makeNode(AlterTableMoveAllStmt);
                               2269                 :                : 
                               2270                 :              6 :                     n->orig_tablespacename = $7;
                               2271                 :              6 :                     n->objtype = OBJECT_MATVIEW;
                               2272                 :              6 :                     n->roles = NIL;
                               2273                 :              6 :                     n->new_tablespacename = $10;
                               2274                 :              6 :                     n->nowait = $11;
  702 peter@eisentraut.org     2275                 :              6 :                     $$ = (Node *) n;
                               2276                 :                :                 }
                               2277                 :                :         |   ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
                               2278                 :                :                 {
 3524 sfrost@snowman.net       2279                 :EUB             :                     AlterTableMoveAllStmt *n =
 3524 sfrost@snowman.net       2280                 :UBC           0 :                         makeNode(AlterTableMoveAllStmt);
                               2281                 :                : 
                               2282                 :              0 :                     n->orig_tablespacename = $7;
                               2283                 :              0 :                     n->objtype = OBJECT_MATVIEW;
                               2284                 :              0 :                     n->roles = $10;
                               2285                 :              0 :                     n->new_tablespacename = $13;
                               2286                 :              0 :                     n->nowait = $14;
  702 peter@eisentraut.org     2287                 :              0 :                     $$ = (Node *) n;
                               2288                 :                :                 }
                               2289                 :                :         |   ALTER FOREIGN TABLE relation_expr alter_table_cmds
                               2290                 :                :                 {
 1403 peter@eisentraut.org     2291                 :CBC         183 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2292                 :                : 
                               2293                 :            183 :                     n->relation = $4;
                               2294                 :            183 :                     n->cmds = $5;
 1373 michael@paquier.xyz      2295                 :            183 :                     n->objtype = OBJECT_FOREIGN_TABLE;
 1403 peter@eisentraut.org     2296                 :            183 :                     n->missing_ok = false;
  702                          2297                 :            183 :                     $$ = (Node *) n;
                               2298                 :                :                 }
                               2299                 :                :         |   ALTER FOREIGN TABLE IF_P EXISTS relation_expr alter_table_cmds
                               2300                 :                :                 {
 1403                          2301                 :             54 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2302                 :                : 
                               2303                 :             54 :                     n->relation = $6;
                               2304                 :             54 :                     n->cmds = $7;
 1373 michael@paquier.xyz      2305                 :             54 :                     n->objtype = OBJECT_FOREIGN_TABLE;
 1403 peter@eisentraut.org     2306                 :             54 :                     n->missing_ok = true;
  702                          2307                 :             54 :                     $$ = (Node *) n;
                               2308                 :                :                 }
                               2309                 :                :         ;
                               2310                 :                : 
                               2311                 :                : alter_table_cmds:
 7259 neilc@samurai.com        2312                 :          11504 :             alter_table_cmd                         { $$ = list_make1($1); }
 7284 tgl@sss.pgh.pa.us        2313                 :            459 :             | alter_table_cmds ',' alter_table_cmd  { $$ = lappend($1, $3); }
                               2314                 :                :         ;
                               2315                 :                : 
                               2316                 :                : partitions_list:
    7 akorotkov@postgresql     2317                 :GNC         126 :             SinglePartitionSpec                         { $$ = list_make1($1); }
                               2318                 :            261 :             | partitions_list ',' SinglePartitionSpec   { $$ = lappend($1, $3); }
                               2319                 :                :         ;
                               2320                 :                : 
                               2321                 :                : SinglePartitionSpec:
                               2322                 :                :             PARTITION qualified_name PartitionBoundSpec
                               2323                 :                :                 {
                               2324                 :            387 :                     SinglePartitionSpec *n = makeNode(SinglePartitionSpec);
                               2325                 :                : 
                               2326                 :            387 :                     n->name = $2;
                               2327                 :            387 :                     n->bound = $3;
                               2328                 :                : 
                               2329                 :            387 :                     $$ = n;
                               2330                 :                :                 }
                               2331                 :                :         ;
                               2332                 :                : 
                               2333                 :                : partition_cmd:
                               2334                 :                :             /* ALTER TABLE <name> ATTACH PARTITION <table_name> FOR VALUES */
                               2335                 :                :             ATTACH PARTITION qualified_name PartitionBoundSpec
                               2336                 :                :                 {
 2685 rhaas@postgresql.org     2337                 :CBC        1106 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2338                 :           1106 :                     PartitionCmd *cmd = makeNode(PartitionCmd);
                               2339                 :                : 
                               2340                 :           1106 :                     n->subtype = AT_AttachPartition;
                               2341                 :           1106 :                     cmd->name = $3;
 2513 tgl@sss.pgh.pa.us        2342                 :           1106 :                     cmd->bound = $4;
    7 akorotkov@postgresql     2343                 :GNC        1106 :                     cmd->partlist = NULL;
 1116 alvherre@alvh.no-ip.     2344                 :CBC        1106 :                     cmd->concurrent = false;
 2685 rhaas@postgresql.org     2345                 :           1106 :                     n->def = (Node *) cmd;
                               2346                 :                : 
                               2347                 :           1106 :                     $$ = (Node *) n;
                               2348                 :                :                 }
                               2349                 :                :             /* ALTER TABLE <name> DETACH PARTITION <partition_name> [CONCURRENTLY] */
                               2350                 :                :             | DETACH PARTITION qualified_name opt_concurrently
                               2351                 :                :                 {
                               2352                 :            267 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2353                 :            267 :                     PartitionCmd *cmd = makeNode(PartitionCmd);
                               2354                 :                : 
                               2355                 :            267 :                     n->subtype = AT_DetachPartition;
                               2356                 :            267 :                     cmd->name = $3;
 2513 tgl@sss.pgh.pa.us        2357                 :            267 :                     cmd->bound = NULL;
    7 akorotkov@postgresql     2358                 :GNC         267 :                     cmd->partlist = NULL;
 1116 alvherre@alvh.no-ip.     2359                 :CBC         267 :                     cmd->concurrent = $4;
 2685 rhaas@postgresql.org     2360                 :            267 :                     n->def = (Node *) cmd;
                               2361                 :                : 
 1116 alvherre@alvh.no-ip.     2362                 :            267 :                     $$ = (Node *) n;
                               2363                 :                :                 }
                               2364                 :                :             | DETACH PARTITION qualified_name FINALIZE
                               2365                 :                :                 {
                               2366                 :              7 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2367                 :              7 :                     PartitionCmd *cmd = makeNode(PartitionCmd);
                               2368                 :                : 
                               2369                 :              7 :                     n->subtype = AT_DetachPartitionFinalize;
                               2370                 :              7 :                     cmd->name = $3;
                               2371                 :              7 :                     cmd->bound = NULL;
    7 akorotkov@postgresql     2372                 :GNC           7 :                     cmd->partlist = NULL;
                               2373                 :              7 :                     cmd->concurrent = false;
                               2374                 :              7 :                     n->def = (Node *) cmd;
                               2375                 :              7 :                     $$ = (Node *) n;
                               2376                 :                :                 }
                               2377                 :                :             /* ALTER TABLE <name> SPLIT PARTITION <partition_name> INTO () */
                               2378                 :                :             | SPLIT PARTITION qualified_name INTO '(' partitions_list ')'
                               2379                 :                :                 {
                               2380                 :            126 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2381                 :            126 :                     PartitionCmd *cmd = makeNode(PartitionCmd);
                               2382                 :                : 
                               2383                 :            126 :                     n->subtype = AT_SplitPartition;
                               2384                 :            126 :                     cmd->name = $3;
                               2385                 :            126 :                     cmd->bound = NULL;
                               2386                 :            126 :                     cmd->partlist = $6;
                               2387                 :            126 :                     cmd->concurrent = false;
                               2388                 :            126 :                     n->def = (Node *) cmd;
                               2389                 :            126 :                     $$ = (Node *) n;
                               2390                 :                :                 }
                               2391                 :                :             /* ALTER TABLE <name> MERGE PARTITIONS () INTO <partition_name> */
                               2392                 :                :             | MERGE PARTITIONS '(' qualified_name_list ')' INTO qualified_name
                               2393                 :                :                 {
                               2394                 :             60 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2395                 :             60 :                     PartitionCmd *cmd = makeNode(PartitionCmd);
                               2396                 :                : 
                               2397                 :             60 :                     n->subtype = AT_MergePartitions;
                               2398                 :             60 :                     cmd->name = $7;
                               2399                 :             60 :                     cmd->bound = NULL;
                               2400                 :             60 :                     cmd->partlist = $4;
 1116 alvherre@alvh.no-ip.     2401                 :CBC          60 :                     cmd->concurrent = false;
                               2402                 :             60 :                     n->def = (Node *) cmd;
 2685 rhaas@postgresql.org     2403                 :             60 :                     $$ = (Node *) n;
                               2404                 :                :                 }
                               2405                 :                :         ;
                               2406                 :                : 
                               2407                 :                : index_partition_cmd:
                               2408                 :                :             /* ALTER INDEX <name> ATTACH PARTITION <index_name> */
                               2409                 :                :             ATTACH PARTITION qualified_name
                               2410                 :                :                 {
 2277 alvherre@alvh.no-ip.     2411                 :            195 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2412                 :            195 :                     PartitionCmd *cmd = makeNode(PartitionCmd);
                               2413                 :                : 
                               2414                 :            195 :                     n->subtype = AT_AttachPartition;
                               2415                 :            195 :                     cmd->name = $3;
                               2416                 :            195 :                     cmd->bound = NULL;
    7 akorotkov@postgresql     2417                 :GNC         195 :                     cmd->partlist = NULL;
 1116 alvherre@alvh.no-ip.     2418                 :CBC         195 :                     cmd->concurrent = false;
 2277                          2419                 :            195 :                     n->def = (Node *) cmd;
                               2420                 :                : 
                               2421                 :            195 :                     $$ = (Node *) n;
                               2422                 :                :                 }
                               2423                 :                :         ;
                               2424                 :                : 
                               2425                 :                : alter_table_cmd:
                               2426                 :                :             /* ALTER TABLE <name> ADD <coldef> */
                               2427                 :                :             ADD_P columnDef
                               2428                 :                :                 {
 5242 tgl@sss.pgh.pa.us        2429                 :             82 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2430                 :                : 
                               2431                 :             82 :                     n->subtype = AT_AddColumn;
                               2432                 :             82 :                     n->def = $2;
 3182 andrew@dunslane.net      2433                 :             82 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2434                 :             82 :                     $$ = (Node *) n;
                               2435                 :                :                 }
                               2436                 :                :             /* ALTER TABLE <name> ADD IF NOT EXISTS <coldef> */
                               2437                 :                :             | ADD_P IF_P NOT EXISTS columnDef
                               2438                 :                :                 {
 3182 andrew@dunslane.net      2439                 :UBC           0 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2440                 :                : 
                               2441                 :              0 :                     n->subtype = AT_AddColumn;
                               2442                 :              0 :                     n->def = $5;
                               2443                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     2444                 :              0 :                     $$ = (Node *) n;
                               2445                 :                :                 }
                               2446                 :                :             /* ALTER TABLE <name> ADD COLUMN <coldef> */
                               2447                 :                :             | ADD_P COLUMN columnDef
                               2448                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2449                 :CBC         858 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2450                 :                : 
                               2451                 :            858 :                     n->subtype = AT_AddColumn;
                               2452                 :            858 :                     n->def = $3;
 3182 andrew@dunslane.net      2453                 :            858 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2454                 :            858 :                     $$ = (Node *) n;
                               2455                 :                :                 }
                               2456                 :                :             /* ALTER TABLE <name> ADD COLUMN IF NOT EXISTS <coldef> */
                               2457                 :                :             | ADD_P COLUMN IF_P NOT EXISTS columnDef
                               2458                 :                :                 {
 3182 andrew@dunslane.net      2459                 :             30 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2460                 :                : 
                               2461                 :             30 :                     n->subtype = AT_AddColumn;
                               2462                 :             30 :                     n->def = $6;
                               2463                 :             30 :                     n->missing_ok = true;
  702 peter@eisentraut.org     2464                 :             30 :                     $$ = (Node *) n;
                               2465                 :                :                 }
                               2466                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
                               2467                 :                :             | ALTER opt_column ColId alter_column_default
                               2468                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2469                 :            266 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2470                 :                : 
                               2471                 :            266 :                     n->subtype = AT_ColumnDefault;
                               2472                 :            266 :                     n->name = $3;
                               2473                 :            266 :                     n->def = $4;
  702 peter@eisentraut.org     2474                 :            266 :                     $$ = (Node *) n;
                               2475                 :                :                 }
                               2476                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP NOT NULL */
                               2477                 :                :             | ALTER opt_column ColId DROP NOT NULL_P
                               2478                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2479                 :            132 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2480                 :                : 
                               2481                 :            132 :                     n->subtype = AT_DropNotNull;
                               2482                 :            132 :                     n->name = $3;
  702 peter@eisentraut.org     2483                 :            132 :                     $$ = (Node *) n;
                               2484                 :                :                 }
                               2485                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET NOT NULL */
                               2486                 :                :             | ALTER opt_column ColId SET NOT NULL_P
                               2487                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2488                 :            193 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2489                 :                : 
                               2490                 :            193 :                     n->subtype = AT_SetNotNull;
                               2491                 :            193 :                     n->name = $3;
  702 peter@eisentraut.org     2492                 :            193 :                     $$ = (Node *) n;
                               2493                 :                :                 }
                               2494                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET EXPRESSION AS <expr> */
                               2495                 :                :             | ALTER opt_column ColId SET EXPRESSION AS '(' a_expr ')'
                               2496                 :                :                 {
  101 peter@eisentraut.org     2497                 :GNC          33 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2498                 :                : 
                               2499                 :             33 :                     n->subtype = AT_SetExpression;
                               2500                 :             33 :                     n->name = $3;
                               2501                 :             33 :                     n->def = $8;
                               2502                 :             33 :                     $$ = (Node *) n;
                               2503                 :                :                 }
                               2504                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP EXPRESSION */
                               2505                 :                :             | ALTER opt_column ColId DROP EXPRESSION
                               2506                 :                :                 {
 1552 peter@eisentraut.org     2507                 :CBC          16 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2508                 :                : 
                               2509                 :             16 :                     n->subtype = AT_DropExpression;
                               2510                 :             16 :                     n->name = $3;
  702                          2511                 :             16 :                     $$ = (Node *) n;
                               2512                 :                :                 }
                               2513                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP EXPRESSION IF EXISTS */
                               2514                 :                :             | ALTER opt_column ColId DROP EXPRESSION IF_P EXISTS
                               2515                 :                :                 {
 1552                          2516                 :              3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2517                 :                : 
                               2518                 :              3 :                     n->subtype = AT_DropExpression;
                               2519                 :              3 :                     n->name = $3;
                               2520                 :              3 :                     n->missing_ok = true;
  702                          2521                 :              3 :                     $$ = (Node *) n;
                               2522                 :                :                 }
                               2523                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STATISTICS */
                               2524                 :                :             | ALTER opt_column ColId SET STATISTICS set_statistics_value
                               2525                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2526                 :             31 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2527                 :                : 
                               2528                 :             31 :                     n->subtype = AT_SetStatistics;
                               2529                 :             31 :                     n->name = $3;
   92 peter@eisentraut.org     2530                 :GNC          31 :                     n->def = $6;
  702 peter@eisentraut.org     2531                 :CBC          31 :                     $$ = (Node *) n;
                               2532                 :                :                 }
                               2533                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colnum> SET STATISTICS */
                               2534                 :                :             | ALTER opt_column Iconst SET STATISTICS set_statistics_value
                               2535                 :                :                 {
 2412 simon@2ndQuadrant.co     2536                 :             35 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2537                 :                : 
                               2538   [ +  +  -  + ]:             35 :                     if ($3 <= 0 || $3 > PG_INT16_MAX)
                               2539         [ +  - ]:              3 :                         ereport(ERROR,
                               2540                 :                :                                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                               2541                 :                :                                  errmsg("column number must be in range from 1 to %d", PG_INT16_MAX),
                               2542                 :                :                                  parser_errposition(@3)));
                               2543                 :                : 
                               2544                 :             32 :                     n->subtype = AT_SetStatistics;
                               2545                 :             32 :                     n->num = (int16) $3;
   92 peter@eisentraut.org     2546                 :GNC          32 :                     n->def = $6;
  702 peter@eisentraut.org     2547                 :CBC          32 :                     $$ = (Node *) n;
                               2548                 :                :                 }
                               2549                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET ( column_parameter = value [, ... ] ) */
                               2550                 :                :             | ALTER opt_column ColId SET reloptions
                               2551                 :                :                 {
 5369 tgl@sss.pgh.pa.us        2552                 :             19 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2553                 :                : 
 5196 rhaas@postgresql.org     2554                 :             19 :                     n->subtype = AT_SetOptions;
 5369 tgl@sss.pgh.pa.us        2555                 :             19 :                     n->name = $3;
 5196 rhaas@postgresql.org     2556                 :             19 :                     n->def = (Node *) $5;
  702 peter@eisentraut.org     2557                 :             19 :                     $$ = (Node *) n;
                               2558                 :                :                 }
                               2559                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> RESET ( column_parameter [, ... ] ) */
                               2560                 :                :             | ALTER opt_column ColId RESET reloptions
                               2561                 :                :                 {
 5196 rhaas@postgresql.org     2562                 :              3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2563                 :                : 
                               2564                 :              3 :                     n->subtype = AT_ResetOptions;
                               2565                 :              3 :                     n->name = $3;
                               2566                 :              3 :                     n->def = (Node *) $5;
  702 peter@eisentraut.org     2567                 :              3 :                     $$ = (Node *) n;
                               2568                 :                :                 }
                               2569                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
                               2570                 :                :             | ALTER opt_column ColId SET column_storage
                               2571                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2572                 :            106 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2573                 :                : 
                               2574                 :            106 :                     n->subtype = AT_SetStorage;
                               2575                 :            106 :                     n->name = $3;
  641 peter@eisentraut.org     2576                 :            106 :                     n->def = (Node *) makeString($5);
  702                          2577                 :            106 :                     $$ = (Node *) n;
                               2578                 :                :                 }
                               2579                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET COMPRESSION <cm> */
                               2580                 :                :             | ALTER opt_column ColId SET column_compression
                               2581                 :                :                 {
 1053 tgl@sss.pgh.pa.us        2582                 :             33 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2583                 :                : 
                               2584                 :             33 :                     n->subtype = AT_SetCompression;
                               2585                 :             33 :                     n->name = $3;
                               2586                 :             33 :                     n->def = (Node *) makeString($5);
  702 peter@eisentraut.org     2587                 :             33 :                     $$ = (Node *) n;
                               2588                 :                :                 }
                               2589                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> ADD GENERATED ... AS IDENTITY ... */
                               2590                 :                :             | ALTER opt_column ColId ADD_P GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList
                               2591                 :                :                 {
 2565 peter_e@gmx.net          2592                 :             77 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2593                 :             77 :                     Constraint *c = makeNode(Constraint);
                               2594                 :                : 
                               2595                 :             77 :                     c->contype = CONSTR_IDENTITY;
                               2596                 :             77 :                     c->generated_when = $6;
                               2597                 :             77 :                     c->options = $9;
                               2598                 :             77 :                     c->location = @5;
                               2599                 :                : 
                               2600                 :             77 :                     n->subtype = AT_AddIdentity;
                               2601                 :             77 :                     n->name = $3;
                               2602                 :             77 :                     n->def = (Node *) c;
                               2603                 :                : 
  702 peter@eisentraut.org     2604                 :             77 :                     $$ = (Node *) n;
                               2605                 :                :                 }
                               2606                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET <sequence options>/RESET */
                               2607                 :                :             | ALTER opt_column ColId alter_identity_column_option_list
                               2608                 :                :                 {
 2565 peter_e@gmx.net          2609                 :             31 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2610                 :                : 
                               2611                 :             31 :                     n->subtype = AT_SetIdentity;
                               2612                 :             31 :                     n->name = $3;
                               2613                 :             31 :                     n->def = (Node *) $4;
  702 peter@eisentraut.org     2614                 :             31 :                     $$ = (Node *) n;
                               2615                 :                :                 }
                               2616                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP IDENTITY */
                               2617                 :                :             | ALTER opt_column ColId DROP IDENTITY_P
                               2618                 :                :                 {
 2565 peter_e@gmx.net          2619                 :             25 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2620                 :                : 
                               2621                 :             25 :                     n->subtype = AT_DropIdentity;
                               2622                 :             25 :                     n->name = $3;
                               2623                 :             25 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2624                 :             25 :                     $$ = (Node *) n;
                               2625                 :                :                 }
                               2626                 :                :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP IDENTITY IF EXISTS */
                               2627                 :                :             | ALTER opt_column ColId DROP IDENTITY_P IF_P EXISTS
                               2628                 :                :                 {
 2565 peter_e@gmx.net          2629                 :              3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2630                 :                : 
                               2631                 :              3 :                     n->subtype = AT_DropIdentity;
                               2632                 :              3 :                     n->name = $3;
                               2633                 :              3 :                     n->missing_ok = true;
  702 peter@eisentraut.org     2634                 :              3 :                     $$ = (Node *) n;
                               2635                 :                :                 }
                               2636                 :                :             /* ALTER TABLE <name> DROP [COLUMN] IF EXISTS <colname> [RESTRICT|CASCADE] */
                               2637                 :                :             | DROP opt_column IF_P EXISTS ColId opt_drop_behavior
                               2638                 :                :                 {
 5382 andrew@dunslane.net      2639                 :              9 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2640                 :                : 
                               2641                 :              9 :                     n->subtype = AT_DropColumn;
                               2642                 :              9 :                     n->name = $5;
                               2643                 :              9 :                     n->behavior = $6;
 2433 peter_e@gmx.net          2644                 :              9 :                     n->missing_ok = true;
  702 peter@eisentraut.org     2645                 :              9 :                     $$ = (Node *) n;
                               2646                 :                :                 }
                               2647                 :                :             /* ALTER TABLE <name> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
                               2648                 :                :             | DROP opt_column ColId opt_drop_behavior
                               2649                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2650                 :            767 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2651                 :                : 
                               2652                 :            767 :                     n->subtype = AT_DropColumn;
                               2653                 :            767 :                     n->name = $3;
                               2654                 :            767 :                     n->behavior = $4;
 2433 peter_e@gmx.net          2655                 :            767 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2656                 :            767 :                     $$ = (Node *) n;
                               2657                 :                :                 }
                               2658                 :                :             /*
                               2659                 :                :              * ALTER TABLE <name> ALTER [COLUMN] <colname> [SET DATA] TYPE <typename>
                               2660                 :                :              *      [ USING <expression> ]
                               2661                 :                :              */
                               2662                 :                :             | ALTER opt_column ColId opt_set_data TYPE_P Typename opt_collate_clause alter_using
                               2663                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2664                 :            421 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
 4785                          2665                 :            421 :                     ColumnDef *def = makeNode(ColumnDef);
                               2666                 :                : 
 7284                          2667                 :            421 :                     n->subtype = AT_AlterColumnType;
                               2668                 :            421 :                     n->name = $3;
 4785                          2669                 :            421 :                     n->def = (Node *) def;
                               2670                 :                :                     /* We only use these fields of the ColumnDef node */
                               2671                 :            421 :                     def->typeName = $6;
                               2672                 :            421 :                     def->collClause = (CollateClause *) $7;
                               2673                 :            421 :                     def->raw_default = $8;
 3797                          2674                 :            421 :                     def->location = @3;
  702 peter@eisentraut.org     2675                 :            421 :                     $$ = (Node *) n;
                               2676                 :                :                 }
                               2677                 :                :             /* ALTER FOREIGN TABLE <name> ALTER [COLUMN] <colname> OPTIONS */
                               2678                 :                :             | ALTER opt_column ColId alter_generic_options
                               2679                 :                :                 {
 4636 rhaas@postgresql.org     2680                 :             25 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2681                 :                : 
                               2682                 :             25 :                     n->subtype = AT_AlterColumnGenericOptions;
                               2683                 :             25 :                     n->name = $3;
                               2684                 :             25 :                     n->def = (Node *) $4;
  702 peter@eisentraut.org     2685                 :             25 :                     $$ = (Node *) n;
                               2686                 :                :                 }
                               2687                 :                :             /* ALTER TABLE <name> ADD CONSTRAINT ... */
                               2688                 :                :             | ADD_P TableConstraint
                               2689                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2690                 :           5679 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2691                 :                : 
                               2692                 :           5679 :                     n->subtype = AT_AddConstraint;
                               2693                 :           5679 :                     n->def = $2;
  702 peter@eisentraut.org     2694                 :           5679 :                     $$ = (Node *) n;
                               2695                 :                :                 }
                               2696                 :                :             /* ALTER TABLE <name> ALTER CONSTRAINT ... */
                               2697                 :                :             | ALTER CONSTRAINT name ConstraintAttributeSpec
                               2698                 :                :                 {
 3942 simon@2ndQuadrant.co     2699                 :             66 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2700                 :             66 :                     Constraint *c = makeNode(Constraint);
                               2701                 :                : 
                               2702                 :             66 :                     n->subtype = AT_AlterConstraint;
                               2703                 :             66 :                     n->def = (Node *) c;
                               2704                 :             66 :                     c->contype = CONSTR_FOREIGN; /* others not supported, yet */
                               2705                 :             66 :                     c->conname = $3;
                               2706                 :             66 :                     processCASbits($4, @4, "ALTER CONSTRAINT statement",
                               2707                 :                :                                     &c->deferrable,
                               2708                 :                :                                     &c->initdeferred,
                               2709                 :                :                                     NULL, NULL, yyscanner);
  702 peter@eisentraut.org     2710                 :             66 :                     $$ = (Node *) n;
                               2711                 :                :                 }
                               2712                 :                :             /* ALTER TABLE <name> VALIDATE CONSTRAINT ... */
                               2713                 :                :             | VALIDATE CONSTRAINT name
                               2714                 :                :                 {
 4814 simon@2ndQuadrant.co     2715                 :            194 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2716                 :                : 
                               2717                 :            194 :                     n->subtype = AT_ValidateConstraint;
                               2718                 :            194 :                     n->name = $3;
  702 peter@eisentraut.org     2719                 :            194 :                     $$ = (Node *) n;
                               2720                 :                :                 }
                               2721                 :                :             /* ALTER TABLE <name> DROP CONSTRAINT IF EXISTS <name> [RESTRICT|CASCADE] */
                               2722                 :                :             | DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
                               2723                 :                :                 {
 5382 andrew@dunslane.net      2724                 :              9 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2725                 :                : 
                               2726                 :              9 :                     n->subtype = AT_DropConstraint;
                               2727                 :              9 :                     n->name = $5;
                               2728                 :              9 :                     n->behavior = $6;
 2433 peter_e@gmx.net          2729                 :              9 :                     n->missing_ok = true;
  702 peter@eisentraut.org     2730                 :              9 :                     $$ = (Node *) n;
                               2731                 :                :                 }
                               2732                 :                :             /* ALTER TABLE <name> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
                               2733                 :                :             | DROP CONSTRAINT name opt_drop_behavior
                               2734                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2735                 :            473 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2736                 :                : 
                               2737                 :            473 :                     n->subtype = AT_DropConstraint;
                               2738                 :            473 :                     n->name = $3;
                               2739                 :            473 :                     n->behavior = $4;
 2433 peter_e@gmx.net          2740                 :            473 :                     n->missing_ok = false;
  702 peter@eisentraut.org     2741                 :            473 :                     $$ = (Node *) n;
                               2742                 :                :                 }
                               2743                 :                :             /* ALTER TABLE <name> SET WITHOUT OIDS, for backward compat */
                               2744                 :                :             | SET WITHOUT OIDS
                               2745                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2746                 :              3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2747                 :                : 
                               2748                 :              3 :                     n->subtype = AT_DropOids;
  702 peter@eisentraut.org     2749                 :              3 :                     $$ = (Node *) n;
                               2750                 :                :                 }
                               2751                 :                :             /* ALTER TABLE <name> CLUSTER ON <indexname> */
                               2752                 :                :             | CLUSTER ON name
                               2753                 :                :                 {
 7284 tgl@sss.pgh.pa.us        2754                 :             23 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2755                 :                : 
                               2756                 :             23 :                     n->subtype = AT_ClusterOn;
                               2757                 :             23 :                     n->name = $3;
  702 peter@eisentraut.org     2758                 :             23 :                     $$ = (Node *) n;
                               2759                 :                :                 }
                               2760                 :                :             /* ALTER TABLE <name> SET WITHOUT CLUSTER */
                               2761                 :                :             | SET WITHOUT CLUSTER
                               2762                 :                :                 {
 7256 bruce@momjian.us         2763                 :              9 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2764                 :                : 
                               2765                 :              9 :                     n->subtype = AT_DropCluster;
                               2766                 :              9 :                     n->name = NULL;
  702 peter@eisentraut.org     2767                 :              9 :                     $$ = (Node *) n;
                               2768                 :                :                 }
                               2769                 :                :             /* ALTER TABLE <name> SET LOGGED */
                               2770                 :                :             | SET LOGGED
                               2771                 :                :                 {
 3523 alvherre@alvh.no-ip.     2772                 :             19 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2773                 :                : 
                               2774                 :             19 :                     n->subtype = AT_SetLogged;
  702 peter@eisentraut.org     2775                 :             19 :                     $$ = (Node *) n;
                               2776                 :                :                 }
                               2777                 :                :             /* ALTER TABLE <name> SET UNLOGGED */
                               2778                 :                :             | SET UNLOGGED
                               2779                 :                :                 {
 3523 alvherre@alvh.no-ip.     2780                 :             25 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2781                 :                : 
                               2782                 :             25 :                     n->subtype = AT_SetUnLogged;
  702 peter@eisentraut.org     2783                 :             25 :                     $$ = (Node *) n;
                               2784                 :                :                 }
                               2785                 :                :             /* ALTER TABLE <name> ENABLE TRIGGER <trig> */
                               2786                 :                :             | ENABLE_P TRIGGER name
                               2787                 :                :                 {
 6809 tgl@sss.pgh.pa.us        2788                 :             61 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2789                 :                : 
                               2790                 :             61 :                     n->subtype = AT_EnableTrig;
                               2791                 :             61 :                     n->name = $3;
  702 peter@eisentraut.org     2792                 :             61 :                     $$ = (Node *) n;
                               2793                 :                :                 }
                               2794                 :                :             /* ALTER TABLE <name> ENABLE ALWAYS TRIGGER <trig> */
                               2795                 :                :             | ENABLE_P ALWAYS TRIGGER name
                               2796                 :                :                 {
 6236 JanWieck@Yahoo.com       2797                 :             20 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2798                 :                : 
                               2799                 :             20 :                     n->subtype = AT_EnableAlwaysTrig;
                               2800                 :             20 :                     n->name = $4;
  702 peter@eisentraut.org     2801                 :             20 :                     $$ = (Node *) n;
                               2802                 :                :                 }
                               2803                 :                :             /* ALTER TABLE <name> ENABLE REPLICA TRIGGER <trig> */
                               2804                 :                :             | ENABLE_P REPLICA TRIGGER name
                               2805                 :                :                 {
 6236 JanWieck@Yahoo.com       2806                 :              8 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2807                 :                : 
                               2808                 :              8 :                     n->subtype = AT_EnableReplicaTrig;
                               2809                 :              8 :                     n->name = $4;
  702 peter@eisentraut.org     2810                 :              8 :                     $$ = (Node *) n;
                               2811                 :                :                 }
                               2812                 :                :             /* ALTER TABLE <name> ENABLE TRIGGER ALL */
                               2813                 :                :             | ENABLE_P TRIGGER ALL
                               2814                 :                :                 {
 6809 tgl@sss.pgh.pa.us        2815                 :UBC           0 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2816                 :                : 
                               2817                 :              0 :                     n->subtype = AT_EnableTrigAll;
  702 peter@eisentraut.org     2818                 :              0 :                     $$ = (Node *) n;
                               2819                 :                :                 }
                               2820                 :                :             /* ALTER TABLE <name> ENABLE TRIGGER USER */
                               2821                 :                :             | ENABLE_P TRIGGER USER
                               2822                 :                :                 {
 6809 tgl@sss.pgh.pa.us        2823                 :              0 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2824                 :                : 
                               2825                 :              0 :                     n->subtype = AT_EnableTrigUser;
  702 peter@eisentraut.org     2826                 :              0 :                     $$ = (Node *) n;
                               2827                 :                :                 }
                               2828                 :                :             /* ALTER TABLE <name> DISABLE TRIGGER <trig> */
                               2829                 :                :             | DISABLE_P TRIGGER name
                               2830                 :                :                 {
 6809 tgl@sss.pgh.pa.us        2831                 :CBC          69 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2832                 :                : 
                               2833                 :             69 :                     n->subtype = AT_DisableTrig;
                               2834                 :             69 :                     n->name = $3;
  702 peter@eisentraut.org     2835                 :             69 :                     $$ = (Node *) n;
                               2836                 :                :                 }
                               2837                 :                :             /* ALTER TABLE <name> DISABLE TRIGGER ALL */
                               2838                 :                :             | DISABLE_P TRIGGER ALL
                               2839                 :                :                 {
 6809 tgl@sss.pgh.pa.us        2840                 :              6 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2841                 :                : 
                               2842                 :              6 :                     n->subtype = AT_DisableTrigAll;
  702 peter@eisentraut.org     2843                 :              6 :                     $$ = (Node *) n;
                               2844                 :                :                 }
                               2845                 :                :             /* ALTER TABLE <name> DISABLE TRIGGER USER */
                               2846                 :                :             | DISABLE_P TRIGGER USER
                               2847                 :                :                 {
 6809 tgl@sss.pgh.pa.us        2848                 :              6 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2849                 :                : 
                               2850                 :              6 :                     n->subtype = AT_DisableTrigUser;
  702 peter@eisentraut.org     2851                 :              6 :                     $$ = (Node *) n;
                               2852                 :                :                 }
                               2853                 :                :             /* ALTER TABLE <name> ENABLE RULE <rule> */
                               2854                 :                :             | ENABLE_P RULE name
                               2855                 :                :                 {
 6236 JanWieck@Yahoo.com       2856                 :              4 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2857                 :                : 
                               2858                 :              4 :                     n->subtype = AT_EnableRule;
                               2859                 :              4 :                     n->name = $3;
  702 peter@eisentraut.org     2860                 :              4 :                     $$ = (Node *) n;
                               2861                 :                :                 }
                               2862                 :                :             /* ALTER TABLE <name> ENABLE ALWAYS RULE <rule> */
                               2863                 :                :             | ENABLE_P ALWAYS RULE name
                               2864                 :                :                 {
 6236 JanWieck@Yahoo.com       2865                 :UBC           0 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2866                 :                : 
                               2867                 :              0 :                     n->subtype = AT_EnableAlwaysRule;
                               2868                 :              0 :                     n->name = $4;
  702 peter@eisentraut.org     2869                 :              0 :                     $$ = (Node *) n;
                               2870                 :                :                 }
                               2871                 :                :             /* ALTER TABLE <name> ENABLE REPLICA RULE <rule> */
                               2872                 :                :             | ENABLE_P REPLICA RULE name
                               2873                 :                :                 {
 6236 JanWieck@Yahoo.com       2874                 :CBC           3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2875                 :                : 
                               2876                 :              3 :                     n->subtype = AT_EnableReplicaRule;
                               2877                 :              3 :                     n->name = $4;
  702 peter@eisentraut.org     2878                 :              3 :                     $$ = (Node *) n;
                               2879                 :                :                 }
                               2880                 :                :             /* ALTER TABLE <name> DISABLE RULE <rule> */
                               2881                 :                :             | DISABLE_P RULE name
                               2882                 :                :                 {
 6236 JanWieck@Yahoo.com       2883                 :             16 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2884                 :                : 
                               2885                 :             16 :                     n->subtype = AT_DisableRule;
                               2886                 :             16 :                     n->name = $3;
  702 peter@eisentraut.org     2887                 :             16 :                     $$ = (Node *) n;
                               2888                 :                :                 }
                               2889                 :                :             /* ALTER TABLE <name> INHERIT <parent> */
                               2890                 :                :             | INHERIT qualified_name
                               2891                 :                :                 {
 6496 bruce@momjian.us         2892                 :            163 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2893                 :                : 
 6393 tgl@sss.pgh.pa.us        2894                 :            163 :                     n->subtype = AT_AddInherit;
                               2895                 :            163 :                     n->def = (Node *) $2;
  702 peter@eisentraut.org     2896                 :            163 :                     $$ = (Node *) n;
                               2897                 :                :                 }
                               2898                 :                :             /* ALTER TABLE <name> NO INHERIT <parent> */
                               2899                 :                :             | NO INHERIT qualified_name
                               2900                 :                :                 {
 6496 bruce@momjian.us         2901                 :             22 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2902                 :                : 
 6393 tgl@sss.pgh.pa.us        2903                 :             22 :                     n->subtype = AT_DropInherit;
                               2904                 :             22 :                     n->def = (Node *) $3;
  702 peter@eisentraut.org     2905                 :             22 :                     $$ = (Node *) n;
                               2906                 :                :                 }
                               2907                 :                :             /* ALTER TABLE <name> OF <type_name> */
                               2908                 :                :             | OF any_name
                               2909                 :                :                 {
 4743 rhaas@postgresql.org     2910                 :             33 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  702 peter@eisentraut.org     2911                 :             33 :                     TypeName   *def = makeTypeNameFromNameList($2);
                               2912                 :                : 
 4743 rhaas@postgresql.org     2913                 :             33 :                     def->location = @2;
                               2914                 :             33 :                     n->subtype = AT_AddOf;
                               2915                 :             33 :                     n->def = (Node *) def;
  702 peter@eisentraut.org     2916                 :             33 :                     $$ = (Node *) n;
                               2917                 :                :                 }
                               2918                 :                :             /* ALTER TABLE <name> NOT OF */
                               2919                 :                :             | NOT OF
                               2920                 :                :                 {
 4743 rhaas@postgresql.org     2921                 :              3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2922                 :                : 
                               2923                 :              3 :                     n->subtype = AT_DropOf;
  702 peter@eisentraut.org     2924                 :              3 :                     $$ = (Node *) n;
                               2925                 :                :                 }
                               2926                 :                :             /* ALTER TABLE <name> OWNER TO RoleSpec */
                               2927                 :                :             | OWNER TO RoleSpec
                               2928                 :                :                 {
 7177 bruce@momjian.us         2929                 :            910 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2930                 :                : 
                               2931                 :            910 :                     n->subtype = AT_ChangeOwner;
 3324 alvherre@alvh.no-ip.     2932                 :            910 :                     n->newowner = $3;
  702 peter@eisentraut.org     2933                 :            910 :                     $$ = (Node *) n;
                               2934                 :                :                 }
                               2935                 :                :             /* ALTER TABLE <name> SET ACCESS METHOD { <amname> | DEFAULT } */
                               2936                 :                :             | SET ACCESS METHOD set_access_method_name
                               2937                 :                :                 {
  991 michael@paquier.xyz      2938                 :             64 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2939                 :                : 
                               2940                 :             64 :                     n->subtype = AT_SetAccessMethod;
                               2941                 :             64 :                     n->name = $4;
  702 peter@eisentraut.org     2942                 :             64 :                     $$ = (Node *) n;
                               2943                 :                :                 }
                               2944                 :                :             /* ALTER TABLE <name> SET TABLESPACE <tablespacename> */
                               2945                 :                :             | SET TABLESPACE name
                               2946                 :                :                 {
 7217 tgl@sss.pgh.pa.us        2947                 :             66 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2948                 :                : 
                               2949                 :             66 :                     n->subtype = AT_SetTableSpace;
                               2950                 :             66 :                     n->name = $3;
  702 peter@eisentraut.org     2951                 :             66 :                     $$ = (Node *) n;
                               2952                 :                :                 }
                               2953                 :                :             /* ALTER TABLE <name> SET (...) */
                               2954                 :                :             | SET reloptions
                               2955                 :                :                 {
 6496 bruce@momjian.us         2956                 :            291 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2957                 :                : 
 6495 tgl@sss.pgh.pa.us        2958                 :            291 :                     n->subtype = AT_SetRelOptions;
  702 peter@eisentraut.org     2959                 :            291 :                     n->def = (Node *) $2;
                               2960                 :            291 :                     $$ = (Node *) n;
                               2961                 :                :                 }
                               2962                 :                :             /* ALTER TABLE <name> RESET (...) */
                               2963                 :                :             | RESET reloptions
                               2964                 :                :                 {
 6495 tgl@sss.pgh.pa.us        2965                 :             79 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2966                 :                : 
                               2967                 :             79 :                     n->subtype = AT_ResetRelOptions;
  702 peter@eisentraut.org     2968                 :             79 :                     n->def = (Node *) $2;
                               2969                 :             79 :                     $$ = (Node *) n;
                               2970                 :                :                 }
                               2971                 :                :             /* ALTER TABLE <name> REPLICA IDENTITY */
                               2972                 :                :             | REPLICA IDENTITY_P replica_identity
                               2973                 :                :                 {
 3810 rhaas@postgresql.org     2974                 :            215 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2975                 :                : 
                               2976                 :            215 :                     n->subtype = AT_ReplicaIdentity;
                               2977                 :            215 :                     n->def = $3;
  702 peter@eisentraut.org     2978                 :            215 :                     $$ = (Node *) n;
                               2979                 :                :                 }
                               2980                 :                :             /* ALTER TABLE <name> ENABLE ROW LEVEL SECURITY */
                               2981                 :                :             | ENABLE_P ROW LEVEL SECURITY
                               2982                 :                :                 {
 3495 sfrost@snowman.net       2983                 :            139 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2984                 :                : 
                               2985                 :            139 :                     n->subtype = AT_EnableRowSecurity;
  702 peter@eisentraut.org     2986                 :            139 :                     $$ = (Node *) n;
                               2987                 :                :                 }
                               2988                 :                :             /* ALTER TABLE <name> DISABLE ROW LEVEL SECURITY */
                               2989                 :                :             | DISABLE_P ROW LEVEL SECURITY
                               2990                 :                :                 {
 3495 sfrost@snowman.net       2991                 :              5 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2992                 :                : 
                               2993                 :              5 :                     n->subtype = AT_DisableRowSecurity;
  702 peter@eisentraut.org     2994                 :              5 :                     $$ = (Node *) n;
                               2995                 :                :                 }
                               2996                 :                :             /* ALTER TABLE <name> FORCE ROW LEVEL SECURITY */
                               2997                 :                :             | FORCE ROW LEVEL SECURITY
                               2998                 :                :                 {
 3115 sfrost@snowman.net       2999                 :             41 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               3000                 :                : 
                               3001                 :             41 :                     n->subtype = AT_ForceRowSecurity;
  702 peter@eisentraut.org     3002                 :             41 :                     $$ = (Node *) n;
                               3003                 :                :                 }
                               3004                 :                :             /* ALTER TABLE <name> NO FORCE ROW LEVEL SECURITY */
                               3005                 :                :             | NO FORCE ROW LEVEL SECURITY
                               3006                 :                :                 {
 3115 sfrost@snowman.net       3007                 :             16 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               3008                 :                : 
                               3009                 :             16 :                     n->subtype = AT_NoForceRowSecurity;
  702 peter@eisentraut.org     3010                 :             16 :                     $$ = (Node *) n;
                               3011                 :                :                 }
                               3012                 :                :             | alter_generic_options
                               3013                 :                :                 {
 4852 rhaas@postgresql.org     3014                 :             28 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               3015                 :                : 
                               3016                 :             28 :                     n->subtype = AT_GenericOptions;
  702 peter@eisentraut.org     3017                 :             28 :                     n->def = (Node *) $1;
 4852 rhaas@postgresql.org     3018                 :             28 :                     $$ = (Node *) n;
                               3019                 :                :                 }
                               3020                 :                :         ;
                               3021                 :                : 
                               3022                 :                : alter_column_default:
 6012 tgl@sss.pgh.pa.us        3023                 :            183 :             SET DEFAULT a_expr          { $$ = $3; }
 7284                          3024                 :             90 :             | DROP DEFAULT              { $$ = NULL; }
                               3025                 :                :         ;
                               3026                 :                : 
                               3027                 :                : opt_collate_clause:
                               3028                 :                :             COLLATE any_name
                               3029                 :                :                 {
 4785                          3030                 :              6 :                     CollateClause *n = makeNode(CollateClause);
                               3031                 :                : 
                               3032                 :              6 :                     n->arg = NULL;
 4783                          3033                 :              6 :                     n->collname = $2;
 4785                          3034                 :              6 :                     n->location = @1;
                               3035                 :              6 :                     $$ = (Node *) n;
                               3036                 :                :                 }
                               3037                 :           2216 :             | /* EMPTY */               { $$ = NULL; }
                               3038                 :                :         ;
                               3039                 :                : 
                               3040                 :                : alter_using:
 7284                          3041                 :             84 :             USING a_expr                { $$ = $2; }
                               3042                 :            337 :             | /* EMPTY */               { $$ = NULL; }
                               3043                 :                :         ;
                               3044                 :                : 
                               3045                 :                : replica_identity:
                               3046                 :                :             NOTHING
                               3047                 :                :                 {
 3810 rhaas@postgresql.org     3048                 :             18 :                     ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
                               3049                 :                : 
                               3050                 :             18 :                     n->identity_type = REPLICA_IDENTITY_NOTHING;
                               3051                 :             18 :                     n->name = NULL;
                               3052                 :             18 :                     $$ = (Node *) n;
                               3053                 :                :                 }
                               3054                 :                :             | FULL
                               3055                 :                :                 {
                               3056                 :             69 :                     ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
                               3057                 :                : 
                               3058                 :             69 :                     n->identity_type = REPLICA_IDENTITY_FULL;
                               3059                 :             69 :                     n->name = NULL;
                               3060                 :             69 :                     $$ = (Node *) n;
                               3061                 :                :                 }
                               3062                 :                :             | DEFAULT
                               3063                 :                :                 {
                               3064                 :              3 :                     ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
                               3065                 :                : 
                               3066                 :              3 :                     n->identity_type = REPLICA_IDENTITY_DEFAULT;
                               3067                 :              3 :                     n->name = NULL;
                               3068                 :              3 :                     $$ = (Node *) n;
                               3069                 :                :                 }
                               3070                 :                :             | USING INDEX name
                               3071                 :                :                 {
                               3072                 :            125 :                     ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
                               3073                 :                : 
                               3074                 :            125 :                     n->identity_type = REPLICA_IDENTITY_INDEX;
                               3075                 :            125 :                     n->name = $3;
                               3076                 :            125 :                     $$ = (Node *) n;
                               3077                 :                :                 }
                               3078                 :                : ;
                               3079                 :                : 
                               3080                 :                : reloptions:
 4548 peter_e@gmx.net          3081                 :           1235 :             '(' reloption_list ')'                  { $$ = $2; }
                               3082                 :                :         ;
                               3083                 :                : 
 5550 alvherre@alvh.no-ip.     3084                 :            446 : opt_reloptions:     WITH reloptions                 { $$ = $2; }
                               3085                 :           9763 :              |      /* EMPTY */                     { $$ = NIL; }
                               3086                 :                :         ;
                               3087                 :                : 
                               3088                 :                : reloption_list:
                               3089                 :           1235 :             reloption_elem                          { $$ = list_make1($1); }
                               3090                 :            110 :             | reloption_list ',' reloption_elem     { $$ = lappend($1, $3); }
                               3091                 :                :         ;
                               3092                 :                : 
                               3093                 :                : /* This should match def_elem and also allow qualified names */
                               3094                 :                : reloption_elem:
                               3095                 :                :             ColLabel '=' def_arg
                               3096                 :                :                 {
 2777 peter_e@gmx.net          3097                 :           1061 :                     $$ = makeDefElem($1, (Node *) $3, @1);
                               3098                 :                :                 }
                               3099                 :                :             | ColLabel
                               3100                 :                :                 {
                               3101                 :            250 :                     $$ = makeDefElem($1, NULL, @1);
                               3102                 :                :                 }
                               3103                 :                :             | ColLabel '.' ColLabel '=' def_arg
                               3104                 :                :                 {
 5489 tgl@sss.pgh.pa.us        3105                 :             31 :                     $$ = makeDefElemExtended($1, $3, (Node *) $5,
 2777 peter_e@gmx.net          3106                 :             31 :                                              DEFELEM_UNSPEC, @1);
                               3107                 :                :                 }
                               3108                 :                :             | ColLabel '.' ColLabel
                               3109                 :                :                 {
                               3110                 :              3 :                     $$ = makeDefElemExtended($1, $3, NULL, DEFELEM_UNSPEC, @1);
                               3111                 :                :                 }
                               3112                 :                :         ;
                               3113                 :                : 
                               3114                 :                : alter_identity_column_option_list:
                               3115                 :                :             alter_identity_column_option
 2565                          3116                 :             31 :                 { $$ = list_make1($1); }
                               3117                 :                :             | alter_identity_column_option_list alter_identity_column_option
                               3118                 :             30 :                 { $$ = lappend($1, $2); }
                               3119                 :                :         ;
                               3120                 :                : 
                               3121                 :                : alter_identity_column_option:
                               3122                 :                :             RESTART
                               3123                 :                :                 {
                               3124                 :             12 :                     $$ = makeDefElem("restart", NULL, @1);
                               3125                 :                :                 }
                               3126                 :                :             | RESTART opt_with NumericOnly
                               3127                 :                :                 {
  702 peter@eisentraut.org     3128                 :UBC           0 :                     $$ = makeDefElem("restart", (Node *) $3, @1);
                               3129                 :                :                 }
                               3130                 :                :             | SET SeqOptElem
                               3131                 :                :                 {
 2565 peter_e@gmx.net          3132         [ +  - ]:CBC          27 :                     if (strcmp($2->defname, "as") == 0 ||
                               3133         [ +  - ]:             27 :                         strcmp($2->defname, "restart") == 0 ||
                               3134         [ -  + ]:             27 :                         strcmp($2->defname, "owned_by") == 0)
 2565 peter_e@gmx.net          3135         [ #  # ]:UBC           0 :                         ereport(ERROR,
                               3136                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3137                 :                :                                  errmsg("sequence option \"%s\" not supported here", $2->defname),
                               3138                 :                :                                  parser_errposition(@2)));
 2565 peter_e@gmx.net          3139                 :CBC          27 :                     $$ = $2;
                               3140                 :                :                 }
                               3141                 :                :             | SET GENERATED generated_when
                               3142                 :                :                 {
                               3143                 :             22 :                     $$ = makeDefElem("generated", (Node *) makeInteger($3), @1);
                               3144                 :                :                 }
                               3145                 :                :         ;
                               3146                 :                : 
                               3147                 :                : set_statistics_value:
   92 peter@eisentraut.org     3148                 :GNC          79 :             SignedIconst                    { $$ = (Node *) makeInteger($1); }
   92 peter@eisentraut.org     3149                 :UNC           0 :             | DEFAULT                       { $$ = NULL; }
                               3150                 :                :         ;
                               3151                 :                : 
                               3152                 :                : set_access_method_name:
   37 michael@paquier.xyz      3153                 :GNC          46 :             ColId                           { $$ = $1; }
                               3154                 :             18 :             | DEFAULT                       { $$ = NULL; }
                               3155                 :                :         ;
                               3156                 :                : 
                               3157                 :                : PartitionBoundSpec:
                               3158                 :                :             /* a HASH partition */
                               3159                 :                :             FOR VALUES WITH '(' hash_partbound ')'
                               3160                 :                :                 {
                               3161                 :                :                     ListCell   *lc;
 2348 rhaas@postgresql.org     3162                 :CBC         349 :                     PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
                               3163                 :                : 
                               3164                 :            349 :                     n->strategy = PARTITION_STRATEGY_HASH;
                               3165                 :            349 :                     n->modulus = n->remainder = -1;
                               3166                 :                : 
                               3167   [ +  -  +  +  :           1047 :                     foreach (lc, $5)
                                              +  + ]
                               3168                 :                :                     {
                               3169                 :            698 :                         DefElem    *opt = lfirst_node(DefElem, lc);
                               3170                 :                : 
                               3171         [ +  + ]:            698 :                         if (strcmp(opt->defname, "modulus") == 0)
                               3172                 :                :                         {
                               3173         [ -  + ]:            349 :                             if (n->modulus != -1)
 2348 rhaas@postgresql.org     3174         [ #  # ]:UBC           0 :                                 ereport(ERROR,
                               3175                 :                :                                         (errcode(ERRCODE_DUPLICATE_OBJECT),
                               3176                 :                :                                          errmsg("modulus for hash partition provided more than once"),
                               3177                 :                :                                          parser_errposition(opt->location)));
 2348 rhaas@postgresql.org     3178                 :CBC         349 :                             n->modulus = defGetInt32(opt);
                               3179                 :                :                         }
                               3180         [ +  - ]:            349 :                         else if (strcmp(opt->defname, "remainder") == 0)
                               3181                 :                :                         {
                               3182         [ -  + ]:            349 :                             if (n->remainder != -1)
 2348 rhaas@postgresql.org     3183         [ #  # ]:UBC           0 :                                 ereport(ERROR,
                               3184                 :                :                                         (errcode(ERRCODE_DUPLICATE_OBJECT),
                               3185                 :                :                                          errmsg("remainder for hash partition provided more than once"),
                               3186                 :                :                                          parser_errposition(opt->location)));
 2348 rhaas@postgresql.org     3187                 :CBC         349 :                             n->remainder = defGetInt32(opt);
                               3188                 :                :                         }
                               3189                 :                :                         else
 2348 rhaas@postgresql.org     3190         [ #  # ]:UBC           0 :                             ereport(ERROR,
                               3191                 :                :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                               3192                 :                :                                      errmsg("unrecognized hash partition bound specification \"%s\"",
                               3193                 :                :                                             opt->defname),
                               3194                 :                :                                      parser_errposition(opt->location)));
                               3195                 :                :                     }
                               3196                 :                : 
 2348 rhaas@postgresql.org     3197         [ -  + ]:CBC         349 :                     if (n->modulus == -1)
 2348 rhaas@postgresql.org     3198         [ #  # ]:UBC           0 :                         ereport(ERROR,
                               3199                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3200                 :                :                                  errmsg("modulus for hash partition must be specified")));
 2348 rhaas@postgresql.org     3201         [ -  + ]:CBC         349 :                     if (n->remainder == -1)
 2348 rhaas@postgresql.org     3202         [ #  # ]:UBC           0 :                         ereport(ERROR,
                               3203                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3204                 :                :                                  errmsg("remainder for hash partition must be specified")));
                               3205                 :                : 
 2348 rhaas@postgresql.org     3206                 :CBC         349 :                     n->location = @3;
                               3207                 :                : 
                               3208                 :            349 :                     $$ = n;
                               3209                 :                :                 }
                               3210                 :                : 
                               3211                 :                :             /* a LIST partition */
                               3212                 :                :             | FOR VALUES IN_P '(' expr_list ')'
                               3213                 :                :                 {
 2685                          3214                 :           2380 :                     PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
                               3215                 :                : 
                               3216                 :           2380 :                     n->strategy = PARTITION_STRATEGY_LIST;
 2410                          3217                 :           2380 :                     n->is_default = false;
 2685                          3218                 :           2380 :                     n->listdatums = $5;
                               3219                 :           2380 :                     n->location = @3;
                               3220                 :                : 
 2513 tgl@sss.pgh.pa.us        3221                 :           2380 :                     $$ = n;
                               3222                 :                :                 }
                               3223                 :                : 
                               3224                 :                :             /* a RANGE partition */
                               3225                 :                :             | FOR VALUES FROM '(' expr_list ')' TO '(' expr_list ')'
                               3226                 :                :                 {
 2685 rhaas@postgresql.org     3227                 :           2513 :                     PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
                               3228                 :                : 
                               3229                 :           2513 :                     n->strategy = PARTITION_STRATEGY_RANGE;
 2410                          3230                 :           2513 :                     n->is_default = false;
 2685                          3231                 :           2513 :                     n->lowerdatums = $5;
                               3232                 :           2513 :                     n->upperdatums = $9;
                               3233                 :           2513 :                     n->location = @3;
                               3234                 :                : 
 2410                          3235                 :           2513 :                     $$ = n;
                               3236                 :                :                 }
                               3237                 :                : 
                               3238                 :                :             /* a DEFAULT partition */
                               3239                 :                :             | DEFAULT
                               3240                 :                :                 {
                               3241                 :            397 :                     PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
                               3242                 :                : 
                               3243                 :            397 :                     n->is_default = true;
                               3244                 :            397 :                     n->location = @1;
                               3245                 :                : 
 2513 tgl@sss.pgh.pa.us        3246                 :            397 :                     $$ = n;
                               3247                 :                :                 }
                               3248                 :                :         ;
                               3249                 :                : 
                               3250                 :                : hash_partbound_elem:
                               3251                 :                :         NonReservedWord Iconst
                               3252                 :                :             {
  702 peter@eisentraut.org     3253                 :            698 :                 $$ = makeDefElem($1, (Node *) makeInteger($2), @1);
                               3254                 :                :             }
                               3255                 :                :         ;
                               3256                 :                : 
                               3257                 :                : hash_partbound:
                               3258                 :                :         hash_partbound_elem
                               3259                 :                :             {
 2348 rhaas@postgresql.org     3260                 :            349 :                 $$ = list_make1($1);
                               3261                 :                :             }
                               3262                 :                :         | hash_partbound ',' hash_partbound_elem
                               3263                 :                :             {
                               3264                 :            349 :                 $$ = lappend($1, $3);
                               3265                 :                :             }
                               3266                 :                :         ;
                               3267                 :                : 
                               3268                 :                : /*****************************************************************************
                               3269                 :                :  *
                               3270                 :                :  *  ALTER TYPE
                               3271                 :                :  *
                               3272                 :                :  * really variants of the ALTER TABLE subcommands with different spellings
                               3273                 :                :  *****************************************************************************/
                               3274                 :                : 
                               3275                 :                : AlterCompositeTypeStmt:
                               3276                 :                :             ALTER TYPE_P any_name alter_type_cmds
                               3277                 :                :                 {
 4949 peter_e@gmx.net          3278                 :            104 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               3279                 :                : 
                               3280                 :                :                     /* can't use qualified_name, sigh */
                               3281                 :            104 :                     n->relation = makeRangeVarFromAnyName($3, @3, yyscanner);
                               3282                 :            104 :                     n->cmds = $4;
 1373 michael@paquier.xyz      3283                 :            104 :                     n->objtype = OBJECT_TYPE;
  702 peter@eisentraut.org     3284                 :            104 :                     $$ = (Node *) n;
                               3285                 :                :                 }
                               3286                 :                :             ;
                               3287                 :                : 
                               3288                 :                : alter_type_cmds:
 4949 peter_e@gmx.net          3289                 :            104 :             alter_type_cmd                          { $$ = list_make1($1); }
                               3290                 :              6 :             | alter_type_cmds ',' alter_type_cmd    { $$ = lappend($1, $3); }
                               3291                 :                :         ;
                               3292                 :                : 
                               3293                 :                : alter_type_cmd:
                               3294                 :                :             /* ALTER TYPE <name> ADD ATTRIBUTE <coldef> [RESTRICT|CASCADE] */
                               3295                 :                :             ADD_P ATTRIBUTE TableFuncElement opt_drop_behavior
                               3296                 :                :                 {
                               3297                 :             32 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               3298                 :                : 
                               3299                 :             32 :                     n->subtype = AT_AddColumn;
                               3300                 :             32 :                     n->def = $3;
 4891                          3301                 :             32 :                     n->behavior = $4;
  702 peter@eisentraut.org     3302                 :             32 :                     $$ = (Node *) n;
                               3303                 :                :                 }
                               3304                 :                :             /* ALTER TYPE <name> DROP ATTRIBUTE IF EXISTS <attname> [RESTRICT|CASCADE] */
                               3305                 :                :             | DROP ATTRIBUTE IF_P EXISTS ColId opt_drop_behavior
                               3306                 :                :                 {
 4949 peter_e@gmx.net          3307                 :              3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               3308                 :                : 
                               3309                 :              3 :                     n->subtype = AT_DropColumn;
                               3310                 :              3 :                     n->name = $5;
 4891                          3311                 :              3 :                     n->behavior = $6;
 2433                          3312                 :              3 :                     n->missing_ok = true;
  702 peter@eisentraut.org     3313                 :              3 :                     $$ = (Node *) n;
                               3314                 :                :                 }
                               3315                 :                :             /* ALTER TYPE <name> DROP ATTRIBUTE <attname> [RESTRICT|CASCADE] */
                               3316                 :                :             | DROP ATTRIBUTE ColId opt_drop_behavior
                               3317                 :                :                 {
 4949 peter_e@gmx.net          3318                 :             38 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               3319                 :                : 
                               3320                 :             38 :                     n->subtype = AT_DropColumn;
                               3321                 :             38 :                     n->name = $3;
 4891                          3322                 :             38 :                     n->behavior = $4;
 2433                          3323                 :             38 :                     n->missing_ok = false;
  702 peter@eisentraut.org     3324                 :             38 :                     $$ = (Node *) n;
                               3325                 :                :                 }
                               3326                 :                :             /* ALTER TYPE <name> ALTER ATTRIBUTE <attname> [SET DATA] TYPE <typename> [RESTRICT|CASCADE] */
                               3327                 :                :             | ALTER ATTRIBUTE ColId opt_set_data TYPE_P Typename opt_collate_clause opt_drop_behavior
                               3328                 :                :                 {
 4949 peter_e@gmx.net          3329                 :             37 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
 4785 tgl@sss.pgh.pa.us        3330                 :             37 :                     ColumnDef *def = makeNode(ColumnDef);
                               3331                 :                : 
 4949 peter_e@gmx.net          3332                 :             37 :                     n->subtype = AT_AlterColumnType;
                               3333                 :             37 :                     n->name = $3;
 4785 tgl@sss.pgh.pa.us        3334                 :             37 :                     n->def = (Node *) def;
                               3335                 :             37 :                     n->behavior = $8;
                               3336                 :                :                     /* We only use these fields of the ColumnDef node */
                               3337                 :             37 :                     def->typeName = $6;
                               3338                 :             37 :                     def->collClause = (CollateClause *) $7;
                               3339                 :             37 :                     def->raw_default = NULL;
 3797                          3340                 :             37 :                     def->location = @3;
  702 peter@eisentraut.org     3341                 :             37 :                     $$ = (Node *) n;
                               3342                 :                :                 }
                               3343                 :                :         ;
                               3344                 :                : 
                               3345                 :                : 
                               3346                 :                : /*****************************************************************************
                               3347                 :                :  *
                               3348                 :                :  *      QUERY :
                               3349                 :                :  *              close <portalname>
                               3350                 :                :  *
                               3351                 :                :  *****************************************************************************/
                               3352                 :                : 
                               3353                 :                : ClosePortalStmt:
                               3354                 :                :             CLOSE cursor_name
                               3355                 :                :                 {
 9715 bruce@momjian.us         3356                 :           1023 :                     ClosePortalStmt *n = makeNode(ClosePortalStmt);
                               3357                 :                : 
                               3358                 :           1023 :                     n->portalname = $2;
  702 peter@eisentraut.org     3359                 :           1023 :                     $$ = (Node *) n;
                               3360                 :                :                 }
                               3361                 :                :             | CLOSE ALL
                               3362                 :                :                 {
 6212 neilc@samurai.com        3363                 :              6 :                     ClosePortalStmt *n = makeNode(ClosePortalStmt);
                               3364                 :                : 
                               3365                 :              6 :                     n->portalname = NULL;
  702 peter@eisentraut.org     3366                 :              6 :                     $$ = (Node *) n;
                               3367                 :                :                 }
                               3368                 :                :         ;
                               3369                 :                : 
                               3370                 :                : 
                               3371                 :                : /*****************************************************************************
                               3372                 :                :  *
                               3373                 :                :  *      QUERY :
                               3374                 :                :  *              COPY relname [(columnList)] FROM/TO file [WITH] [(options)]
                               3375                 :                :  *              COPY ( query ) TO file  [WITH] [(options)]
                               3376                 :                :  *
                               3377                 :                :  *              where 'query' can be one of:
                               3378                 :                :  *              { SELECT | UPDATE | INSERT | DELETE }
                               3379                 :                :  *
                               3380                 :                :  *              and 'file' can be one of:
                               3381                 :                :  *              { PROGRAM 'command' | STDIN | STDOUT | 'filename' }
                               3382                 :                :  *
                               3383                 :                :  *              In the preferred syntax the options are comma-separated
                               3384                 :                :  *              and use generic identifiers instead of keywords.  The pre-9.0
                               3385                 :                :  *              syntax had a hard-wired, space-separated set of options.
                               3386                 :                :  *
                               3387                 :                :  *              Really old syntax, from versions 7.2 and prior:
                               3388                 :                :  *              COPY [ BINARY ] table FROM/TO file
                               3389                 :                :  *                  [ [ USING ] DELIMITERS 'delimiter' ] ]
                               3390                 :                :  *                  [ WITH NULL AS 'null string' ]
                               3391                 :                :  *              This option placement is not supported with COPY (query...).
                               3392                 :                :  *
                               3393                 :                :  *****************************************************************************/
                               3394                 :                : 
                               3395                 :                : CopyStmt:   COPY opt_binary qualified_name opt_column_list
                               3396                 :                :             copy_from opt_program copy_file_name copy_delimiter opt_with
                               3397                 :                :             copy_options where_clause
                               3398                 :                :                 {
 9715 bruce@momjian.us         3399                 :           4648 :                     CopyStmt *n = makeNode(CopyStmt);
                               3400                 :                : 
 8060 tgl@sss.pgh.pa.us        3401                 :           4648 :                     n->relation = $3;
 6437                          3402                 :           4648 :                     n->query = NULL;
 7941 bruce@momjian.us         3403                 :           4648 :                     n->attlist = $4;
 1972 andres@anarazel.de       3404                 :           4648 :                     n->is_from = $5;
                               3405                 :           4648 :                     n->is_program = $6;
                               3406                 :           4648 :                     n->filename = $7;
 1912 tomas.vondra@postgre     3407                 :           4648 :                     n->whereClause = $11;
                               3408                 :                : 
 4064 heikki.linnakangas@i     3409   [ -  +  -  - ]:           4648 :                     if (n->is_program && n->filename == NULL)
 4064 heikki.linnakangas@i     3410         [ #  # ]:UBC           0 :                         ereport(ERROR,
                               3411                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3412                 :                :                                  errmsg("STDIN/STDOUT not allowed with PROGRAM"),
                               3413                 :                :                                  parser_errposition(@8)));
                               3414                 :                : 
 1912 tomas.vondra@postgre     3415   [ +  +  +  + ]:CBC        4648 :                     if (!n->is_from && n->whereClause != NULL)
                               3416         [ +  - ]:              3 :                         ereport(ERROR,
                               3417                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3418                 :                :                                  errmsg("WHERE clause not allowed with COPY TO"),
                               3419                 :                :                                  parser_errposition(@11)));
                               3420                 :                : 
 7969 bruce@momjian.us         3421                 :           4645 :                     n->options = NIL;
                               3422                 :                :                     /* Concatenate user-supplied flags */
                               3423         [ +  + ]:           4645 :                     if ($2)
                               3424                 :              6 :                         n->options = lappend(n->options, $2);
 1972 andres@anarazel.de       3425         [ -  + ]:           4645 :                     if ($8)
 1972 andres@anarazel.de       3426                 :UBC           0 :                         n->options = lappend(n->options, $8);
 1972 andres@anarazel.de       3427         [ +  + ]:CBC        4645 :                     if ($10)
                               3428                 :            420 :                         n->options = list_concat(n->options, $10);
  702 peter@eisentraut.org     3429                 :           4645 :                     $$ = (Node *) n;
                               3430                 :                :                 }
                               3431                 :                :             | COPY '(' PreparableStmt ')' TO opt_program copy_file_name opt_with copy_options
                               3432                 :                :                 {
 6437 tgl@sss.pgh.pa.us        3433                 :            201 :                     CopyStmt *n = makeNode(CopyStmt);
                               3434                 :                : 
                               3435                 :            201 :                     n->relation = NULL;
 3061 teodor@sigaev.ru         3436                 :            201 :                     n->query = $3;
 6437 tgl@sss.pgh.pa.us        3437                 :            201 :                     n->attlist = NIL;
                               3438                 :            201 :                     n->is_from = false;
 3061 teodor@sigaev.ru         3439                 :            201 :                     n->is_program = $6;
                               3440                 :            201 :                     n->filename = $7;
                               3441                 :            201 :                     n->options = $9;
                               3442                 :                : 
 4064 heikki.linnakangas@i     3443   [ -  +  -  - ]:            201 :                     if (n->is_program && n->filename == NULL)
 4064 heikki.linnakangas@i     3444         [ #  # ]:UBC           0 :                         ereport(ERROR,
                               3445                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3446                 :                :                                  errmsg("STDIN/STDOUT not allowed with PROGRAM"),
                               3447                 :                :                                  parser_errposition(@5)));
                               3448                 :                : 
  702 peter@eisentraut.org     3449                 :CBC         201 :                     $$ = (Node *) n;
                               3450                 :                :                 }
                               3451                 :                :         ;
                               3452                 :                : 
                               3453                 :                : copy_from:
 2433 peter_e@gmx.net          3454                 :            777 :             FROM                                    { $$ = true; }
                               3455                 :           3871 :             | TO                                    { $$ = false; }
                               3456                 :                :         ;
                               3457                 :                : 
                               3458                 :                : opt_program:
 2433 peter_e@gmx.net          3459                 :UBC           0 :             PROGRAM                                 { $$ = true; }
 2433 peter_e@gmx.net          3460                 :CBC        4849 :             | /* EMPTY */                           { $$ = false; }
                               3461                 :                :         ;
                               3462                 :                : 
                               3463                 :                : /*
                               3464                 :                :  * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
                               3465                 :                :  * used depends on the direction. (It really doesn't make sense to copy from
                               3466                 :                :  * stdout. We silently correct the "typo".)        - AY 9/94
                               3467                 :                :  */
                               3468                 :                : copy_file_name:
 7972 bruce@momjian.us         3469                 :            206 :             Sconst                                  { $$ = $1; }
                               3470                 :            609 :             | STDIN                                 { $$ = NULL; }
                               3471                 :           4034 :             | STDOUT                                { $$ = NULL; }
                               3472                 :                :         ;
                               3473                 :                : 
 5319 tgl@sss.pgh.pa.us        3474                 :           4590 : copy_options: copy_opt_list                         { $$ = $1; }
                               3475                 :            259 :             | '(' copy_generic_opt_list ')'         { $$ = $2; }
                               3476                 :                :         ;
                               3477                 :                : 
                               3478                 :                : /* old COPY option syntax */
                               3479                 :                : copy_opt_list:
 7969 bruce@momjian.us         3480                 :            266 :             copy_opt_list copy_opt_item             { $$ = lappend($1, $2); }
                               3481                 :           4590 :             | /* EMPTY */                           { $$ = NIL; }
                               3482                 :                :         ;
                               3483                 :                : 
                               3484                 :                : copy_opt_item:
                               3485                 :                :             BINARY
                               3486                 :                :                 {
  702 peter@eisentraut.org     3487                 :UBC           0 :                     $$ = makeDefElem("format", (Node *) makeString("binary"), @1);
                               3488                 :                :                 }
                               3489                 :                :             | FREEZE
                               3490                 :                :                 {
  702 peter@eisentraut.org     3491                 :CBC          25 :                     $$ = makeDefElem("freeze", (Node *) makeBoolean(true), @1);
                               3492                 :                :                 }
                               3493                 :                :             | DELIMITER opt_as Sconst
                               3494                 :                :                 {
                               3495                 :            103 :                     $$ = makeDefElem("delimiter", (Node *) makeString($3), @1);
                               3496                 :                :                 }
                               3497                 :                :             | NULL_P opt_as Sconst
                               3498                 :                :                 {
                               3499                 :             24 :                     $$ = makeDefElem("null", (Node *) makeString($3), @1);
                               3500                 :                :                 }
                               3501                 :                :             | CSV
                               3502                 :                :                 {
                               3503                 :             72 :                     $$ = makeDefElem("format", (Node *) makeString("csv"), @1);
                               3504                 :                :                 }
                               3505                 :                :             | HEADER_P
                               3506                 :                :                 {
                               3507                 :              9 :                     $$ = makeDefElem("header", (Node *) makeBoolean(true), @1);
                               3508                 :                :                 }
                               3509                 :                :             | QUOTE opt_as Sconst
                               3510                 :                :                 {
                               3511                 :              9 :                     $$ = makeDefElem("quote", (Node *) makeString($3), @1);
                               3512                 :                :                 }
                               3513                 :                :             | ESCAPE opt_as Sconst
                               3514                 :                :                 {
                               3515                 :              9 :                     $$ = makeDefElem("escape", (Node *) makeString($3), @1);
                               3516                 :                :                 }
                               3517                 :                :             | FORCE QUOTE columnList
                               3518                 :                :                 {
                               3519                 :              6 :                     $$ = makeDefElem("force_quote", (Node *) $3, @1);
                               3520                 :                :                 }
                               3521                 :                :             | FORCE QUOTE '*'
                               3522                 :                :                 {
                               3523                 :              3 :                     $$ = makeDefElem("force_quote", (Node *) makeNode(A_Star), @1);
                               3524                 :                :                 }
                               3525                 :                :             | FORCE NOT NULL_P columnList
                               3526                 :                :                 {
  702 peter@eisentraut.org     3527                 :UBC           0 :                     $$ = makeDefElem("force_not_null", (Node *) $4, @1);
                               3528                 :                :                 }
                               3529                 :                :             | FORCE NOT NULL_P '*'
                               3530                 :                :                 {
  197 andrew@dunslane.net      3531                 :UNC           0 :                     $$ = makeDefElem("force_not_null", (Node *) makeNode(A_Star), @1);
                               3532                 :                :                 }
                               3533                 :                :             | FORCE NULL_P columnList
                               3534                 :                :                 {
  702 peter@eisentraut.org     3535                 :UBC           0 :                     $$ = makeDefElem("force_null", (Node *) $3, @1);
                               3536                 :                :                 }
                               3537                 :                :             | FORCE NULL_P '*'
                               3538                 :                :                 {
  197 andrew@dunslane.net      3539                 :UNC           0 :                     $$ = makeDefElem("force_null", (Node *) makeNode(A_Star), @1);
                               3540                 :                :                 }
                               3541                 :                :             | ENCODING Sconst
                               3542                 :                :                 {
  702 peter@eisentraut.org     3543                 :CBC           6 :                     $$ = makeDefElem("encoding", (Node *) makeString($2), @1);
                               3544                 :                :                 }
                               3545                 :                :         ;
                               3546                 :                : 
                               3547                 :                : /* The following exist for backward compatibility with very old versions */
                               3548                 :                : 
                               3549                 :                : opt_binary:
                               3550                 :                :             BINARY
                               3551                 :                :                 {
                               3552                 :              6 :                     $$ = makeDefElem("format", (Node *) makeString("binary"), @1);
                               3553                 :                :                 }
 7969 bruce@momjian.us         3554                 :           4642 :             | /*EMPTY*/                             { $$ = NULL; }
                               3555                 :                :         ;
                               3556                 :                : 
                               3557                 :                : copy_delimiter:
                               3558                 :                :             opt_using DELIMITERS Sconst
                               3559                 :                :                 {
  702 peter@eisentraut.org     3560                 :UBC           0 :                     $$ = makeDefElem("delimiter", (Node *) makeString($3), @2);
                               3561                 :                :                 }
 7969 bruce@momjian.us         3562                 :CBC        4648 :             | /*EMPTY*/                             { $$ = NULL; }
                               3563                 :                :         ;
                               3564                 :                : 
                               3565                 :                : opt_using:
                               3566                 :                :             USING
                               3567                 :                :             | /*EMPTY*/
                               3568                 :                :         ;
                               3569                 :                : 
                               3570                 :                : /* new COPY option syntax */
                               3571                 :                : copy_generic_opt_list:
                               3572                 :                :             copy_generic_opt_elem
                               3573                 :                :                 {
 5319 tgl@sss.pgh.pa.us        3574                 :            259 :                     $$ = list_make1($1);
                               3575                 :                :                 }
                               3576                 :                :             | copy_generic_opt_list ',' copy_generic_opt_elem
                               3577                 :                :                 {
                               3578                 :            183 :                     $$ = lappend($1, $3);
                               3579                 :                :                 }
                               3580                 :                :         ;
                               3581                 :                : 
                               3582                 :                : copy_generic_opt_elem:
                               3583                 :                :             ColLabel copy_generic_opt_arg
                               3584                 :                :                 {
 2777 peter_e@gmx.net          3585                 :            442 :                     $$ = makeDefElem($1, $2, @1);
                               3586                 :                :                 }
                               3587                 :                :         ;
                               3588                 :                : 
                               3589                 :                : copy_generic_opt_arg:
 4923 heikki.linnakangas@i     3590                 :            328 :             opt_boolean_or_string           { $$ = (Node *) makeString($1); }
 5319 tgl@sss.pgh.pa.us        3591                 :UBC           0 :             | NumericOnly                   { $$ = (Node *) $1; }
 5319 tgl@sss.pgh.pa.us        3592                 :CBC          27 :             | '*'                           { $$ = (Node *) makeNode(A_Star); }
   13 msawada@postgresql.o     3593                 :GNC           3 :             | DEFAULT                       { $$ = (Node *) makeString("default"); }
 5319 tgl@sss.pgh.pa.us        3594                 :CBC          75 :             | '(' copy_generic_opt_arg_list ')'     { $$ = (Node *) $2; }
                               3595                 :              9 :             | /* EMPTY */                   { $$ = NULL; }
                               3596                 :                :         ;
                               3597                 :                : 
                               3598                 :                : copy_generic_opt_arg_list:
                               3599                 :                :               copy_generic_opt_arg_list_item
                               3600                 :                :                 {
                               3601                 :             75 :                     $$ = list_make1($1);
                               3602                 :                :                 }
                               3603                 :                :             | copy_generic_opt_arg_list ',' copy_generic_opt_arg_list_item
                               3604                 :                :                 {
                               3605                 :              6 :                     $$ = lappend($1, $3);
                               3606                 :                :                 }
                               3607                 :                :         ;
                               3608                 :                : 
                               3609                 :                : /* beware of emitting non-string list elements here; see commands/define.c */
                               3610                 :                : copy_generic_opt_arg_list_item:
 4923 heikki.linnakangas@i     3611                 :             81 :             opt_boolean_or_string   { $$ = (Node *) makeString($1); }
                               3612                 :                :         ;
                               3613                 :                : 
                               3614                 :                : 
                               3615                 :                : /*****************************************************************************
                               3616                 :                :  *
                               3617                 :                :  *      QUERY :
                               3618                 :                :  *              CREATE TABLE relname
                               3619                 :                :  *
                               3620                 :                :  *****************************************************************************/
                               3621                 :                : 
                               3622                 :                : CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
                               3623                 :                :             OptInherit OptPartitionSpec table_access_method_clause OptWith
                               3624                 :                :             OnCommitOption OptTableSpace
                               3625                 :                :                 {
 9715 bruce@momjian.us         3626                 :          13414 :                     CreateStmt *n = makeNode(CreateStmt);
                               3627                 :                : 
 4871 rhaas@postgresql.org     3628                 :          13414 :                     $4->relpersistence = $2;
 8060 tgl@sss.pgh.pa.us        3629                 :          13414 :                     n->relation = $4;
 8500                          3630                 :          13414 :                     n->tableElts = $6;
 8060                          3631                 :          13414 :                     n->inhRelations = $8;
 2685 rhaas@postgresql.org     3632                 :          13414 :                     n->partspec = $9;
 3311 tgl@sss.pgh.pa.us        3633                 :          13414 :                     n->ofTypename = NULL;
 9628 lockhart@fourpalms.o     3634                 :          13414 :                     n->constraints = NIL;
 1866 andres@anarazel.de       3635                 :          13414 :                     n->accessMethod = $10;
                               3636                 :          13414 :                     n->options = $11;
                               3637                 :          13414 :                     n->oncommit = $12;
                               3638                 :          13414 :                     n->tablespacename = $13;
 5012 rhaas@postgresql.org     3639                 :          13414 :                     n->if_not_exists = false;
  702 peter@eisentraut.org     3640                 :          13414 :                     $$ = (Node *) n;
                               3641                 :                :                 }
                               3642                 :                :         | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name '('
                               3643                 :                :             OptTableElementList ')' OptInherit OptPartitionSpec table_access_method_clause
                               3644                 :                :             OptWith OnCommitOption OptTableSpace
                               3645                 :                :                 {
 5012 rhaas@postgresql.org     3646                 :             14 :                     CreateStmt *n = makeNode(CreateStmt);
                               3647                 :                : 
 4871                          3648                 :             14 :                     $7->relpersistence = $2;
 5012                          3649                 :             14 :                     n->relation = $7;
                               3650                 :             14 :                     n->tableElts = $9;
                               3651                 :             14 :                     n->inhRelations = $11;
 2685                          3652                 :             14 :                     n->partspec = $12;
 3311 tgl@sss.pgh.pa.us        3653                 :             14 :                     n->ofTypename = NULL;
 5012 rhaas@postgresql.org     3654                 :             14 :                     n->constraints = NIL;
 1866 andres@anarazel.de       3655                 :             14 :                     n->accessMethod = $13;
                               3656                 :             14 :                     n->options = $14;
                               3657                 :             14 :                     n->oncommit = $15;
                               3658                 :             14 :                     n->tablespacename = $16;
 5012 rhaas@postgresql.org     3659                 :             14 :                     n->if_not_exists = true;
  702 peter@eisentraut.org     3660                 :             14 :                     $$ = (Node *) n;
                               3661                 :                :                 }
                               3662                 :                :         | CREATE OptTemp TABLE qualified_name OF any_name
                               3663                 :                :             OptTypedTableElementList OptPartitionSpec table_access_method_clause
                               3664                 :                :             OptWith OnCommitOption OptTableSpace
                               3665                 :                :                 {
 7924 lockhart@fourpalms.o     3666                 :             55 :                     CreateStmt *n = makeNode(CreateStmt);
                               3667                 :                : 
 4871 rhaas@postgresql.org     3668                 :             55 :                     $4->relpersistence = $2;
 7924 lockhart@fourpalms.o     3669                 :             55 :                     n->relation = $4;
 5190 peter_e@gmx.net          3670                 :             55 :                     n->tableElts = $7;
 3311 tgl@sss.pgh.pa.us        3671                 :             55 :                     n->inhRelations = NIL;
 2685 rhaas@postgresql.org     3672                 :             55 :                     n->partspec = $8;
 5190 peter_e@gmx.net          3673                 :             55 :                     n->ofTypename = makeTypeNameFromNameList($6);
                               3674                 :             55 :                     n->ofTypename->location = @6;
 7924 lockhart@fourpalms.o     3675                 :             55 :                     n->constraints = NIL;
 1866 andres@anarazel.de       3676                 :             55 :                     n->accessMethod = $9;
                               3677                 :             55 :                     n->options = $10;
                               3678                 :             55 :                     n->oncommit = $11;
                               3679                 :             55 :                     n->tablespacename = $12;
 5012 rhaas@postgresql.org     3680                 :             55 :                     n->if_not_exists = false;
  702 peter@eisentraut.org     3681                 :             55 :                     $$ = (Node *) n;
                               3682                 :                :                 }
                               3683                 :                :         | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name OF any_name
                               3684                 :                :             OptTypedTableElementList OptPartitionSpec table_access_method_clause
                               3685                 :                :             OptWith OnCommitOption OptTableSpace
                               3686                 :                :                 {
 5012 rhaas@postgresql.org     3687                 :              3 :                     CreateStmt *n = makeNode(CreateStmt);
                               3688                 :                : 
 4871                          3689                 :              3 :                     $7->relpersistence = $2;
 5012                          3690                 :              3 :                     n->relation = $7;
                               3691                 :              3 :                     n->tableElts = $10;
 3311 tgl@sss.pgh.pa.us        3692                 :              3 :                     n->inhRelations = NIL;
 2685 rhaas@postgresql.org     3693                 :              3 :                     n->partspec = $11;
 5012                          3694                 :              3 :                     n->ofTypename = makeTypeNameFromNameList($9);
                               3695                 :              3 :                     n->ofTypename->location = @9;
                               3696                 :              3 :                     n->constraints = NIL;
 1866 andres@anarazel.de       3697                 :              3 :                     n->accessMethod = $12;
                               3698                 :              3 :                     n->options = $13;
                               3699                 :              3 :                     n->oncommit = $14;
                               3700                 :              3 :                     n->tablespacename = $15;
 2685 rhaas@postgresql.org     3701                 :              3 :                     n->if_not_exists = true;
  702 peter@eisentraut.org     3702                 :              3 :                     $$ = (Node *) n;
                               3703                 :                :                 }
                               3704                 :                :         | CREATE OptTemp TABLE qualified_name PARTITION OF qualified_name
                               3705                 :                :             OptTypedTableElementList PartitionBoundSpec OptPartitionSpec
                               3706                 :                :             table_access_method_clause OptWith OnCommitOption OptTableSpace
                               3707                 :                :                 {
 2685 rhaas@postgresql.org     3708                 :           4101 :                     CreateStmt *n = makeNode(CreateStmt);
                               3709                 :                : 
                               3710                 :           4101 :                     $4->relpersistence = $2;
                               3711                 :           4101 :                     n->relation = $4;
                               3712                 :           4101 :                     n->tableElts = $8;
                               3713                 :           4101 :                     n->inhRelations = list_make1($7);
 2513 tgl@sss.pgh.pa.us        3714                 :           4101 :                     n->partbound = $9;
 2685 rhaas@postgresql.org     3715                 :           4101 :                     n->partspec = $10;
                               3716                 :           4101 :                     n->ofTypename = NULL;
                               3717                 :           4101 :                     n->constraints = NIL;
 1866 andres@anarazel.de       3718                 :           4101 :                     n->accessMethod = $11;
                               3719                 :           4101 :                     n->options = $12;
                               3720                 :           4101 :                     n->oncommit = $13;
                               3721                 :           4101 :                     n->tablespacename = $14;
 2685 rhaas@postgresql.org     3722                 :           4101 :                     n->if_not_exists = false;
  702 peter@eisentraut.org     3723                 :           4101 :                     $$ = (Node *) n;
                               3724                 :                :                 }
                               3725                 :                :         | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name PARTITION OF
                               3726                 :                :             qualified_name OptTypedTableElementList PartitionBoundSpec OptPartitionSpec
                               3727                 :                :             table_access_method_clause OptWith OnCommitOption OptTableSpace
                               3728                 :                :                 {
 2685 rhaas@postgresql.org     3729                 :UBC           0 :                     CreateStmt *n = makeNode(CreateStmt);
                               3730                 :                : 
                               3731                 :              0 :                     $7->relpersistence = $2;
                               3732                 :              0 :                     n->relation = $7;
                               3733                 :              0 :                     n->tableElts = $11;
                               3734                 :              0 :                     n->inhRelations = list_make1($10);
 2513 tgl@sss.pgh.pa.us        3735                 :              0 :                     n->partbound = $12;
 2685 rhaas@postgresql.org     3736                 :              0 :                     n->partspec = $13;
                               3737                 :              0 :                     n->ofTypename = NULL;
                               3738                 :              0 :                     n->constraints = NIL;
 1866 andres@anarazel.de       3739                 :              0 :                     n->accessMethod = $14;
                               3740                 :              0 :                     n->options = $15;
                               3741                 :              0 :                     n->oncommit = $16;
                               3742                 :              0 :                     n->tablespacename = $17;
 5012 rhaas@postgresql.org     3743                 :              0 :                     n->if_not_exists = true;
  702 peter@eisentraut.org     3744                 :              0 :                     $$ = (Node *) n;
                               3745                 :                :                 }
                               3746                 :                :         ;
                               3747                 :                : 
                               3748                 :                : /*
                               3749                 :                :  * Redundancy here is needed to avoid shift/reduce conflicts,
                               3750                 :                :  * since TEMP is not a reserved word.  See also OptTempTableName.
                               3751                 :                :  *
                               3752                 :                :  * NOTE: we accept both GLOBAL and LOCAL options.  They currently do nothing,
                               3753                 :                :  * but future versions might consider GLOBAL to request SQL-spec-compliant
                               3754                 :                :  * temp table behavior, so warn about that.  Since we have no modules the
                               3755                 :                :  * LOCAL keyword is really meaningless; furthermore, some other products
                               3756                 :                :  * implement LOCAL as meaning the same as our default temp table behavior,
                               3757                 :                :  * so we'll probably continue to treat LOCAL as a noise word.
                               3758                 :                :  */
 4871 rhaas@postgresql.org     3759                 :CBC         147 : OptTemp:    TEMPORARY                   { $$ = RELPERSISTENCE_TEMP; }
                               3760                 :           1296 :             | TEMP                      { $$ = RELPERSISTENCE_TEMP; }
 4326 simon@2ndQuadrant.co     3761                 :UBC           0 :             | LOCAL TEMPORARY           { $$ = RELPERSISTENCE_TEMP; }
                               3762                 :              0 :             | LOCAL TEMP                { $$ = RELPERSISTENCE_TEMP; }
                               3763                 :                :             | GLOBAL TEMPORARY
                               3764                 :                :                 {
 4323 tgl@sss.pgh.pa.us        3765         [ #  # ]:              0 :                     ereport(WARNING,
                               3766                 :                :                             (errmsg("GLOBAL is deprecated in temporary table creation"),
                               3767                 :                :                              parser_errposition(@1)));
                               3768                 :              0 :                     $$ = RELPERSISTENCE_TEMP;
                               3769                 :                :                 }
                               3770                 :                :             | GLOBAL TEMP
                               3771                 :                :                 {
                               3772         [ #  # ]:              0 :                     ereport(WARNING,
                               3773                 :                :                             (errmsg("GLOBAL is deprecated in temporary table creation"),
                               3774                 :                :                              parser_errposition(@1)));
                               3775                 :              0 :                     $$ = RELPERSISTENCE_TEMP;
                               3776                 :                :                 }
 4855 rhaas@postgresql.org     3777                 :CBC          76 :             | UNLOGGED                  { $$ = RELPERSISTENCE_UNLOGGED; }
 4871                          3778                 :          23764 :             | /*EMPTY*/                 { $$ = RELPERSISTENCE_PERMANENT; }
                               3779                 :                :         ;
                               3780                 :                : 
                               3781                 :                : OptTableElementList:
 7923 tgl@sss.pgh.pa.us        3782                 :          12945 :             TableElementList                    { $$ = $1; }
                               3783                 :            684 :             | /*EMPTY*/                         { $$ = NIL; }
                               3784                 :                :         ;
                               3785                 :                : 
                               3786                 :                : OptTypedTableElementList:
 5190 peter_e@gmx.net          3787                 :            151 :             '(' TypedTableElementList ')'       { $$ = $2; }
                               3788                 :           4056 :             | /*EMPTY*/                         { $$ = NIL; }
                               3789                 :                :         ;
                               3790                 :                : 
                               3791                 :                : TableElementList:
                               3792                 :                :             TableElement
                               3793                 :                :                 {
 7259 neilc@samurai.com        3794                 :          12969 :                     $$ = list_make1($1);
                               3795                 :                :                 }
                               3796                 :                :             | TableElementList ',' TableElement
                               3797                 :                :                 {
 7899 tgl@sss.pgh.pa.us        3798                 :          18892 :                     $$ = lappend($1, $3);
                               3799                 :                :                 }
                               3800                 :                :         ;
                               3801                 :                : 
                               3802                 :                : TypedTableElementList:
                               3803                 :                :             TypedTableElement
                               3804                 :                :                 {
 5190 peter_e@gmx.net          3805                 :            151 :                     $$ = list_make1($1);
                               3806                 :                :                 }
                               3807                 :                :             | TypedTableElementList ',' TypedTableElement
                               3808                 :                :                 {
                               3809                 :             34 :                     $$ = lappend($1, $3);
                               3810                 :                :                 }
                               3811                 :                :         ;
                               3812                 :                : 
                               3813                 :                : TableElement:
 7972 bruce@momjian.us         3814                 :          30324 :             columnDef                           { $$ = $1; }
 7967 lockhart@fourpalms.o     3815                 :            363 :             | TableLikeClause                   { $$ = $1; }
 9628                          3816                 :           1174 :             | TableConstraint                   { $$ = $1; }
                               3817                 :                :         ;
                               3818                 :                : 
                               3819                 :                : TypedTableElement:
 5190 peter_e@gmx.net          3820                 :            150 :             columnOptions                       { $$ = $1; }
                               3821                 :             35 :             | TableConstraint                   { $$ = $1; }
                               3822                 :                :         ;
                               3823                 :                : 
                               3824                 :                : columnDef:  ColId Typename opt_column_storage opt_column_compression create_generic_options ColQualList
                               3825                 :                :                 {
 9628 lockhart@fourpalms.o     3826                 :          31294 :                     ColumnDef *n = makeNode(ColumnDef);
                               3827                 :                : 
                               3828                 :          31294 :                     n->colname = $1;
 5386 peter_e@gmx.net          3829                 :          31294 :                     n->typeName = $2;
  641 peter@eisentraut.org     3830                 :          31294 :                     n->storage_name = $3;
                               3831                 :          31294 :                     n->compression = $4;
 4785 tgl@sss.pgh.pa.us        3832                 :          31294 :                     n->inhcount = 0;
 7875                          3833                 :          31294 :                     n->is_local = true;
 4785                          3834                 :          31294 :                     n->is_not_null = false;
                               3835                 :          31294 :                     n->is_from_type = false;
   54 peter@eisentraut.org     3836                 :          31294 :                     n->storage = 0;
 4785 tgl@sss.pgh.pa.us        3837                 :          31294 :                     n->raw_default = NULL;
                               3838                 :          31294 :                     n->cooked_default = NULL;
                               3839                 :          31294 :                     n->collOid = InvalidOid;
  641 peter@eisentraut.org     3840                 :          31294 :                     n->fdwoptions = $5;
                               3841                 :          31294 :                     SplitColQualList($6, &n->constraints, &n->collClause,
                               3842                 :                :                                      yyscanner);
 3797 tgl@sss.pgh.pa.us        3843                 :          31294 :                     n->location = @1;
  702 peter@eisentraut.org     3844                 :          31294 :                     $$ = (Node *) n;
                               3845                 :                :                 }
                               3846                 :                :         ;
                               3847                 :                : 
                               3848                 :                : columnOptions:  ColId ColQualList
                               3849                 :                :                 {
 2544 sfrost@snowman.net       3850                 :             60 :                     ColumnDef *n = makeNode(ColumnDef);
                               3851                 :                : 
                               3852                 :             60 :                     n->colname = $1;
                               3853                 :             60 :                     n->typeName = NULL;
                               3854                 :             60 :                     n->inhcount = 0;
                               3855                 :             60 :                     n->is_local = true;
                               3856                 :             60 :                     n->is_not_null = false;
                               3857                 :             60 :                     n->is_from_type = false;
   54 peter@eisentraut.org     3858                 :             60 :                     n->storage = 0;
 2544 sfrost@snowman.net       3859                 :             60 :                     n->raw_default = NULL;
                               3860                 :             60 :                     n->cooked_default = NULL;
                               3861                 :             60 :                     n->collOid = InvalidOid;
                               3862                 :             60 :                     SplitColQualList($2, &n->constraints, &n->collClause,
                               3863                 :                :                                      yyscanner);
                               3864                 :             60 :                     n->location = @1;
  702 peter@eisentraut.org     3865                 :             60 :                     $$ = (Node *) n;
                               3866                 :                :                 }
                               3867                 :                :                 | ColId WITH OPTIONS ColQualList
                               3868                 :                :                 {
 5190 peter_e@gmx.net          3869                 :             90 :                     ColumnDef *n = makeNode(ColumnDef);
                               3870                 :                : 
                               3871                 :             90 :                     n->colname = $1;
 4785 tgl@sss.pgh.pa.us        3872                 :             90 :                     n->typeName = NULL;
                               3873                 :             90 :                     n->inhcount = 0;
 5190 peter_e@gmx.net          3874                 :             90 :                     n->is_local = true;
 4785 tgl@sss.pgh.pa.us        3875                 :             90 :                     n->is_not_null = false;
                               3876                 :             90 :                     n->is_from_type = false;
   54 peter@eisentraut.org     3877                 :             90 :                     n->storage = 0;
 4785 tgl@sss.pgh.pa.us        3878                 :             90 :                     n->raw_default = NULL;
                               3879                 :             90 :                     n->cooked_default = NULL;
                               3880                 :             90 :                     n->collOid = InvalidOid;
                               3881                 :             90 :                     SplitColQualList($4, &n->constraints, &n->collClause,
                               3882                 :                :                                      yyscanner);
 3797                          3883                 :             90 :                     n->location = @1;
  702 peter@eisentraut.org     3884                 :             90 :                     $$ = (Node *) n;
                               3885                 :                :                 }
                               3886                 :                :         ;
                               3887                 :                : 
                               3888                 :                : column_compression:
 1053 tgl@sss.pgh.pa.us        3889                 :             68 :             COMPRESSION ColId                       { $$ = $2; }
                               3890                 :              3 :             | COMPRESSION DEFAULT                   { $$ = pstrdup("default"); }
                               3891                 :                :         ;
                               3892                 :                : 
                               3893                 :                : opt_column_compression:
                               3894                 :             38 :             column_compression                      { $$ = $1; }
                               3895                 :          31286 :             | /*EMPTY*/                             { $$ = NULL; }
                               3896                 :                :         ;
                               3897                 :                : 
                               3898                 :                : column_storage:
  641 peter@eisentraut.org     3899                 :            113 :             STORAGE ColId                           { $$ = $2; }
  521 tgl@sss.pgh.pa.us        3900                 :              3 :             | STORAGE DEFAULT                       { $$ = pstrdup("default"); }
                               3901                 :                :         ;
                               3902                 :                : 
                               3903                 :                : opt_column_storage:
  641 peter@eisentraut.org     3904                 :             10 :             column_storage                          { $$ = $1; }
                               3905                 :          31314 :             | /*EMPTY*/                             { $$ = NULL; }
                               3906                 :                :         ;
                               3907                 :                : 
                               3908                 :                : ColQualList:
 7972 bruce@momjian.us         3909                 :           8511 :             ColQualList ColConstraint               { $$ = lappend($1, $2); }
                               3910                 :          32038 :             | /*EMPTY*/                             { $$ = NIL; }
                               3911                 :                :         ;
                               3912                 :                : 
                               3913                 :                : ColConstraint:
                               3914                 :                :             CONSTRAINT name ColConstraintElem
                               3915                 :                :                 {
 2609 peter_e@gmx.net          3916                 :            340 :                     Constraint *n = castNode(Constraint, $3);
                               3917                 :                : 
 5372 tgl@sss.pgh.pa.us        3918                 :            340 :                     n->conname = $2;
                               3919                 :            340 :                     n->location = @1;
                               3920                 :            340 :                     $$ = (Node *) n;
                               3921                 :                :                 }
 7972 bruce@momjian.us         3922                 :           7779 :             | ColConstraintElem                     { $$ = $1; }
                               3923                 :             87 :             | ConstraintAttr                        { $$ = $1; }
                               3924                 :                :             | COLLATE any_name
                               3925                 :                :                 {
                               3926                 :                :                     /*
                               3927                 :                :                      * Note: the CollateClause is momentarily included in
                               3928                 :                :                      * the list built by ColQualList, but we split it out
                               3929                 :                :                      * again in SplitColQualList.
                               3930                 :                :                      */
 4785 tgl@sss.pgh.pa.us        3931                 :            305 :                     CollateClause *n = makeNode(CollateClause);
                               3932                 :                : 
                               3933                 :            305 :                     n->arg = NULL;
 4783                          3934                 :            305 :                     n->collname = $2;
 4785                          3935                 :            305 :                     n->location = @1;
                               3936                 :            305 :                     $$ = (Node *) n;
                               3937                 :                :                 }
                               3938                 :                :         ;
                               3939                 :                : 
                               3940                 :                : /* DEFAULT NULL is already the default for Postgres.
                               3941                 :                :  * But define it here and carry it forward into the system
                               3942                 :                :  * to make it explicit.
                               3943                 :                :  * - thomas 1998-09-13
                               3944                 :                :  *
                               3945                 :                :  * WITH NULL and NULL are not SQL-standard syntax elements,
                               3946                 :                :  * so leave them out. Use DEFAULT NULL to explicitly indicate
                               3947                 :                :  * that a column may have that value. WITH NULL leads to
                               3948                 :                :  * shift/reduce conflicts with WITH TIME ZONE anyway.
                               3949                 :                :  * - thomas 1999-01-08
                               3950                 :                :  *
                               3951                 :                :  * DEFAULT expression must be b_expr not a_expr to prevent shift/reduce
                               3952                 :                :  * conflict on NOT (since NOT might start a subsequent NOT NULL constraint,
                               3953                 :                :  * or be part of a_expr NOT LIKE or similar constructs).
                               3954                 :                :  */
                               3955                 :                : ColConstraintElem:
                               3956                 :                :             NOT NULL_P opt_no_inherit
                               3957                 :                :                 {
 8810                          3958                 :           2991 :                     Constraint *n = makeNode(Constraint);
                               3959                 :                : 
                               3960                 :           2991 :                     n->contype = CONSTR_NOTNULL;
 5372                          3961                 :           2991 :                     n->location = @1;
  233 alvherre@alvh.no-ip.     3962                 :GNC        2991 :                     n->is_no_inherit = $3;
                               3963                 :           2991 :                     n->skip_validation = false;
                               3964                 :           2991 :                     n->initially_valid = true;
  702 peter@eisentraut.org     3965                 :CBC        2991 :                     $$ = (Node *) n;
                               3966                 :                :                 }
                               3967                 :                :             | NULL_P
                               3968                 :                :                 {
 8810 tgl@sss.pgh.pa.us        3969                 :             11 :                     Constraint *n = makeNode(Constraint);
                               3970                 :                : 
                               3971                 :             11 :                     n->contype = CONSTR_NULL;
 5372                          3972                 :             11 :                     n->location = @1;
  702 peter@eisentraut.org     3973                 :             11 :                     $$ = (Node *) n;
                               3974                 :                :                 }
                               3975                 :                :             | UNIQUE opt_unique_null_treatment opt_definition OptConsTableSpace
                               3976                 :                :                 {
 9342 lockhart@fourpalms.o     3977                 :            199 :                     Constraint *n = makeNode(Constraint);
                               3978                 :                : 
 8825                          3979                 :            199 :                     n->contype = CONSTR_UNIQUE;
 5372 tgl@sss.pgh.pa.us        3980                 :            199 :                     n->location = @1;
  801 peter@eisentraut.org     3981                 :            199 :                     n->nulls_not_distinct = !$2;
 9342 lockhart@fourpalms.o     3982                 :            199 :                     n->keys = NULL;
  801 peter@eisentraut.org     3983                 :            199 :                     n->options = $3;
 4828 tgl@sss.pgh.pa.us        3984                 :            199 :                     n->indexname = NULL;
  801 peter@eisentraut.org     3985                 :            199 :                     n->indexspace = $4;
  702                          3986                 :            199 :                     $$ = (Node *) n;
                               3987                 :                :                 }
                               3988                 :                :             | PRIMARY KEY opt_definition OptConsTableSpace
                               3989                 :                :                 {
 8810 tgl@sss.pgh.pa.us        3990                 :           2713 :                     Constraint *n = makeNode(Constraint);
                               3991                 :                : 
                               3992                 :           2713 :                     n->contype = CONSTR_PRIMARY;
 5372                          3993                 :           2713 :                     n->location = @1;
 8810                          3994                 :           2713 :                     n->keys = NULL;
 6496 bruce@momjian.us         3995                 :           2713 :                     n->options = $3;
 4828 tgl@sss.pgh.pa.us        3996                 :           2713 :                     n->indexname = NULL;
 6496 bruce@momjian.us         3997                 :           2713 :                     n->indexspace = $4;
  702 peter@eisentraut.org     3998                 :           2713 :                     $$ = (Node *) n;
                               3999                 :                :                 }
                               4000                 :                :             | CHECK '(' a_expr ')' opt_no_inherit
                               4001                 :                :                 {
 9628 lockhart@fourpalms.o     4002                 :            437 :                     Constraint *n = makeNode(Constraint);
                               4003                 :                : 
 8825                          4004                 :            437 :                     n->contype = CONSTR_CHECK;
 5372 tgl@sss.pgh.pa.us        4005                 :            437 :                     n->location = @1;
 4282 alvherre@alvh.no-ip.     4006                 :            437 :                     n->is_no_inherit = $5;
                               4007                 :            437 :                     n->raw_expr = $3;
 8960 tgl@sss.pgh.pa.us        4008                 :            437 :                     n->cooked_expr = NULL;
 3042 rhaas@postgresql.org     4009                 :            437 :                     n->skip_validation = false;
                               4010                 :            437 :                     n->initially_valid = true;
  702 peter@eisentraut.org     4011                 :            437 :                     $$ = (Node *) n;
                               4012                 :                :                 }
                               4013                 :                :             | DEFAULT b_expr
                               4014                 :                :                 {
 8810 tgl@sss.pgh.pa.us        4015                 :            818 :                     Constraint *n = makeNode(Constraint);
                               4016                 :                : 
                               4017                 :            818 :                     n->contype = CONSTR_DEFAULT;
 5372                          4018                 :            818 :                     n->location = @1;
 6012                          4019                 :            818 :                     n->raw_expr = $2;
 8810                          4020                 :            818 :                     n->cooked_expr = NULL;
  702 peter@eisentraut.org     4021                 :            818 :                     $$ = (Node *) n;
                               4022                 :                :                 }
                               4023                 :                :             | GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList
                               4024                 :                :                 {
 2565 peter_e@gmx.net          4025                 :            139 :                     Constraint *n = makeNode(Constraint);
                               4026                 :                : 
                               4027                 :            139 :                     n->contype = CONSTR_IDENTITY;
                               4028                 :            139 :                     n->generated_when = $2;
                               4029                 :            139 :                     n->options = $5;
                               4030                 :            139 :                     n->location = @1;
  702 peter@eisentraut.org     4031                 :            139 :                     $$ = (Node *) n;
                               4032                 :                :                 }
                               4033                 :                :             | GENERATED generated_when AS '(' a_expr ')' STORED
                               4034                 :                :                 {
 1842                          4035                 :            436 :                     Constraint *n = makeNode(Constraint);
                               4036                 :                : 
                               4037                 :            436 :                     n->contype = CONSTR_GENERATED;
                               4038                 :            436 :                     n->generated_when = $2;
                               4039                 :            436 :                     n->raw_expr = $5;
                               4040                 :            436 :                     n->cooked_expr = NULL;
                               4041                 :            436 :                     n->location = @1;
                               4042                 :                : 
                               4043                 :                :                     /*
                               4044                 :                :                      * Can't do this in the grammar because of shift/reduce
                               4045                 :                :                      * conflicts.  (IDENTITY allows both ALWAYS and BY
                               4046                 :                :                      * DEFAULT, but generated columns only allow ALWAYS.)  We
                               4047                 :                :                      * can also give a more useful error message and location.
                               4048                 :                :                      */
 1840                          4049         [ +  + ]:            436 :                     if ($2 != ATTRIBUTE_IDENTITY_ALWAYS)
                               4050         [ +  - ]:              3 :                         ereport(ERROR,
                               4051                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               4052                 :                :                                  errmsg("for a generated column, GENERATED ALWAYS must be specified"),
                               4053                 :                :                                  parser_errposition(@2)));
                               4054                 :                : 
  702                          4055                 :            433 :                     $$ = (Node *) n;
                               4056                 :                :                 }
                               4057                 :                :             | REFERENCES qualified_name opt_column_list key_match key_actions
                               4058                 :                :                 {
 5372 tgl@sss.pgh.pa.us        4059                 :            378 :                     Constraint *n = makeNode(Constraint);
                               4060                 :                : 
                               4061                 :            378 :                     n->contype = CONSTR_FOREIGN;
                               4062                 :            378 :                     n->location = @1;
 1005 peter@eisentraut.org     4063                 :            378 :                     n->pktable = $2;
                               4064                 :            378 :                     n->fk_attrs = NIL;
                               4065                 :            378 :                     n->pk_attrs = $3;
                               4066                 :            378 :                     n->fk_matchtype = $4;
  858                          4067                 :            378 :                     n->fk_upd_action = ($5)->updateAction->action;
                               4068                 :            378 :                     n->fk_del_action = ($5)->deleteAction->action;
                               4069                 :            378 :                     n->fk_del_set_cols = ($5)->deleteAction->cols;
 1005                          4070                 :            378 :                     n->skip_validation = false;
                               4071                 :            378 :                     n->initially_valid = true;
  702                          4072                 :            378 :                     $$ = (Node *) n;
                               4073                 :                :                 }
                               4074                 :                :         ;
                               4075                 :                : 
                               4076                 :                : opt_unique_null_treatment:
  801                          4077                 :              6 :             NULLS_P DISTINCT        { $$ = true; }
                               4078                 :             15 :             | NULLS_P NOT DISTINCT  { $$ = false; }
                               4079                 :           3623 :             | /*EMPTY*/             { $$ = true; }
                               4080                 :                :         ;
                               4081                 :                : 
                               4082                 :                : generated_when:
 2565 peter_e@gmx.net          4083                 :            601 :             ALWAYS          { $$ = ATTRIBUTE_IDENTITY_ALWAYS; }
                               4084                 :             73 :             | BY DEFAULT    { $$ = ATTRIBUTE_IDENTITY_BY_DEFAULT; }
                               4085                 :                :         ;
                               4086                 :                : 
                               4087                 :                : /*
                               4088                 :                :  * ConstraintAttr represents constraint attributes, which we parse as if
                               4089                 :                :  * they were independent constraint clauses, in order to avoid shift/reduce
                               4090                 :                :  * conflicts (since NOT might start either an independent NOT NULL clause
                               4091                 :                :  * or an attribute).  parse_utilcmd.c is responsible for attaching the
                               4092                 :                :  * attribute information to the preceding "real" constraint node, and for
                               4093                 :                :  * complaining if attribute clauses appear in the wrong place or wrong
                               4094                 :                :  * combinations.
                               4095                 :                :  *
                               4096                 :                :  * See also ConstraintAttributeSpec, which can be used in places where
                               4097                 :                :  * there is no parsing conflict.  (Note: currently, NOT VALID and NO INHERIT
                               4098                 :                :  * are allowed clauses in ConstraintAttributeSpec, but not here.  Someday we
                               4099                 :                :  * might need to allow them here too, but for the moment it doesn't seem
                               4100                 :                :  * useful in the statements that use ConstraintAttr.)
                               4101                 :                :  */
                               4102                 :                : ConstraintAttr:
                               4103                 :                :             DEFERRABLE
                               4104                 :                :                 {
 8821 lockhart@fourpalms.o     4105                 :             48 :                     Constraint *n = makeNode(Constraint);
                               4106                 :                : 
 8810 tgl@sss.pgh.pa.us        4107                 :             48 :                     n->contype = CONSTR_ATTR_DEFERRABLE;
 5372                          4108                 :             48 :                     n->location = @1;
  702 peter@eisentraut.org     4109                 :             48 :                     $$ = (Node *) n;
                               4110                 :                :                 }
                               4111                 :                :             | NOT DEFERRABLE
                               4112                 :                :                 {
 8821 lockhart@fourpalms.o     4113                 :UBC           0 :                     Constraint *n = makeNode(Constraint);
                               4114                 :                : 
 8810 tgl@sss.pgh.pa.us        4115                 :              0 :                     n->contype = CONSTR_ATTR_NOT_DEFERRABLE;
 5372                          4116                 :              0 :                     n->location = @1;
  702 peter@eisentraut.org     4117                 :              0 :                     $$ = (Node *) n;
                               4118                 :                :                 }
                               4119                 :                :             | INITIALLY DEFERRED
                               4120                 :                :                 {
 8810 tgl@sss.pgh.pa.us        4121                 :CBC          36 :                     Constraint *n = makeNode(Constraint);
                               4122                 :                : 
                               4123                 :             36 :                     n->contype = CONSTR_ATTR_DEFERRED;
 5372                          4124                 :             36 :                     n->location = @1;
  702 peter@eisentraut.org     4125                 :             36 :                     $$ = (Node *) n;
                               4126                 :                :                 }
                               4127                 :                :             | INITIALLY IMMEDIATE
                               4128                 :                :                 {
 8810 tgl@sss.pgh.pa.us        4129                 :              3 :                     Constraint *n = makeNode(Constraint);
                               4130                 :                : 
                               4131                 :              3 :                     n->contype = CONSTR_ATTR_IMMEDIATE;
 5372                          4132                 :              3 :                     n->location = @1;
  702 peter@eisentraut.org     4133                 :              3 :                     $$ = (Node *) n;
                               4134                 :                :                 }
                               4135                 :                :         ;
                               4136                 :                : 
                               4137                 :                : 
                               4138                 :                : TableLikeClause:
                               4139                 :                :             LIKE qualified_name TableLikeOptionList
                               4140                 :                :                 {
 4481 peter_e@gmx.net          4141                 :            363 :                     TableLikeClause *n = makeNode(TableLikeClause);
                               4142                 :                : 
 7599 bruce@momjian.us         4143                 :            363 :                     n->relation = $2;
 6501                          4144                 :            363 :                     n->options = $3;
 1230 tgl@sss.pgh.pa.us        4145                 :            363 :                     n->relationOid = InvalidOid;
  702 peter@eisentraut.org     4146                 :            363 :                     $$ = (Node *) n;
                               4147                 :                :                 }
                               4148                 :                :         ;
                               4149                 :                : 
                               4150                 :                : TableLikeOptionList:
 5298 andrew@dunslane.net      4151                 :            126 :                 TableLikeOptionList INCLUDING TableLikeOption   { $$ = $1 | $3; }
                               4152                 :              1 :                 | TableLikeOptionList EXCLUDING TableLikeOption { $$ = $1 & ~$3; }
                               4153                 :            363 :                 | /* EMPTY */                       { $$ = 0; }
                               4154                 :                :         ;
                               4155                 :                : 
                               4156                 :                : TableLikeOption:
 2232 alvherre@alvh.no-ip.     4157                 :             12 :                 COMMENTS            { $$ = CREATE_TABLE_LIKE_COMMENTS; }
 1087 fujii@postgresql.org     4158                 :              3 :                 | COMPRESSION       { $$ = CREATE_TABLE_LIKE_COMPRESSION; }
 5298 andrew@dunslane.net      4159                 :             27 :                 | CONSTRAINTS       { $$ = CREATE_TABLE_LIKE_CONSTRAINTS; }
 2232 alvherre@alvh.no-ip.     4160                 :             10 :                 | DEFAULTS          { $$ = CREATE_TABLE_LIKE_DEFAULTS; }
 2565 peter_e@gmx.net          4161                 :              3 :                 | IDENTITY_P        { $$ = CREATE_TABLE_LIKE_IDENTITY; }
 1842 peter@eisentraut.org     4162                 :             12 :                 | GENERATED         { $$ = CREATE_TABLE_LIKE_GENERATED; }
 5298 andrew@dunslane.net      4163                 :             25 :                 | INDEXES           { $$ = CREATE_TABLE_LIKE_INDEXES; }
 2232 alvherre@alvh.no-ip.     4164                 :UBC           0 :                 | STATISTICS        { $$ = CREATE_TABLE_LIKE_STATISTICS; }
 5298 andrew@dunslane.net      4165                 :CBC          13 :                 | STORAGE           { $$ = CREATE_TABLE_LIKE_STORAGE; }
                               4166                 :             22 :                 | ALL               { $$ = CREATE_TABLE_LIKE_ALL; }
                               4167                 :                :         ;
                               4168                 :                : 
                               4169                 :                : 
                               4170                 :                : /* ConstraintElem specifies constraint syntax which is not embedded into
                               4171                 :                :  *  a column definition. ColConstraintElem specifies the embedded form.
                               4172                 :                :  * - thomas 1997-12-03
                               4173                 :                :  */
                               4174                 :                : TableConstraint:
                               4175                 :                :             CONSTRAINT name ConstraintElem
                               4176                 :                :                 {
 2609 peter_e@gmx.net          4177                 :           1708 :                     Constraint *n = castNode(Constraint, $3);
                               4178                 :                : 
 5372 tgl@sss.pgh.pa.us        4179                 :           1708 :                     n->conname = $2;
                               4180                 :           1708 :                     n->location = @1;
                               4181                 :           1708 :                     $$ = (Node *) n;
                               4182                 :                :                 }
 7972 bruce@momjian.us         4183                 :           5264 :             | ConstraintElem                        { $$ = $1; }
                               4184                 :                :         ;
                               4185                 :                : 
                               4186                 :                : ConstraintElem:
                               4187                 :                :             CHECK '(' a_expr ')' ConstraintAttributeSpec
                               4188                 :                :                 {
 9628 lockhart@fourpalms.o     4189                 :            591 :                     Constraint *n = makeNode(Constraint);
                               4190                 :                : 
                               4191                 :            591 :                     n->contype = CONSTR_CHECK;
 5372 tgl@sss.pgh.pa.us        4192                 :            591 :                     n->location = @1;
 4282 alvherre@alvh.no-ip.     4193                 :            591 :                     n->raw_expr = $3;
 8960 tgl@sss.pgh.pa.us        4194                 :            591 :                     n->cooked_expr = NULL;
 4282 alvherre@alvh.no-ip.     4195                 :            591 :                     processCASbits($5, @5, "CHECK",
                               4196                 :                :                                    NULL, NULL, &n->skip_validation,
                               4197                 :                :                                    &n->is_no_inherit, yyscanner);
 4701                          4198                 :            591 :                     n->initially_valid = !n->skip_validation;
  702 peter@eisentraut.org     4199                 :            591 :                     $$ = (Node *) n;
                               4200                 :                :                 }
                               4201                 :                :             | NOT NULL_P ColId ConstraintAttributeSpec
                               4202                 :                :                 {
  233 alvherre@alvh.no-ip.     4203                 :GNC          85 :                     Constraint *n = makeNode(Constraint);
                               4204                 :                : 
                               4205                 :             85 :                     n->contype = CONSTR_NOTNULL;
                               4206                 :             85 :                     n->location = @1;
                               4207                 :             85 :                     n->keys = list_make1(makeString($3));
                               4208                 :                :                     /* no NOT VALID support yet */
                               4209                 :             85 :                     processCASbits($4, @4, "NOT NULL",
                               4210                 :                :                                    NULL, NULL, NULL,
                               4211                 :                :                                    &n->is_no_inherit, yyscanner);
                               4212                 :             85 :                     n->initially_valid = true;
                               4213                 :             85 :                     $$ = (Node *) n;
                               4214                 :                :                 }
                               4215                 :                :             | UNIQUE opt_unique_null_treatment '(' columnList opt_without_overlaps ')' opt_c_include opt_definition OptConsTableSpace
                               4216                 :                :                 ConstraintAttributeSpec
                               4217                 :                :                 {
 9628 lockhart@fourpalms.o     4218                 :CBC         256 :                     Constraint *n = makeNode(Constraint);
                               4219                 :                : 
                               4220                 :            256 :                     n->contype = CONSTR_UNIQUE;
 5372 tgl@sss.pgh.pa.us        4221                 :            256 :                     n->location = @1;
  801 peter@eisentraut.org     4222                 :            256 :                     n->nulls_not_distinct = !$2;
                               4223                 :            256 :                     n->keys = $4;
   81 peter@eisentraut.org     4224                 :GNC         256 :                     n->without_overlaps = $5;
                               4225                 :            256 :                     n->including = $7;
                               4226                 :            256 :                     n->options = $8;
 4828 tgl@sss.pgh.pa.us        4227                 :CBC         256 :                     n->indexname = NULL;
   81 peter@eisentraut.org     4228                 :GNC         256 :                     n->indexspace = $9;
                               4229                 :            256 :                     processCASbits($10, @10, "UNIQUE",
                               4230                 :                :                                    &n->deferrable, &n->initdeferred, NULL,
                               4231                 :                :                                    NULL, yyscanner);
  702 peter@eisentraut.org     4232                 :CBC         256 :                     $$ = (Node *) n;
                               4233                 :                :                 }
                               4234                 :                :             | UNIQUE ExistingIndex ConstraintAttributeSpec
                               4235                 :                :                 {
 4828 tgl@sss.pgh.pa.us        4236                 :           1793 :                     Constraint *n = makeNode(Constraint);
                               4237                 :                : 
                               4238                 :           1793 :                     n->contype = CONSTR_UNIQUE;
                               4239                 :           1793 :                     n->location = @1;
                               4240                 :           1793 :                     n->keys = NIL;
 2199 teodor@sigaev.ru         4241                 :           1793 :                     n->including = NIL;
 4828 tgl@sss.pgh.pa.us        4242                 :           1793 :                     n->options = NIL;
                               4243                 :           1793 :                     n->indexname = $2;
                               4244                 :           1793 :                     n->indexspace = NULL;
 4687                          4245                 :           1793 :                     processCASbits($3, @3, "UNIQUE",
                               4246                 :                :                                    &n->deferrable, &n->initdeferred, NULL,
                               4247                 :                :                                    NULL, yyscanner);
  702 peter@eisentraut.org     4248                 :           1793 :                     $$ = (Node *) n;
                               4249                 :                :                 }
                               4250                 :                :             | PRIMARY KEY '(' columnList opt_without_overlaps ')' opt_c_include opt_definition OptConsTableSpace
                               4251                 :                :                 ConstraintAttributeSpec
                               4252                 :                :                 {
 8810 tgl@sss.pgh.pa.us        4253                 :            943 :                     Constraint *n = makeNode(Constraint);
                               4254                 :                : 
                               4255                 :            943 :                     n->contype = CONSTR_PRIMARY;
 5372                          4256                 :            943 :                     n->location = @1;
 8810                          4257                 :            943 :                     n->keys = $4;
   81 peter@eisentraut.org     4258                 :GNC         943 :                     n->without_overlaps = $5;
                               4259                 :            943 :                     n->including = $7;
                               4260                 :            943 :                     n->options = $8;
 4828 tgl@sss.pgh.pa.us        4261                 :CBC         943 :                     n->indexname = NULL;
   81 peter@eisentraut.org     4262                 :GNC         943 :                     n->indexspace = $9;
                               4263                 :            943 :                     processCASbits($10, @10, "PRIMARY KEY",
                               4264                 :                :                                    &n->deferrable, &n->initdeferred, NULL,
                               4265                 :                :                                    NULL, yyscanner);
  702 peter@eisentraut.org     4266                 :CBC         943 :                     $$ = (Node *) n;
                               4267                 :                :                 }
                               4268                 :                :             | PRIMARY KEY ExistingIndex ConstraintAttributeSpec
                               4269                 :                :                 {
 4828 tgl@sss.pgh.pa.us        4270                 :           2327 :                     Constraint *n = makeNode(Constraint);
                               4271                 :                : 
                               4272                 :           2327 :                     n->contype = CONSTR_PRIMARY;
                               4273                 :           2327 :                     n->location = @1;
                               4274                 :           2327 :                     n->keys = NIL;
 2199 teodor@sigaev.ru         4275                 :           2327 :                     n->including = NIL;
 4828 tgl@sss.pgh.pa.us        4276                 :           2327 :                     n->options = NIL;
                               4277                 :           2327 :                     n->indexname = $3;
                               4278                 :           2327 :                     n->indexspace = NULL;
 4687                          4279                 :           2327 :                     processCASbits($4, @4, "PRIMARY KEY",
                               4280                 :                :                                    &n->deferrable, &n->initdeferred, NULL,
                               4281                 :                :                                    NULL, yyscanner);
  702 peter@eisentraut.org     4282                 :           2327 :                     $$ = (Node *) n;
                               4283                 :                :                 }
                               4284                 :                :             | EXCLUDE access_method_clause '(' ExclusionConstraintList ')'
                               4285                 :                :                 opt_c_include opt_definition OptConsTableSpace OptWhereClause
                               4286                 :                :                 ConstraintAttributeSpec
                               4287                 :                :                 {
 5242 tgl@sss.pgh.pa.us        4288                 :            117 :                     Constraint *n = makeNode(Constraint);
                               4289                 :                : 
                               4290                 :            117 :                     n->contype = CONSTR_EXCLUSION;
                               4291                 :            117 :                     n->location = @1;
 1005 peter@eisentraut.org     4292                 :            117 :                     n->access_method = $2;
                               4293                 :            117 :                     n->exclusions = $4;
                               4294                 :            117 :                     n->including = $6;
                               4295                 :            117 :                     n->options = $7;
                               4296                 :            117 :                     n->indexname = NULL;
                               4297                 :            117 :                     n->indexspace = $8;
                               4298                 :            117 :                     n->where_clause = $9;
 2199 teodor@sigaev.ru         4299                 :            117 :                     processCASbits($10, @10, "EXCLUDE",
                               4300                 :                :                                    &n->deferrable, &n->initdeferred, NULL,
                               4301                 :                :                                    NULL, yyscanner);
  702 peter@eisentraut.org     4302                 :            117 :                     $$ = (Node *) n;
                               4303                 :                :                 }
                               4304                 :                :             | FOREIGN KEY '(' columnList optionalPeriodName ')' REFERENCES qualified_name
                               4305                 :                :                 opt_column_and_period_list key_match key_actions ConstraintAttributeSpec
                               4306                 :                :                 {
 5372 tgl@sss.pgh.pa.us        4307                 :            860 :                     Constraint *n = makeNode(Constraint);
                               4308                 :                : 
                               4309                 :            860 :                     n->contype = CONSTR_FOREIGN;
                               4310                 :            860 :                     n->location = @1;
   21 peter@eisentraut.org     4311                 :GNC         860 :                     n->pktable = $8;
 1005 peter@eisentraut.org     4312                 :CBC         860 :                     n->fk_attrs = $4;
   21 peter@eisentraut.org     4313         [ +  + ]:GNC         860 :                     if ($5)
                               4314                 :                :                     {
                               4315                 :            143 :                         n->fk_attrs = lappend(n->fk_attrs, $5);
                               4316                 :            143 :                         n->fk_with_period = true;
                               4317                 :                :                     }
                               4318                 :            860 :                     n->pk_attrs = linitial($9);
                               4319         [ +  + ]:            860 :                     if (lsecond($9))
                               4320                 :                :                     {
                               4321                 :             89 :                         n->pk_attrs = lappend(n->pk_attrs, lsecond($9));
                               4322                 :             89 :                         n->pk_with_period = true;
                               4323                 :                :                     }
                               4324                 :            860 :                     n->fk_matchtype = $10;
                               4325                 :            860 :                     n->fk_upd_action = ($11)->updateAction->action;
                               4326                 :            860 :                     n->fk_del_action = ($11)->deleteAction->action;
                               4327                 :            860 :                     n->fk_del_set_cols = ($11)->deleteAction->cols;
                               4328                 :            860 :                     processCASbits($12, @12, "FOREIGN KEY",
                               4329                 :                :                                    &n->deferrable, &n->initdeferred,
                               4330                 :                :                                    &n->skip_validation, NULL,
                               4331                 :                :                                    yyscanner);
 4687 tgl@sss.pgh.pa.us        4332                 :CBC         860 :                     n->initially_valid = !n->skip_validation;
  702 peter@eisentraut.org     4333                 :            860 :                     $$ = (Node *) n;
                               4334                 :                :                 }
                               4335                 :                :         ;
                               4336                 :                : 
 2433 peter_e@gmx.net          4337                 :            114 : opt_no_inherit: NO INHERIT                          {  $$ = true; }
                               4338                 :           3314 :             | /* EMPTY */                           {  $$ = false; }
                               4339                 :                :         ;
                               4340                 :                : 
                               4341                 :                : opt_without_overlaps:
   81 peter@eisentraut.org     4342                 :GNC         196 :             WITHOUT OVERLAPS                        { $$ = true; }
                               4343                 :           1003 :             | /*EMPTY*/                             { $$ = false; }
                               4344                 :                :     ;
                               4345                 :                : 
                               4346                 :                : opt_column_list:
 7972 bruce@momjian.us         4347                 :CBC        4424 :             '(' columnList ')'                      { $$ = $2; }
                               4348                 :          16204 :             | /*EMPTY*/                             { $$ = NIL; }
                               4349                 :                :         ;
                               4350                 :                : 
                               4351                 :                : columnList:
 7259 neilc@samurai.com        4352                 :           7328 :             columnElem                              { $$ = list_make1($1); }
 7971 bruce@momjian.us         4353                 :          12310 :             | columnList ',' columnElem             { $$ = lappend($1, $3); }
                               4354                 :                :         ;
                               4355                 :                : 
                               4356                 :                : optionalPeriodName:
   21 peter@eisentraut.org     4357                 :GNC         232 :             ',' PERIOD columnElem { $$ = $3; }
                               4358                 :           1194 :             | /*EMPTY*/               { $$ = NULL; }
                               4359                 :                :     ;
                               4360                 :                : 
                               4361                 :                : opt_column_and_period_list:
                               4362                 :            563 :             '(' columnList optionalPeriodName ')'           { $$ = list_make2($2, $3); }
                               4363                 :            300 :             | /*EMPTY*/                             { $$ = list_make2(NIL, NULL); }
                               4364                 :                :         ;
                               4365                 :                : 
                               4366                 :                : columnElem: ColId
                               4367                 :                :                 {
 7909 tgl@sss.pgh.pa.us        4368                 :CBC       19870 :                     $$ = (Node *) makeString($1);
                               4369                 :                :                 }
                               4370                 :                :         ;
                               4371                 :                : 
 2199 teodor@sigaev.ru         4372                 :             84 : opt_c_include:  INCLUDE '(' columnList ')'          { $$ = $3; }
                               4373                 :           1232 :              |      /* EMPTY */                     { $$ = NIL; }
                               4374                 :                :         ;
                               4375                 :                : 
                               4376                 :                : key_match:  MATCH FULL
                               4377                 :                :             {
 7947 tgl@sss.pgh.pa.us        4378                 :             49 :                 $$ = FKCONSTR_MATCH_FULL;
                               4379                 :                :             }
                               4380                 :                :         | MATCH PARTIAL
                               4381                 :                :             {
 7575 tgl@sss.pgh.pa.us        4382         [ #  # ]:UBC           0 :                 ereport(ERROR,
                               4383                 :                :                         (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               4384                 :                :                          errmsg("MATCH PARTIAL not yet implemented"),
                               4385                 :                :                          parser_errposition(@1)));
                               4386                 :                :                 $$ = FKCONSTR_MATCH_PARTIAL;
                               4387                 :                :             }
                               4388                 :                :         | MATCH SIMPLE
                               4389                 :                :             {
 4319 tgl@sss.pgh.pa.us        4390                 :CBC           3 :                 $$ = FKCONSTR_MATCH_SIMPLE;
                               4391                 :                :             }
                               4392                 :                :         | /*EMPTY*/
                               4393                 :                :             {
                               4394                 :           1189 :                 $$ = FKCONSTR_MATCH_SIMPLE;
                               4395                 :                :             }
                               4396                 :                :         ;
                               4397                 :                : 
                               4398                 :                : ExclusionConstraintList:
 5242                          4399                 :            117 :             ExclusionConstraintElem                 { $$ = list_make1($1); }
                               4400                 :                :             | ExclusionConstraintList ',' ExclusionConstraintElem
                               4401                 :             53 :                                                     { $$ = lappend($1, $3); }
                               4402                 :                :         ;
                               4403                 :                : 
                               4404                 :                : ExclusionConstraintElem: index_elem WITH any_operator
                               4405                 :                :             {
                               4406                 :            170 :                 $$ = list_make2($1, $3);
                               4407                 :                :             }
                               4408                 :                :             /* allow OPERATOR() decoration for the benefit of ruleutils.c */
                               4409                 :                :             | index_elem WITH OPERATOR '(' any_operator ')'
                               4410                 :                :             {
 5242 tgl@sss.pgh.pa.us        4411                 :UBC           0 :                 $$ = list_make2($1, $5);
                               4412                 :                :             }
                               4413                 :                :         ;
                               4414                 :                : 
                               4415                 :                : OptWhereClause:
 5242 tgl@sss.pgh.pa.us        4416                 :CBC         213 :             WHERE '(' a_expr ')'                    { $$ = $3; }
                               4417                 :            568 :             | /*EMPTY*/                             { $$ = NULL; }
                               4418                 :                :         ;
                               4419                 :                : 
                               4420                 :                : key_actions:
                               4421                 :                :             key_update
                               4422                 :                :                 {
  858 peter@eisentraut.org     4423                 :             25 :                     KeyActions *n = palloc(sizeof(KeyActions));
                               4424                 :                : 
                               4425                 :             25 :                     n->updateAction = $1;
                               4426                 :             25 :                     n->deleteAction = palloc(sizeof(KeyAction));
                               4427                 :             25 :                     n->deleteAction->action = FKCONSTR_ACTION_NOACTION;
                               4428                 :             25 :                     n->deleteAction->cols = NIL;
                               4429                 :             25 :                     $$ = n;
                               4430                 :                :                 }
                               4431                 :                :             | key_delete
                               4432                 :                :                 {
                               4433                 :             80 :                     KeyActions *n = palloc(sizeof(KeyActions));
                               4434                 :                : 
                               4435                 :             80 :                     n->updateAction = palloc(sizeof(KeyAction));
                               4436                 :             80 :                     n->updateAction->action = FKCONSTR_ACTION_NOACTION;
                               4437                 :             80 :                     n->updateAction->cols = NIL;
                               4438                 :             80 :                     n->deleteAction = $1;
                               4439                 :             80 :                     $$ = n;
                               4440                 :                :                 }
                               4441                 :                :             | key_update key_delete
                               4442                 :                :                 {
                               4443                 :             75 :                     KeyActions *n = palloc(sizeof(KeyActions));
                               4444                 :                : 
                               4445                 :             75 :                     n->updateAction = $1;
                               4446                 :             75 :                     n->deleteAction = $2;
                               4447                 :             75 :                     $$ = n;
                               4448                 :                :                 }
                               4449                 :                :             | key_delete key_update
                               4450                 :                :                 {
                               4451                 :             66 :                     KeyActions *n = palloc(sizeof(KeyActions));
                               4452                 :                : 
                               4453                 :             66 :                     n->updateAction = $2;
                               4454                 :             66 :                     n->deleteAction = $1;
                               4455                 :             66 :                     $$ = n;
                               4456                 :                :                 }
                               4457                 :                :             | /*EMPTY*/
                               4458                 :                :                 {
                               4459                 :            992 :                     KeyActions *n = palloc(sizeof(KeyActions));
                               4460                 :                : 
                               4461                 :            992 :                     n->updateAction = palloc(sizeof(KeyAction));
                               4462                 :            992 :                     n->updateAction->action = FKCONSTR_ACTION_NOACTION;
                               4463                 :            992 :                     n->updateAction->cols = NIL;
                               4464                 :            992 :                     n->deleteAction = palloc(sizeof(KeyAction));
                               4465                 :            992 :                     n->deleteAction->action = FKCONSTR_ACTION_NOACTION;
                               4466                 :            992 :                     n->deleteAction->cols = NIL;
                               4467                 :            992 :                     $$ = n;
                               4468                 :                :                 }
                               4469                 :                :         ;
                               4470                 :                : 
                               4471                 :                : key_update: ON UPDATE key_action
                               4472                 :                :                 {
                               4473         [ +  + ]:            169 :                     if (($3)->cols)
                               4474   [ +  -  +  - ]:              3 :                         ereport(ERROR,
                               4475                 :                :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               4476                 :                :                                  errmsg("a column list with %s is only supported for ON DELETE actions",
                               4477                 :                :                                         ($3)->action == FKCONSTR_ACTION_SETNULL ? "SET NULL" : "SET DEFAULT"),
                               4478                 :                :                                  parser_errposition(@1)));
                               4479                 :            166 :                     $$ = $3;
                               4480                 :                :                 }
                               4481                 :                :         ;
                               4482                 :                : 
                               4483                 :                : key_delete: ON DELETE_P key_action
                               4484                 :                :                 {
                               4485                 :            221 :                     $$ = $3;
                               4486                 :                :                 }
                               4487                 :                :         ;
                               4488                 :                : 
                               4489                 :                : key_action:
                               4490                 :                :             NO ACTION
                               4491                 :                :                 {
                               4492                 :             37 :                     KeyAction *n = palloc(sizeof(KeyAction));
                               4493                 :                : 
                               4494                 :             37 :                     n->action = FKCONSTR_ACTION_NOACTION;
                               4495                 :             37 :                     n->cols = NIL;
                               4496                 :             37 :                     $$ = n;
                               4497                 :                :                 }
                               4498                 :                :             | RESTRICT
                               4499                 :                :                 {
                               4500                 :             29 :                     KeyAction *n = palloc(sizeof(KeyAction));
                               4501                 :                : 
                               4502                 :             29 :                     n->action = FKCONSTR_ACTION_RESTRICT;
                               4503                 :             29 :                     n->cols = NIL;
                               4504                 :             29 :                     $$ = n;
                               4505                 :                :                 }
                               4506                 :                :             | CASCADE
                               4507                 :                :                 {
                               4508                 :            193 :                     KeyAction *n = palloc(sizeof(KeyAction));
                               4509                 :                : 
                               4510                 :            193 :                     n->action = FKCONSTR_ACTION_CASCADE;
                               4511                 :            193 :                     n->cols = NIL;
                               4512                 :            193 :                     $$ = n;
                               4513                 :                :                 }
                               4514                 :                :             | SET NULL_P opt_column_list
                               4515                 :                :                 {
                               4516                 :             86 :                     KeyAction *n = palloc(sizeof(KeyAction));
                               4517                 :                : 
                               4518                 :             86 :                     n->action = FKCONSTR_ACTION_SETNULL;
                               4519                 :             86 :                     n->cols = $3;
                               4520                 :             86 :                     $$ = n;
                               4521                 :                :                 }
                               4522                 :                :             | SET DEFAULT opt_column_list
                               4523                 :                :                 {
                               4524                 :             45 :                     KeyAction *n = palloc(sizeof(KeyAction));
                               4525                 :                : 
                               4526                 :             45 :                     n->action = FKCONSTR_ACTION_SETDEFAULT;
                               4527                 :             45 :                     n->cols = $3;
                               4528                 :             45 :                     $$ = n;
                               4529                 :                :                 }
                               4530                 :                :         ;
                               4531                 :                : 
 7972 bruce@momjian.us         4532                 :            882 : OptInherit: INHERITS '(' qualified_name_list ')'    { $$ = $3; }
                               4533                 :          12738 :             | /*EMPTY*/                             { $$ = NIL; }
                               4534                 :                :         ;
                               4535                 :                : 
                               4536                 :                : /* Optional partition key specification */
 2685 rhaas@postgresql.org     4537                 :           2438 : OptPartitionSpec: PartitionSpec { $$ = $1; }
                               4538                 :          15155 :             | /*EMPTY*/         { $$ = NULL; }
                               4539                 :                :         ;
                               4540                 :                : 
                               4541                 :                : PartitionSpec: PARTITION BY ColId '(' part_params ')'
                               4542                 :                :                 {
                               4543                 :           2441 :                     PartitionSpec *n = makeNode(PartitionSpec);
                               4544                 :                : 
  528 alvherre@alvh.no-ip.     4545                 :           2441 :                     n->strategy = parsePartitionStrategy($3);
 2685 rhaas@postgresql.org     4546                 :           2438 :                     n->partParams = $5;
                               4547                 :           2438 :                     n->location = @1;
                               4548                 :                : 
                               4549                 :           2438 :                     $$ = n;
                               4550                 :                :                 }
                               4551                 :                :         ;
                               4552                 :                : 
                               4553                 :           2441 : part_params:    part_elem                       { $$ = list_make1($1); }
                               4554                 :            231 :             | part_params ',' part_elem         { $$ = lappend($1, $3); }
                               4555                 :                :         ;
                               4556                 :                : 
                               4557                 :                : part_elem: ColId opt_collate opt_qualified_name
                               4558                 :                :                 {
                               4559                 :           2523 :                     PartitionElem *n = makeNode(PartitionElem);
                               4560                 :                : 
                               4561                 :           2523 :                     n->name = $1;
                               4562                 :           2523 :                     n->expr = NULL;
                               4563                 :           2523 :                     n->collation = $2;
                               4564                 :           2523 :                     n->opclass = $3;
                               4565                 :           2523 :                     n->location = @1;
                               4566                 :           2523 :                     $$ = n;
                               4567                 :                :                 }
                               4568                 :                :             | func_expr_windowless opt_collate opt_qualified_name
                               4569                 :                :                 {
                               4570                 :             65 :                     PartitionElem *n = makeNode(PartitionElem);
                               4571                 :                : 
                               4572                 :             65 :                     n->name = NULL;
                               4573                 :             65 :                     n->expr = $1;
                               4574                 :             65 :                     n->collation = $2;
                               4575                 :             65 :                     n->opclass = $3;
                               4576                 :             65 :                     n->location = @1;
                               4577                 :             65 :                     $$ = n;
                               4578                 :                :                 }
                               4579                 :                :             | '(' a_expr ')' opt_collate opt_qualified_name
                               4580                 :                :                 {
                               4581                 :             84 :                     PartitionElem *n = makeNode(PartitionElem);
                               4582                 :                : 
                               4583                 :             84 :                     n->name = NULL;
                               4584                 :             84 :                     n->expr = $2;
                               4585                 :             84 :                     n->collation = $4;
                               4586                 :             84 :                     n->opclass = $5;
                               4587                 :             84 :                     n->location = @1;
                               4588                 :             84 :                     $$ = n;
                               4589                 :                :                 }
                               4590                 :                :         ;
                               4591                 :                : 
                               4592                 :                : table_access_method_clause:
 1404 peter@eisentraut.org     4593                 :             58 :             USING name                          { $$ = $2; }
 1866 andres@anarazel.de       4594                 :          18439 :             | /*EMPTY*/                         { $$ = NULL; }
                               4595                 :                :         ;
                               4596                 :                : 
                               4597                 :                : /* WITHOUT OIDS is legacy only */
                               4598                 :                : OptWith:
 5550 alvherre@alvh.no-ip.     4599                 :            316 :             WITH reloptions             { $$ = $2; }
 1972 andres@anarazel.de       4600                 :             12 :             | WITHOUT OIDS              { $$ = NIL; }
 6495 tgl@sss.pgh.pa.us        4601                 :          17887 :             | /*EMPTY*/                 { $$ = NIL; }
                               4602                 :                :         ;
                               4603                 :                : 
 7825                          4604                 :             28 : OnCommitOption:  ON COMMIT DROP             { $$ = ONCOMMIT_DROP; }
                               4605                 :             49 :             | ON COMMIT DELETE_P ROWS       { $$ = ONCOMMIT_DELETE_ROWS; }
                               4606                 :             12 :             | ON COMMIT PRESERVE ROWS       { $$ = ONCOMMIT_PRESERVE_ROWS; }
                               4607                 :          18126 :             | /*EMPTY*/                     { $$ = ONCOMMIT_NOOP; }
                               4608                 :                :         ;
                               4609                 :                : 
 7240                          4610                 :            101 : OptTableSpace:   TABLESPACE name                    { $$ = $2; }
                               4611                 :          21582 :             | /*EMPTY*/                             { $$ = NULL; }
                               4612                 :                :         ;
                               4613                 :                : 
 7195                          4614                 :             33 : OptConsTableSpace:   USING INDEX TABLESPACE name    { $$ = $4; }
                               4615                 :           4195 :             | /*EMPTY*/                             { $$ = NULL; }
                               4616                 :                :         ;
                               4617                 :                : 
 1404 peter@eisentraut.org     4618                 :           4120 : ExistingIndex:   USING INDEX name                   { $$ = $3; }
                               4619                 :                :         ;
                               4620                 :                : 
                               4621                 :                : /*****************************************************************************
                               4622                 :                :  *
                               4623                 :                :  *      QUERY :
                               4624                 :                :  *              CREATE STATISTICS [[IF NOT EXISTS] stats_name] [(stat types)]
                               4625                 :                :  *                  ON expression-list FROM from_list
                               4626                 :                :  *
                               4627                 :                :  * Note: the expectation here is that the clauses after ON are a subset of
                               4628                 :                :  * SELECT syntax, allowing for expressions and joined tables, and probably
                               4629                 :                :  * someday a WHERE clause.  Much less than that is currently implemented,
                               4630                 :                :  * but the grammar accepts it and then we'll throw FEATURE_NOT_SUPPORTED
                               4631                 :                :  * errors as necessary at execution.
                               4632                 :                :  *
                               4633                 :                :  * Statistics name is optional unless IF NOT EXISTS is specified.
                               4634                 :                :  *
                               4635                 :                :  *****************************************************************************/
                               4636                 :                : 
                               4637                 :                : CreateStatsStmt:
                               4638                 :                :             CREATE STATISTICS opt_qualified_name
                               4639                 :                :             opt_name_list ON stats_params FROM from_list
                               4640                 :                :                 {
 2529 alvherre@alvh.no-ip.     4641                 :            274 :                     CreateStatsStmt *n = makeNode(CreateStatsStmt);
                               4642                 :                : 
 2488                          4643                 :            274 :                     n->defnames = $3;
                               4644                 :            274 :                     n->stat_types = $4;
                               4645                 :            274 :                     n->exprs = $6;
                               4646                 :            274 :                     n->relations = $8;
 2232                          4647                 :            274 :                     n->stxcomment = NULL;
 2488                          4648                 :            274 :                     n->if_not_exists = false;
  702 peter@eisentraut.org     4649                 :            274 :                     $$ = (Node *) n;
                               4650                 :                :                 }
                               4651                 :                :             | CREATE STATISTICS IF_P NOT EXISTS any_name
                               4652                 :                :             opt_name_list ON stats_params FROM from_list
                               4653                 :                :                 {
 2488 alvherre@alvh.no-ip.     4654                 :              6 :                     CreateStatsStmt *n = makeNode(CreateStatsStmt);
                               4655                 :                : 
                               4656                 :              6 :                     n->defnames = $6;
                               4657                 :              6 :                     n->stat_types = $7;
                               4658                 :              6 :                     n->exprs = $9;
                               4659                 :              6 :                     n->relations = $11;
 2232                          4660                 :              6 :                     n->stxcomment = NULL;
 2488                          4661                 :              6 :                     n->if_not_exists = true;
  702 peter@eisentraut.org     4662                 :              6 :                     $$ = (Node *) n;
                               4663                 :                :                 }
                               4664                 :                :             ;
                               4665                 :                : 
                               4666                 :                : /*
                               4667                 :                :  * Statistics attributes can be either simple column references, or arbitrary
                               4668                 :                :  * expressions in parens.  For compatibility with index attributes permitted
                               4669                 :                :  * in CREATE INDEX, we allow an expression that's just a function call to be
                               4670                 :                :  * written without parens.
                               4671                 :                :  */
                               4672                 :                : 
 1115 tomas.vondra@postgre     4673                 :            286 : stats_params:   stats_param                         { $$ = list_make1($1); }
                               4674                 :            461 :             | stats_params ',' stats_param          { $$ = lappend($1, $3); }
                               4675                 :                :         ;
                               4676                 :                : 
                               4677                 :                : stats_param:    ColId
                               4678                 :                :                 {
                               4679                 :            531 :                     $$ = makeNode(StatsElem);
                               4680                 :            531 :                     $$->name = $1;
                               4681                 :            531 :                     $$->expr = NULL;
                               4682                 :                :                 }
                               4683                 :                :             | func_expr_windowless
                               4684                 :                :                 {
                               4685                 :             10 :                     $$ = makeNode(StatsElem);
                               4686                 :             10 :                     $$->name = NULL;
                               4687                 :             10 :                     $$->expr = $1;
                               4688                 :                :                 }
                               4689                 :                :             | '(' a_expr ')'
                               4690                 :                :                 {
                               4691                 :            206 :                     $$ = makeNode(StatsElem);
                               4692                 :            206 :                     $$->name = NULL;
                               4693                 :            206 :                     $$->expr = $2;
                               4694                 :                :                 }
                               4695                 :                :         ;
                               4696                 :                : 
                               4697                 :                : /*****************************************************************************
                               4698                 :                :  *
                               4699                 :                :  *      QUERY :
                               4700                 :                :  *              ALTER STATISTICS [IF EXISTS] stats_name
                               4701                 :                :  *                  SET STATISTICS  <SignedIconst>
                               4702                 :                :  *
                               4703                 :                :  *****************************************************************************/
                               4704                 :                : 
                               4705                 :                : AlterStatsStmt:
                               4706                 :                :             ALTER STATISTICS any_name SET STATISTICS set_statistics_value
                               4707                 :                :                 {
 1678                          4708                 :             10 :                     AlterStatsStmt *n = makeNode(AlterStatsStmt);
                               4709                 :                : 
                               4710                 :             10 :                     n->defnames = $3;
                               4711                 :             10 :                     n->missing_ok = false;
                               4712                 :             10 :                     n->stxstattarget = $6;
  702 peter@eisentraut.org     4713                 :             10 :                     $$ = (Node *) n;
                               4714                 :                :                 }
                               4715                 :                :             | ALTER STATISTICS IF_P EXISTS any_name SET STATISTICS set_statistics_value
                               4716                 :                :                 {
 1678 tomas.vondra@postgre     4717                 :              3 :                     AlterStatsStmt *n = makeNode(AlterStatsStmt);
                               4718                 :                : 
                               4719                 :              3 :                     n->defnames = $5;
                               4720                 :              3 :                     n->missing_ok = true;
                               4721                 :              3 :                     n->stxstattarget = $8;
  702 peter@eisentraut.org     4722                 :              3 :                     $$ = (Node *) n;
                               4723                 :                :                 }
                               4724                 :                :             ;
                               4725                 :                : 
                               4726                 :                : /*****************************************************************************
                               4727                 :                :  *
                               4728                 :                :  *      QUERY :
                               4729                 :                :  *              CREATE TABLE relname AS SelectStmt [ WITH [NO] DATA ]
                               4730                 :                :  *
                               4731                 :                :  *
                               4732                 :                :  * Note: SELECT ... INTO is a now-deprecated alternative for this.
                               4733                 :                :  *
                               4734                 :                :  *****************************************************************************/
                               4735                 :                : 
                               4736                 :                : CreateAsStmt:
                               4737                 :                :         CREATE OptTemp TABLE create_as_target AS SelectStmt opt_with_data
                               4738                 :                :                 {
 4409 tgl@sss.pgh.pa.us        4739                 :            561 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
                               4740                 :                : 
                               4741                 :            561 :                     ctas->query = $6;
                               4742                 :            561 :                     ctas->into = $4;
 1373 michael@paquier.xyz      4743                 :            561 :                     ctas->objtype = OBJECT_TABLE;
 4409 tgl@sss.pgh.pa.us        4744                 :            561 :                     ctas->is_select_into = false;
 3410 andrew@dunslane.net      4745                 :            561 :                     ctas->if_not_exists = false;
                               4746                 :                :                     /* cram additional flags into the IntoClause */
 4525 tgl@sss.pgh.pa.us        4747                 :            561 :                     $4->rel->relpersistence = $2;
                               4748                 :            561 :                     $4->skipData = !($7);
 4409                          4749                 :            561 :                     $$ = (Node *) ctas;
                               4750                 :                :                 }
                               4751                 :                :         | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS SelectStmt opt_with_data
                               4752                 :                :                 {
 3410 andrew@dunslane.net      4753                 :             25 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
                               4754                 :                : 
                               4755                 :             25 :                     ctas->query = $9;
                               4756                 :             25 :                     ctas->into = $7;
 1373 michael@paquier.xyz      4757                 :             25 :                     ctas->objtype = OBJECT_TABLE;
 3410 andrew@dunslane.net      4758                 :             25 :                     ctas->is_select_into = false;
                               4759                 :             25 :                     ctas->if_not_exists = true;
                               4760                 :                :                     /* cram additional flags into the IntoClause */
                               4761                 :             25 :                     $7->rel->relpersistence = $2;
                               4762                 :             25 :                     $7->skipData = !($10);
                               4763                 :             25 :                     $$ = (Node *) ctas;
                               4764                 :                :                 }
                               4765                 :                :         ;
                               4766                 :                : 
                               4767                 :                : create_as_target:
                               4768                 :                :             qualified_name opt_column_list table_access_method_clause
                               4769                 :                :             OptWith OnCommitOption OptTableSpace
                               4770                 :                :                 {
 6263 tgl@sss.pgh.pa.us        4771                 :            628 :                     $$ = makeNode(IntoClause);
                               4772                 :            628 :                     $$->rel = $1;
                               4773                 :            628 :                     $$->colNames = $2;
 1866 andres@anarazel.de       4774                 :            628 :                     $$->accessMethod = $3;
                               4775                 :            628 :                     $$->options = $4;
                               4776                 :            628 :                     $$->onCommit = $5;
                               4777                 :            628 :                     $$->tableSpaceName = $6;
 4020 tgl@sss.pgh.pa.us        4778                 :            628 :                     $$->viewQuery = NULL;
 4525                          4779                 :            628 :                     $$->skipData = false;        /* might get changed later */
                               4780                 :                :                 }
                               4781                 :                :         ;
                               4782                 :                : 
                               4783                 :                : opt_with_data:
 2433 peter_e@gmx.net          4784                 :             18 :             WITH DATA_P                             { $$ = true; }
                               4785                 :            105 :             | WITH NO DATA_P                        { $$ = false; }
                               4786                 :            913 :             | /*EMPTY*/                             { $$ = true; }
                               4787                 :                :         ;
                               4788                 :                : 
                               4789                 :                : 
                               4790                 :                : /*****************************************************************************
                               4791                 :                :  *
                               4792                 :                :  *      QUERY :
                               4793                 :                :  *              CREATE MATERIALIZED VIEW relname AS SelectStmt
                               4794                 :                :  *
                               4795                 :                :  *****************************************************************************/
                               4796                 :                : 
                               4797                 :                : CreateMatViewStmt:
                               4798                 :                :         CREATE OptNoLog MATERIALIZED VIEW create_mv_target AS SelectStmt opt_with_data
                               4799                 :                :                 {
 4060 kgrittn@postgresql.o     4800                 :            255 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
                               4801                 :                : 
                               4802                 :            255 :                     ctas->query = $7;
                               4803                 :            255 :                     ctas->into = $5;
 1373 michael@paquier.xyz      4804                 :            255 :                     ctas->objtype = OBJECT_MATVIEW;
 4060 kgrittn@postgresql.o     4805                 :            255 :                     ctas->is_select_into = false;
 3410 andrew@dunslane.net      4806                 :            255 :                     ctas->if_not_exists = false;
                               4807                 :                :                     /* cram additional flags into the IntoClause */
 4060 kgrittn@postgresql.o     4808                 :            255 :                     $5->rel->relpersistence = $2;
                               4809                 :            255 :                     $5->skipData = !($8);
                               4810                 :            255 :                     $$ = (Node *) ctas;
                               4811                 :                :                 }
                               4812                 :                :         | CREATE OptNoLog MATERIALIZED VIEW IF_P NOT EXISTS create_mv_target AS SelectStmt opt_with_data
                               4813                 :                :                 {
 3410 andrew@dunslane.net      4814                 :             24 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
                               4815                 :                : 
                               4816                 :             24 :                     ctas->query = $10;
                               4817                 :             24 :                     ctas->into = $8;
 1373 michael@paquier.xyz      4818                 :             24 :                     ctas->objtype = OBJECT_MATVIEW;
 3410 andrew@dunslane.net      4819                 :             24 :                     ctas->is_select_into = false;
                               4820                 :             24 :                     ctas->if_not_exists = true;
                               4821                 :                :                     /* cram additional flags into the IntoClause */
                               4822                 :             24 :                     $8->rel->relpersistence = $2;
                               4823                 :             24 :                     $8->skipData = !($11);
                               4824                 :             24 :                     $$ = (Node *) ctas;
                               4825                 :                :                 }
                               4826                 :                :         ;
                               4827                 :                : 
                               4828                 :                : create_mv_target:
                               4829                 :                :             qualified_name opt_column_list table_access_method_clause opt_reloptions OptTableSpace
                               4830                 :                :                 {
 4060 kgrittn@postgresql.o     4831                 :            279 :                     $$ = makeNode(IntoClause);
                               4832                 :            279 :                     $$->rel = $1;
                               4833                 :            279 :                     $$->colNames = $2;
 1866 andres@anarazel.de       4834                 :            279 :                     $$->accessMethod = $3;
                               4835                 :            279 :                     $$->options = $4;
 4060 kgrittn@postgresql.o     4836                 :            279 :                     $$->onCommit = ONCOMMIT_NOOP;
 1866 andres@anarazel.de       4837                 :            279 :                     $$->tableSpaceName = $5;
 4020 tgl@sss.pgh.pa.us        4838                 :            279 :                     $$->viewQuery = NULL;        /* filled at analysis time */
 4060 kgrittn@postgresql.o     4839                 :            279 :                     $$->skipData = false;        /* might get changed later */
                               4840                 :                :                 }
                               4841                 :                :         ;
                               4842                 :                : 
 4060 kgrittn@postgresql.o     4843                 :UBC           0 : OptNoLog:   UNLOGGED                    { $$ = RELPERSISTENCE_UNLOGGED; }
 4060 kgrittn@postgresql.o     4844                 :CBC         279 :             | /*EMPTY*/                 { $$ = RELPERSISTENCE_PERMANENT; }
                               4845                 :                :         ;
                               4846                 :                : 
                               4847                 :                : 
                               4848                 :                : /*****************************************************************************
                               4849                 :                :  *
                               4850                 :                :  *      QUERY :
                               4851                 :                :  *              REFRESH MATERIALIZED VIEW qualified_name
                               4852                 :                :  *
                               4853                 :                :  *****************************************************************************/
                               4854                 :                : 
                               4855                 :                : RefreshMatViewStmt:
                               4856                 :                :             REFRESH MATERIALIZED VIEW opt_concurrently qualified_name opt_with_data
                               4857                 :                :                 {
                               4858                 :            129 :                     RefreshMatViewStmt *n = makeNode(RefreshMatViewStmt);
                               4859                 :                : 
 3925                          4860                 :            129 :                     n->concurrent = $4;
                               4861                 :            129 :                     n->relation = $5;
                               4862                 :            129 :                     n->skipData = !($6);
 4060                          4863                 :            129 :                     $$ = (Node *) n;
                               4864                 :                :                 }
                               4865                 :                :         ;
                               4866                 :                : 
                               4867                 :                : 
                               4868                 :                : /*****************************************************************************
                               4869                 :                :  *
                               4870                 :                :  *      QUERY :
                               4871                 :                :  *              CREATE SEQUENCE seqname
                               4872                 :                :  *              ALTER SEQUENCE seqname
                               4873                 :                :  *
                               4874                 :                :  *****************************************************************************/
                               4875                 :                : 
                               4876                 :                : CreateSeqStmt:
                               4877                 :                :             CREATE OptTemp SEQUENCE qualified_name OptSeqOptList
                               4878                 :                :                 {
 9715 bruce@momjian.us         4879                 :            311 :                     CreateSeqStmt *n = makeNode(CreateSeqStmt);
                               4880                 :                : 
 4871 rhaas@postgresql.org     4881                 :            311 :                     $4->relpersistence = $2;
 8060 tgl@sss.pgh.pa.us        4882                 :            311 :                     n->sequence = $4;
 8331 bruce@momjian.us         4883                 :            311 :                     n->options = $5;
 4988 tgl@sss.pgh.pa.us        4884                 :            311 :                     n->ownerId = InvalidOid;
 3519 heikki.linnakangas@i     4885                 :            311 :                     n->if_not_exists = false;
  702 peter@eisentraut.org     4886                 :            311 :                     $$ = (Node *) n;
                               4887                 :                :                 }
                               4888                 :                :             | CREATE OptTemp SEQUENCE IF_P NOT EXISTS qualified_name OptSeqOptList
                               4889                 :                :                 {
 3519 heikki.linnakangas@i     4890                 :             12 :                     CreateSeqStmt *n = makeNode(CreateSeqStmt);
                               4891                 :                : 
                               4892                 :             12 :                     $7->relpersistence = $2;
                               4893                 :             12 :                     n->sequence = $7;
                               4894                 :             12 :                     n->options = $8;
                               4895                 :             12 :                     n->ownerId = InvalidOid;
                               4896                 :             12 :                     n->if_not_exists = true;
  702 peter@eisentraut.org     4897                 :             12 :                     $$ = (Node *) n;
                               4898                 :                :                 }
                               4899                 :                :         ;
                               4900                 :                : 
                               4901                 :                : AlterSeqStmt:
                               4902                 :                :             ALTER SEQUENCE qualified_name SeqOptList
                               4903                 :                :                 {
 7696 bruce@momjian.us         4904                 :             92 :                     AlterSeqStmt *n = makeNode(AlterSeqStmt);
                               4905                 :                : 
                               4906                 :             92 :                     n->sequence = $3;
                               4907                 :             92 :                     n->options = $4;
 4465 simon@2ndQuadrant.co     4908                 :             92 :                     n->missing_ok = false;
  702 peter@eisentraut.org     4909                 :             92 :                     $$ = (Node *) n;
                               4910                 :                :                 }
                               4911                 :                :             | ALTER SEQUENCE IF_P EXISTS qualified_name SeqOptList
                               4912                 :                :                 {
 4465 simon@2ndQuadrant.co     4913                 :              6 :                     AlterSeqStmt *n = makeNode(AlterSeqStmt);
                               4914                 :                : 
                               4915                 :              6 :                     n->sequence = $5;
                               4916                 :              6 :                     n->options = $6;
                               4917                 :              6 :                     n->missing_ok = true;
  702 peter@eisentraut.org     4918                 :              6 :                     $$ = (Node *) n;
                               4919                 :                :                 }
                               4920                 :                : 
                               4921                 :                :         ;
                               4922                 :                : 
 5782 tgl@sss.pgh.pa.us        4923                 :            123 : OptSeqOptList: SeqOptList                           { $$ = $1; }
 7923                          4924                 :            200 :             | /*EMPTY*/                             { $$ = NIL; }
                               4925                 :                :         ;
                               4926                 :                : 
 2565 peter_e@gmx.net          4927                 :             34 : OptParenthesizedSeqOptList: '(' SeqOptList ')'      { $$ = $2; }
                               4928                 :            182 :             | /*EMPTY*/                             { $$ = NIL; }
                               4929                 :                :         ;
                               4930                 :                : 
 5782 tgl@sss.pgh.pa.us        4931                 :            255 : SeqOptList: SeqOptElem                              { $$ = list_make1($1); }
                               4932                 :            372 :             | SeqOptList SeqOptElem                 { $$ = lappend($1, $2); }
                               4933                 :                :         ;
                               4934                 :                : 
                               4935                 :                : SeqOptElem: AS SimpleTypename
                               4936                 :                :                 {
  702 peter@eisentraut.org     4937                 :             95 :                     $$ = makeDefElem("as", (Node *) $2, @1);
                               4938                 :                :                 }
                               4939                 :                :             | CACHE NumericOnly
                               4940                 :                :                 {
                               4941                 :             58 :                     $$ = makeDefElem("cache", (Node *) $2, @1);
                               4942                 :                :                 }
                               4943                 :                :             | CYCLE
                               4944                 :                :                 {
                               4945                 :             17 :                     $$ = makeDefElem("cycle", (Node *) makeBoolean(true), @1);
                               4946                 :                :                 }
                               4947                 :                :             | NO CYCLE
                               4948                 :                :                 {
                               4949                 :              7 :                     $$ = makeDefElem("cycle", (Node *) makeBoolean(false), @1);
                               4950                 :                :                 }
                               4951                 :                :             | INCREMENT opt_by NumericOnly
                               4952                 :                :                 {
                               4953                 :            118 :                     $$ = makeDefElem("increment", (Node *) $3, @1);
                               4954                 :                :                 }
                               4955                 :                :             | MAXVALUE NumericOnly
                               4956                 :                :                 {
                               4957                 :             34 :                     $$ = makeDefElem("maxvalue", (Node *) $2, @1);
                               4958                 :                :                 }
                               4959                 :                :             | MINVALUE NumericOnly
                               4960                 :                :                 {
                               4961                 :             36 :                     $$ = makeDefElem("minvalue", (Node *) $2, @1);
                               4962                 :                :                 }
                               4963                 :                :             | NO MAXVALUE
                               4964                 :                :                 {
 2777 peter_e@gmx.net          4965                 :             47 :                     $$ = makeDefElem("maxvalue", NULL, @1);
                               4966                 :                :                 }
                               4967                 :                :             | NO MINVALUE
                               4968                 :                :                 {
                               4969                 :             47 :                     $$ = makeDefElem("minvalue", NULL, @1);
                               4970                 :                :                 }
                               4971                 :                :             | OWNED BY any_name
                               4972                 :                :                 {
  702 peter@eisentraut.org     4973                 :             36 :                     $$ = makeDefElem("owned_by", (Node *) $3, @1);
                               4974                 :                :                 }
                               4975                 :                :             | SEQUENCE NAME_P any_name
                               4976                 :                :                 {
                               4977                 :                :                     /* not documented, only used by pg_dump */
                               4978                 :             19 :                     $$ = makeDefElem("sequence_name", (Node *) $3, @1);
                               4979                 :                :                 }
                               4980                 :                :             | START opt_with NumericOnly
                               4981                 :                :                 {
                               4982                 :            107 :                     $$ = makeDefElem("start", (Node *) $3, @1);
                               4983                 :                :                 }
                               4984                 :                :             | RESTART
                               4985                 :                :                 {
 2777 peter_e@gmx.net          4986                 :              3 :                     $$ = makeDefElem("restart", NULL, @1);
                               4987                 :                :                 }
                               4988                 :                :             | RESTART opt_with NumericOnly
                               4989                 :                :                 {
  702 peter@eisentraut.org     4990                 :             30 :                     $$ = makeDefElem("restart", (Node *) $3, @1);
                               4991                 :                :                 }
                               4992                 :                :         ;
                               4993                 :                : 
                               4994                 :                : opt_by:     BY
                               4995                 :                :             | /* EMPTY */
                               4996                 :                :       ;
                               4997                 :                : 
                               4998                 :                : NumericOnly:
  948                          4999                 :            158 :             FCONST                              { $$ = (Node *) makeFloat($1); }
  948 peter@eisentraut.org     5000                 :UBC           0 :             | '+' FCONST                        { $$ = (Node *) makeFloat($2); }
                               5001                 :                :             | '-' FCONST
                               5002                 :                :                 {
  702 peter@eisentraut.org     5003                 :CBC          10 :                     Float      *f = makeFloat($2);
                               5004                 :                : 
  948                          5005                 :             10 :                     doNegateFloat(f);
                               5006                 :             10 :                     $$ = (Node *) f;
                               5007                 :                :                 }
                               5008                 :           5275 :             | SignedIconst                      { $$ = (Node *) makeInteger($1); }
                               5009                 :                :         ;
                               5010                 :                : 
 5054 rhaas@postgresql.org     5011                 :             40 : NumericOnly_list:   NumericOnly                     { $$ = list_make1($1); }
                               5012                 :              3 :                 | NumericOnly_list ',' NumericOnly  { $$ = lappend($1, $3); }
                               5013                 :                :         ;
                               5014                 :                : 
                               5015                 :                : /*****************************************************************************
                               5016                 :                :  *
                               5017                 :                :  *      QUERIES :
                               5018                 :                :  *              CREATE [OR REPLACE] [TRUSTED] [PROCEDURAL] LANGUAGE ...
                               5019                 :                :  *              DROP [PROCEDURAL] LANGUAGE ...
                               5020                 :                :  *
                               5021                 :                :  *****************************************************************************/
                               5022                 :                : 
                               5023                 :                : CreatePLangStmt:
                               5024                 :                :             CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name
                               5025                 :                :             {
                               5026                 :                :                 /*
                               5027                 :                :                  * We now interpret parameterless CREATE LANGUAGE as
                               5028                 :                :                  * CREATE EXTENSION.  "OR REPLACE" is silently translated
                               5029                 :                :                  * to "IF NOT EXISTS", which isn't quite the same, but
                               5030                 :                :                  * seems more useful than throwing an error.  We just
                               5031                 :                :                  * ignore TRUSTED, as the previous code would have too.
                               5032                 :                :                  */
 1537 tgl@sss.pgh.pa.us        5033                 :UBC           0 :                 CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
                               5034                 :                : 
                               5035                 :              0 :                 n->if_not_exists = $2;
                               5036                 :              0 :                 n->extname = $6;
                               5037                 :              0 :                 n->options = NIL;
  702 peter@eisentraut.org     5038                 :              0 :                 $$ = (Node *) n;
                               5039                 :                :             }
                               5040                 :                :             | CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name
                               5041                 :                :               HANDLER handler_name opt_inline_handler opt_validator
                               5042                 :                :             {
 9665 vadim4o@yahoo.com        5043                 :CBC          60 :                 CreatePLangStmt *n = makeNode(CreatePLangStmt);
                               5044                 :                : 
 5164 tgl@sss.pgh.pa.us        5045                 :             60 :                 n->replace = $2;
                               5046                 :             60 :                 n->plname = $6;
                               5047                 :             60 :                 n->plhandler = $8;
                               5048                 :             60 :                 n->plinline = $9;
                               5049                 :             60 :                 n->plvalidator = $10;
                               5050                 :             60 :                 n->pltrusted = $3;
  702 peter@eisentraut.org     5051                 :             60 :                 $$ = (Node *) n;
                               5052                 :                :             }
                               5053                 :                :         ;
                               5054                 :                : 
                               5055                 :                : opt_trusted:
 2433 peter_e@gmx.net          5056                 :             45 :             TRUSTED                                 { $$ = true; }
                               5057                 :             18 :             | /*EMPTY*/                             { $$ = false; }
                               5058                 :                :         ;
                               5059                 :                : 
                               5060                 :                : /* This ought to be just func_name, but that causes reduce/reduce conflicts
                               5061                 :                :  * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
                               5062                 :                :  * Work around by using simple names, instead.
                               5063                 :                :  */
                               5064                 :                : handler_name:
 7249 tgl@sss.pgh.pa.us        5065                 :            243 :             name                        { $$ = list_make1(makeString($1)); }
                               5066                 :              1 :             | name attrs                { $$ = lcons(makeString($1), $2); }
                               5067                 :                :         ;
                               5068                 :                : 
                               5069                 :                : opt_inline_handler:
 5318                          5070                 :             51 :             INLINE_P handler_name                   { $$ = $2; }
                               5071                 :              9 :             | /*EMPTY*/                             { $$ = NIL; }
                               5072                 :                :         ;
                               5073                 :                : 
                               5074                 :                : validator_clause:
 6796                          5075                 :             51 :             VALIDATOR handler_name                  { $$ = $2; }
 5528 peter_e@gmx.net          5076                 :UBC           0 :             | NO VALIDATOR                          { $$ = NIL; }
                               5077                 :                :         ;
                               5078                 :                : 
                               5079                 :                : opt_validator:
 5528 peter_e@gmx.net          5080                 :CBC          51 :             validator_clause                        { $$ = $1; }
 6796 tgl@sss.pgh.pa.us        5081                 :              9 :             | /*EMPTY*/                             { $$ = NIL; }
                               5082                 :                :         ;
                               5083                 :                : 
                               5084                 :                : opt_procedural:
                               5085                 :                :             PROCEDURAL
                               5086                 :                :             | /*EMPTY*/
                               5087                 :                :         ;
                               5088                 :                : 
                               5089                 :                : /*****************************************************************************
                               5090                 :                :  *
                               5091                 :                :  *      QUERY:
                               5092                 :                :  *             CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/'
                               5093                 :                :  *
                               5094                 :                :  *****************************************************************************/
                               5095                 :                : 
                               5096                 :                : CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst opt_reloptions
                               5097                 :                :                 {
 7240                          5098                 :             56 :                     CreateTableSpaceStmt *n = makeNode(CreateTableSpaceStmt);
                               5099                 :                : 
                               5100                 :             56 :                     n->tablespacename = $3;
                               5101                 :             56 :                     n->owner = $4;
                               5102                 :             56 :                     n->location = $6;
 3739 sfrost@snowman.net       5103                 :             56 :                     n->options = $7;
 7240 tgl@sss.pgh.pa.us        5104                 :             56 :                     $$ = (Node *) n;
                               5105                 :                :                 }
                               5106                 :                :         ;
                               5107                 :                : 
 3324 alvherre@alvh.no-ip.     5108                 :GBC           1 : OptTableSpaceOwner: OWNER RoleSpec      { $$ = $2; }
 7240 tgl@sss.pgh.pa.us        5109                 :CBC          55 :             | /*EMPTY */                { $$ = NULL; }
                               5110                 :                :         ;
                               5111                 :                : 
                               5112                 :                : /*****************************************************************************
                               5113                 :                :  *
                               5114                 :                :  *      QUERY :
                               5115                 :                :  *              DROP TABLESPACE <tablespace>
                               5116                 :                :  *
                               5117                 :                :  *      No need for drop behaviour as we cannot implement dependencies for
                               5118                 :                :  *      objects in other databases; we can only support RESTRICT.
                               5119                 :                :  *
                               5120                 :                :  ****************************************************************************/
                               5121                 :                : 
                               5122                 :                : DropTableSpaceStmt: DROP TABLESPACE name
                               5123                 :                :                 {
                               5124                 :             32 :                     DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
                               5125                 :                : 
                               5126                 :             32 :                     n->tablespacename = $3;
 6512 andrew@dunslane.net      5127                 :             32 :                     n->missing_ok = false;
                               5128                 :             32 :                     $$ = (Node *) n;
                               5129                 :                :                 }
                               5130                 :                :                 |  DROP TABLESPACE IF_P EXISTS name
                               5131                 :                :                 {
 6512 andrew@dunslane.net      5132                 :UBC           0 :                     DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
                               5133                 :                : 
                               5134                 :              0 :                     n->tablespacename = $5;
                               5135                 :              0 :                     n->missing_ok = true;
 7240 tgl@sss.pgh.pa.us        5136                 :              0 :                     $$ = (Node *) n;
                               5137                 :                :                 }
                               5138                 :                :         ;
                               5139                 :                : 
                               5140                 :                : /*****************************************************************************
                               5141                 :                :  *
                               5142                 :                :  *      QUERY:
                               5143                 :                :  *             CREATE EXTENSION extension
                               5144                 :                :  *             [ WITH ] [ SCHEMA schema ] [ VERSION version ]
                               5145                 :                :  *
                               5146                 :                :  *****************************************************************************/
                               5147                 :                : 
                               5148                 :                : CreateExtensionStmt: CREATE EXTENSION name opt_with create_extension_opt_list
                               5149                 :                :                 {
 4814 tgl@sss.pgh.pa.us        5150                 :CBC         206 :                     CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
                               5151                 :                : 
                               5152                 :            206 :                     n->extname = $3;
 4790                          5153                 :            206 :                     n->if_not_exists = false;
 4814                          5154                 :            206 :                     n->options = $5;
                               5155                 :            206 :                     $$ = (Node *) n;
                               5156                 :                :                 }
                               5157                 :                :                 | CREATE EXTENSION IF_P NOT EXISTS name opt_with create_extension_opt_list
                               5158                 :                :                 {
 4790                          5159                 :              7 :                     CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
                               5160                 :                : 
                               5161                 :              7 :                     n->extname = $6;
                               5162                 :              7 :                     n->if_not_exists = true;
                               5163                 :              7 :                     n->options = $8;
                               5164                 :              7 :                     $$ = (Node *) n;
                               5165                 :                :                 }
                               5166                 :                :         ;
                               5167                 :                : 
                               5168                 :                : create_extension_opt_list:
                               5169                 :                :             create_extension_opt_list create_extension_opt_item
 4814                          5170                 :             48 :                 { $$ = lappend($1, $2); }
                               5171                 :                :             | /* EMPTY */
                               5172                 :            213 :                 { $$ = NIL; }
                               5173                 :                :         ;
                               5174                 :                : 
                               5175                 :                : create_extension_opt_item:
                               5176                 :                :             SCHEMA name
                               5177                 :                :                 {
  702 peter@eisentraut.org     5178                 :             22 :                     $$ = makeDefElem("schema", (Node *) makeString($2), @1);
                               5179                 :                :                 }
                               5180                 :                :             | VERSION_P NonReservedWord_or_Sconst
                               5181                 :                :                 {
                               5182                 :              6 :                     $$ = makeDefElem("new_version", (Node *) makeString($2), @1);
                               5183                 :                :                 }
                               5184                 :                :             | FROM NonReservedWord_or_Sconst
                               5185                 :                :                 {
 1516 tgl@sss.pgh.pa.us        5186         [ #  # ]:UBC           0 :                     ereport(ERROR,
                               5187                 :                :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               5188                 :                :                              errmsg("CREATE EXTENSION ... FROM is no longer supported"),
                               5189                 :                :                              parser_errposition(@1)));
                               5190                 :                :                 }
                               5191                 :                :             | CASCADE
                               5192                 :                :                 {
  702 peter@eisentraut.org     5193                 :CBC          20 :                     $$ = makeDefElem("cascade", (Node *) makeBoolean(true), @1);
                               5194                 :                :                 }
                               5195                 :                :         ;
                               5196                 :                : 
                               5197                 :                : /*****************************************************************************
                               5198                 :                :  *
                               5199                 :                :  * ALTER EXTENSION name UPDATE [ TO version ]
                               5200                 :                :  *
                               5201                 :                :  *****************************************************************************/
                               5202                 :                : 
                               5203                 :                : AlterExtensionStmt: ALTER EXTENSION name UPDATE alter_extension_opt_list
                               5204                 :                :                 {
 4811 tgl@sss.pgh.pa.us        5205                 :             14 :                     AlterExtensionStmt *n = makeNode(AlterExtensionStmt);
                               5206                 :                : 
                               5207                 :             14 :                     n->extname = $3;
                               5208                 :             14 :                     n->options = $5;
                               5209                 :             14 :                     $$ = (Node *) n;
                               5210                 :                :                 }
                               5211                 :                :         ;
                               5212                 :                : 
                               5213                 :                : alter_extension_opt_list:
                               5214                 :                :             alter_extension_opt_list alter_extension_opt_item
                               5215                 :             14 :                 { $$ = lappend($1, $2); }
                               5216                 :                :             | /* EMPTY */
                               5217                 :             14 :                 { $$ = NIL; }
                               5218                 :                :         ;
                               5219                 :                : 
                               5220                 :                : alter_extension_opt_item:
                               5221                 :                :             TO NonReservedWord_or_Sconst
                               5222                 :                :                 {
  702 peter@eisentraut.org     5223                 :             14 :                     $$ = makeDefElem("new_version", (Node *) makeString($2), @1);
                               5224                 :                :                 }
                               5225                 :                :         ;
                               5226                 :                : 
                               5227                 :                : /*****************************************************************************
                               5228                 :                :  *
                               5229                 :                :  * ALTER EXTENSION name ADD/DROP object-identifier
                               5230                 :                :  *
                               5231                 :                :  *****************************************************************************/
                               5232                 :                : 
                               5233                 :                : AlterExtensionContentsStmt:
                               5234                 :                :             ALTER EXTENSION name add_drop object_type_name name
                               5235                 :                :                 {
 2751 tgl@sss.pgh.pa.us        5236                 :              9 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5237                 :                : 
                               5238                 :              9 :                     n->extname = $3;
                               5239                 :              9 :                     n->action = $4;
 1401 peter@eisentraut.org     5240                 :              9 :                     n->objtype = $5;
                               5241                 :              9 :                     n->object = (Node *) makeString($6);
  702                          5242                 :              9 :                     $$ = (Node *) n;
                               5243                 :                :                 }
                               5244                 :                :             | ALTER EXTENSION name add_drop object_type_any_name any_name
                               5245                 :                :                 {
 4812 tgl@sss.pgh.pa.us        5246                 :             29 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5247                 :                : 
 4813                          5248                 :             29 :                     n->extname = $3;
 4812                          5249                 :             29 :                     n->action = $4;
 1401 peter@eisentraut.org     5250                 :             29 :                     n->objtype = $5;
 2710 peter_e@gmx.net          5251                 :             29 :                     n->object = (Node *) $6;
  702 peter@eisentraut.org     5252                 :             29 :                     $$ = (Node *) n;
                               5253                 :                :                 }
                               5254                 :                :             | ALTER EXTENSION name add_drop AGGREGATE aggregate_with_argtypes
                               5255                 :                :                 {
 4810 peter_e@gmx.net          5256                 :              4 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5257                 :                : 
                               5258                 :              4 :                     n->extname = $3;
                               5259                 :              4 :                     n->action = $4;
 1401 peter@eisentraut.org     5260                 :              4 :                     n->objtype = OBJECT_AGGREGATE;
 2710 peter_e@gmx.net          5261                 :              4 :                     n->object = (Node *) $6;
  702 peter@eisentraut.org     5262                 :              4 :                     $$ = (Node *) n;
                               5263                 :                :                 }
                               5264                 :                :             | ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')'
                               5265                 :                :                 {
 4812 tgl@sss.pgh.pa.us        5266                 :              2 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5267                 :                : 
 4813                          5268                 :              2 :                     n->extname = $3;
 4812                          5269                 :              2 :                     n->action = $4;
 1401 peter@eisentraut.org     5270                 :              2 :                     n->objtype = OBJECT_CAST;
                               5271                 :              2 :                     n->object = (Node *) list_make2($7, $9);
                               5272                 :              2 :                     $$ = (Node *) n;
                               5273                 :                :                 }
                               5274                 :                :             | ALTER EXTENSION name add_drop DOMAIN_P Typename
                               5275                 :                :                 {
 4812 tgl@sss.pgh.pa.us        5276                 :UBC           0 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5277                 :                : 
 4813                          5278                 :              0 :                     n->extname = $3;
 4812                          5279                 :              0 :                     n->action = $4;
 4813                          5280                 :              0 :                     n->objtype = OBJECT_DOMAIN;
 2710 peter_e@gmx.net          5281                 :              0 :                     n->object = (Node *) $6;
  702 peter@eisentraut.org     5282                 :              0 :                     $$ = (Node *) n;
                               5283                 :                :                 }
                               5284                 :                :             | ALTER EXTENSION name add_drop FUNCTION function_with_argtypes
                               5285                 :                :                 {
 4812 tgl@sss.pgh.pa.us        5286                 :CBC          37 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5287                 :                : 
 4813                          5288                 :             37 :                     n->extname = $3;
 4812                          5289                 :             37 :                     n->action = $4;
 4813                          5290                 :             37 :                     n->objtype = OBJECT_FUNCTION;
 2710 peter_e@gmx.net          5291                 :             37 :                     n->object = (Node *) $6;
  702 peter@eisentraut.org     5292                 :             37 :                     $$ = (Node *) n;
                               5293                 :                :                 }
                               5294                 :                :             | ALTER EXTENSION name add_drop OPERATOR operator_with_argtypes
                               5295                 :                :                 {
 4812 tgl@sss.pgh.pa.us        5296                 :              9 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5297                 :                : 
 4813                          5298                 :              9 :                     n->extname = $3;
 4812                          5299                 :              9 :                     n->action = $4;
 4813                          5300                 :              9 :                     n->objtype = OBJECT_OPERATOR;
 2710 peter_e@gmx.net          5301                 :              9 :                     n->object = (Node *) $6;
  702 peter@eisentraut.org     5302                 :              9 :                     $$ = (Node *) n;
                               5303                 :                :                 }
                               5304                 :                :             | ALTER EXTENSION name add_drop OPERATOR CLASS any_name USING name
                               5305                 :                :                 {
 4812 tgl@sss.pgh.pa.us        5306                 :              2 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5307                 :                : 
 4813                          5308                 :              2 :                     n->extname = $3;
 4812                          5309                 :              2 :                     n->action = $4;
 4813                          5310                 :              2 :                     n->objtype = OBJECT_OPCLASS;
 2710 peter_e@gmx.net          5311                 :              2 :                     n->object = (Node *) lcons(makeString($9), $7);
  702 peter@eisentraut.org     5312                 :              2 :                     $$ = (Node *) n;
                               5313                 :                :                 }
                               5314                 :                :             | ALTER EXTENSION name add_drop OPERATOR FAMILY any_name USING name
                               5315                 :                :                 {
 4812 tgl@sss.pgh.pa.us        5316                 :              2 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5317                 :                : 
 4813                          5318                 :              2 :                     n->extname = $3;
 4812                          5319                 :              2 :                     n->action = $4;
 4813                          5320                 :              2 :                     n->objtype = OBJECT_OPFAMILY;
 2710 peter_e@gmx.net          5321                 :              2 :                     n->object = (Node *) lcons(makeString($9), $7);
  702 peter@eisentraut.org     5322                 :              2 :                     $$ = (Node *) n;
                               5323                 :                :                 }
                               5324                 :                :             | ALTER EXTENSION name add_drop PROCEDURE function_with_argtypes
                               5325                 :                :                 {
 2327 peter_e@gmx.net          5326                 :UBC           0 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5327                 :                : 
                               5328                 :              0 :                     n->extname = $3;
                               5329                 :              0 :                     n->action = $4;
                               5330                 :              0 :                     n->objtype = OBJECT_PROCEDURE;
                               5331                 :              0 :                     n->object = (Node *) $6;
  702 peter@eisentraut.org     5332                 :              0 :                     $$ = (Node *) n;
                               5333                 :                :                 }
                               5334                 :                :             | ALTER EXTENSION name add_drop ROUTINE function_with_argtypes
                               5335                 :                :                 {
 2327 peter_e@gmx.net          5336                 :              0 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5337                 :                : 
                               5338                 :              0 :                     n->extname = $3;
                               5339                 :              0 :                     n->action = $4;
                               5340                 :              0 :                     n->objtype = OBJECT_ROUTINE;
                               5341                 :              0 :                     n->object = (Node *) $6;
  702 peter@eisentraut.org     5342                 :              0 :                     $$ = (Node *) n;
                               5343                 :                :                 }
                               5344                 :                :             | ALTER EXTENSION name add_drop TRANSFORM FOR Typename LANGUAGE name
                               5345                 :                :                 {
 3276 peter_e@gmx.net          5346                 :CBC           2 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5347                 :                : 
                               5348                 :              2 :                     n->extname = $3;
                               5349                 :              2 :                     n->action = $4;
                               5350                 :              2 :                     n->objtype = OBJECT_TRANSFORM;
 2710                          5351                 :              2 :                     n->object = (Node *) list_make2($7, makeString($9));
  702 peter@eisentraut.org     5352                 :              2 :                     $$ = (Node *) n;
                               5353                 :                :                 }
                               5354                 :                :             | ALTER EXTENSION name add_drop TYPE_P Typename
                               5355                 :                :                 {
 4812 tgl@sss.pgh.pa.us        5356                 :              4 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5357                 :                : 
 4813                          5358                 :              4 :                     n->extname = $3;
 4812                          5359                 :              4 :                     n->action = $4;
 4813                          5360                 :              4 :                     n->objtype = OBJECT_TYPE;
 2710 peter_e@gmx.net          5361                 :              4 :                     n->object = (Node *) $6;
  702 peter@eisentraut.org     5362                 :              4 :                     $$ = (Node *) n;
                               5363                 :                :                 }
                               5364                 :                :         ;
                               5365                 :                : 
                               5366                 :                : /*****************************************************************************
                               5367                 :                :  *
                               5368                 :                :  *      QUERY:
                               5369                 :                :  *             CREATE FOREIGN DATA WRAPPER name options
                               5370                 :                :  *
                               5371                 :                :  *****************************************************************************/
                               5372                 :                : 
                               5373                 :                : CreateFdwStmt: CREATE FOREIGN DATA_P WRAPPER name opt_fdw_options create_generic_options
                               5374                 :                :                 {
 5595 peter_e@gmx.net          5375                 :             97 :                     CreateFdwStmt *n = makeNode(CreateFdwStmt);
                               5376                 :                : 
                               5377                 :             97 :                     n->fdwname = $5;
 4803 tgl@sss.pgh.pa.us        5378                 :             97 :                     n->func_options = $6;
 5528 peter_e@gmx.net          5379                 :             97 :                     n->options = $7;
 5595                          5380                 :             97 :                     $$ = (Node *) n;
                               5381                 :                :                 }
                               5382                 :                :         ;
                               5383                 :                : 
                               5384                 :                : fdw_option:
  702 peter@eisentraut.org     5385                 :             28 :             HANDLER handler_name                { $$ = makeDefElem("handler", (Node *) $2, @1); }
 2777 peter_e@gmx.net          5386                 :UBC           0 :             | NO HANDLER                        { $$ = makeDefElem("handler", NULL, @1); }
  702 peter@eisentraut.org     5387                 :CBC          24 :             | VALIDATOR handler_name            { $$ = makeDefElem("validator", (Node *) $2, @1); }
 2777 peter_e@gmx.net          5388                 :              3 :             | NO VALIDATOR                      { $$ = makeDefElem("validator", NULL, @1); }
                               5389                 :                :         ;
                               5390                 :                : 
                               5391                 :                : fdw_options:
 4803 tgl@sss.pgh.pa.us        5392                 :             45 :             fdw_option                          { $$ = list_make1($1); }
                               5393                 :             10 :             | fdw_options fdw_option            { $$ = lappend($1, $2); }
                               5394                 :                :         ;
                               5395                 :                : 
                               5396                 :                : opt_fdw_options:
                               5397                 :             27 :             fdw_options                         { $$ = $1; }
                               5398                 :            116 :             | /*EMPTY*/                         { $$ = NIL; }
                               5399                 :                :         ;
                               5400                 :                : 
                               5401                 :                : /*****************************************************************************
                               5402                 :                :  *
                               5403                 :                :  *      QUERY :
                               5404                 :                :  *              ALTER FOREIGN DATA WRAPPER name options
                               5405                 :                :  *
                               5406                 :                :  ****************************************************************************/
                               5407                 :                : 
                               5408                 :                : AlterFdwStmt: ALTER FOREIGN DATA_P WRAPPER name opt_fdw_options alter_generic_options
                               5409                 :                :                 {
 5595 peter_e@gmx.net          5410                 :             43 :                     AlterFdwStmt *n = makeNode(AlterFdwStmt);
                               5411                 :                : 
                               5412                 :             43 :                     n->fdwname = $5;
 4803 tgl@sss.pgh.pa.us        5413                 :             43 :                     n->func_options = $6;
 5528 peter_e@gmx.net          5414                 :             43 :                     n->options = $7;
 5595                          5415                 :             43 :                     $$ = (Node *) n;
                               5416                 :                :                 }
                               5417                 :                :             | ALTER FOREIGN DATA_P WRAPPER name fdw_options
                               5418                 :                :                 {
                               5419                 :             18 :                     AlterFdwStmt *n = makeNode(AlterFdwStmt);
                               5420                 :                : 
                               5421                 :             18 :                     n->fdwname = $5;
 4803 tgl@sss.pgh.pa.us        5422                 :             18 :                     n->func_options = $6;
                               5423                 :             18 :                     n->options = NIL;
 5595 peter_e@gmx.net          5424                 :             18 :                     $$ = (Node *) n;
                               5425                 :                :                 }
                               5426                 :                :         ;
                               5427                 :                : 
                               5428                 :                : /* Options definition for CREATE FDW, SERVER and USER MAPPING */
                               5429                 :                : create_generic_options:
 5489 tgl@sss.pgh.pa.us        5430                 :            348 :             OPTIONS '(' generic_option_list ')'         { $$ = $3; }
                               5431                 :          31579 :             | /*EMPTY*/                                 { $$ = NIL; }
                               5432                 :                :         ;
                               5433                 :                : 
                               5434                 :                : generic_option_list:
                               5435                 :                :             generic_option_elem
                               5436                 :                :                 {
                               5437                 :            348 :                     $$ = list_make1($1);
                               5438                 :                :                 }
                               5439                 :                :             | generic_option_list ',' generic_option_elem
                               5440                 :                :                 {
                               5441                 :            222 :                     $$ = lappend($1, $3);
                               5442                 :                :                 }
                               5443                 :                :         ;
                               5444                 :                : 
                               5445                 :                : /* Options definition for ALTER FDW, SERVER and USER MAPPING */
                               5446                 :                : alter_generic_options:
                               5447                 :            239 :             OPTIONS '(' alter_generic_option_list ')'       { $$ = $3; }
                               5448                 :                :         ;
                               5449                 :                : 
                               5450                 :                : alter_generic_option_list:
                               5451                 :                :             alter_generic_option_elem
                               5452                 :                :                 {
                               5453                 :            239 :                     $$ = list_make1($1);
                               5454                 :                :                 }
                               5455                 :                :             | alter_generic_option_list ',' alter_generic_option_elem
                               5456                 :                :                 {
                               5457                 :             84 :                     $$ = lappend($1, $3);
                               5458                 :                :                 }
                               5459                 :                :         ;
                               5460                 :                : 
                               5461                 :                : alter_generic_option_elem:
                               5462                 :                :             generic_option_elem
                               5463                 :                :                 {
                               5464                 :            100 :                     $$ = $1;
                               5465                 :                :                 }
                               5466                 :                :             | SET generic_option_elem
                               5467                 :                :                 {
                               5468                 :             62 :                     $$ = $2;
                               5469                 :             62 :                     $$->defaction = DEFELEM_SET;
                               5470                 :                :                 }
                               5471                 :                :             | ADD_P generic_option_elem
                               5472                 :                :                 {
                               5473                 :             98 :                     $$ = $2;
                               5474                 :             98 :                     $$->defaction = DEFELEM_ADD;
                               5475                 :                :                 }
                               5476                 :                :             | DROP generic_option_name
                               5477                 :                :                 {
 2777 peter_e@gmx.net          5478                 :             63 :                     $$ = makeDefElemExtended(NULL, $2, NULL, DEFELEM_DROP, @2);
                               5479                 :                :                 }
                               5480                 :                :         ;
                               5481                 :                : 
                               5482                 :                : generic_option_elem:
                               5483                 :                :             generic_option_name generic_option_arg
                               5484                 :                :                 {
                               5485                 :            830 :                     $$ = makeDefElem($1, $2, @1);
                               5486                 :                :                 }
                               5487                 :                :         ;
                               5488                 :                : 
                               5489                 :                : generic_option_name:
 5489 tgl@sss.pgh.pa.us        5490                 :            893 :                 ColLabel            { $$ = $1; }
                               5491                 :                :         ;
                               5492                 :                : 
                               5493                 :                : /* We could use def_arg here, but the spec only requires string literals */
                               5494                 :                : generic_option_arg:
                               5495                 :            830 :                 Sconst              { $$ = (Node *) makeString($1); }
                               5496                 :                :         ;
                               5497                 :                : 
                               5498                 :                : /*****************************************************************************
                               5499                 :                :  *
                               5500                 :                :  *      QUERY:
                               5501                 :                :  *             CREATE SERVER name [TYPE] [VERSION] [OPTIONS]
                               5502                 :                :  *
                               5503                 :                :  *****************************************************************************/
                               5504                 :                : 
                               5505                 :                : CreateForeignServerStmt: CREATE SERVER name opt_type opt_foreign_server_version
                               5506                 :                :                          FOREIGN DATA_P WRAPPER name create_generic_options
                               5507                 :                :                 {
 5595 peter_e@gmx.net          5508                 :            126 :                     CreateForeignServerStmt *n = makeNode(CreateForeignServerStmt);
                               5509                 :                : 
                               5510                 :            126 :                     n->servername = $3;
                               5511                 :            126 :                     n->servertype = $4;
                               5512                 :            126 :                     n->version = $5;
                               5513                 :            126 :                     n->fdwname = $9;
                               5514                 :            126 :                     n->options = $10;
 2582 andrew@dunslane.net      5515                 :            126 :                     n->if_not_exists = false;
                               5516                 :            126 :                     $$ = (Node *) n;
                               5517                 :                :                 }
                               5518                 :                :                 | CREATE SERVER IF_P NOT EXISTS name opt_type opt_foreign_server_version
                               5519                 :                :                          FOREIGN DATA_P WRAPPER name create_generic_options
                               5520                 :                :                 {
                               5521                 :             12 :                     CreateForeignServerStmt *n = makeNode(CreateForeignServerStmt);
                               5522                 :                : 
                               5523                 :             12 :                     n->servername = $6;
                               5524                 :             12 :                     n->servertype = $7;
                               5525                 :             12 :                     n->version = $8;
                               5526                 :             12 :                     n->fdwname = $12;
                               5527                 :             12 :                     n->options = $13;
                               5528                 :             12 :                     n->if_not_exists = true;
 5595 peter_e@gmx.net          5529                 :             12 :                     $$ = (Node *) n;
                               5530                 :                :                 }
                               5531                 :                :         ;
                               5532                 :                : 
                               5533                 :                : opt_type:
                               5534                 :              9 :             TYPE_P Sconst           { $$ = $2; }
                               5535                 :            129 :             | /*EMPTY*/             { $$ = NULL; }
                               5536                 :                :         ;
                               5537                 :                : 
                               5538                 :                : 
                               5539                 :                : foreign_server_version:
                               5540                 :             33 :             VERSION_P Sconst        { $$ = $2; }
 5595 peter_e@gmx.net          5541                 :UBC           0 :         |   VERSION_P NULL_P        { $$ = NULL; }
                               5542                 :                :         ;
                               5543                 :                : 
                               5544                 :                : opt_foreign_server_version:
 4548 peter_e@gmx.net          5545                 :CBC           9 :             foreign_server_version  { $$ = $1; }
 5595                          5546                 :            129 :             | /*EMPTY*/             { $$ = NULL; }
                               5547                 :                :         ;
                               5548                 :                : 
                               5549                 :                : /*****************************************************************************
                               5550                 :                :  *
                               5551                 :                :  *      QUERY :
                               5552                 :                :  *              ALTER SERVER name [VERSION] [OPTIONS]
                               5553                 :                :  *
                               5554                 :                :  ****************************************************************************/
                               5555                 :                : 
                               5556                 :                : AlterForeignServerStmt: ALTER SERVER name foreign_server_version alter_generic_options
                               5557                 :                :                 {
                               5558                 :              3 :                     AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
                               5559                 :                : 
                               5560                 :              3 :                     n->servername = $3;
                               5561                 :              3 :                     n->version = $4;
                               5562                 :              3 :                     n->options = $5;
                               5563                 :              3 :                     n->has_version = true;
                               5564                 :              3 :                     $$ = (Node *) n;
                               5565                 :                :                 }
                               5566                 :                :             | ALTER SERVER name foreign_server_version
                               5567                 :                :                 {
                               5568                 :             21 :                     AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
                               5569                 :                : 
                               5570                 :             21 :                     n->servername = $3;
                               5571                 :             21 :                     n->version = $4;
                               5572                 :             21 :                     n->has_version = true;
                               5573                 :             21 :                     $$ = (Node *) n;
                               5574                 :                :                 }
                               5575                 :                :             | ALTER SERVER name alter_generic_options
                               5576                 :                :                 {
                               5577                 :             85 :                     AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
                               5578                 :                : 
                               5579                 :             85 :                     n->servername = $3;
                               5580                 :             85 :                     n->options = $4;
                               5581                 :             85 :                     $$ = (Node *) n;
                               5582                 :                :                 }
                               5583                 :                :         ;
                               5584                 :                : 
                               5585                 :                : /*****************************************************************************
                               5586                 :                :  *
                               5587                 :                :  *      QUERY:
                               5588                 :                :  *             CREATE FOREIGN TABLE relname (...) SERVER name (...)
                               5589                 :                :  *
                               5590                 :                :  *****************************************************************************/
                               5591                 :                : 
                               5592                 :                : CreateForeignTableStmt:
                               5593                 :                :         CREATE FOREIGN TABLE qualified_name
                               5594                 :                :             '(' OptTableElementList ')'
                               5595                 :                :             OptInherit SERVER name create_generic_options
                               5596                 :                :                 {
 4852 rhaas@postgresql.org     5597                 :            180 :                     CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
                               5598                 :                : 
                               5599                 :            180 :                     $4->relpersistence = RELPERSISTENCE_PERMANENT;
                               5600                 :            180 :                     n->base.relation = $4;
 4051 tgl@sss.pgh.pa.us        5601                 :            180 :                     n->base.tableElts = $6;
 3311                          5602                 :            180 :                     n->base.inhRelations = $8;
                               5603                 :            180 :                     n->base.ofTypename = NULL;
                               5604                 :            180 :                     n->base.constraints = NIL;
                               5605                 :            180 :                     n->base.options = NIL;
                               5606                 :            180 :                     n->base.oncommit = ONCOMMIT_NOOP;
                               5607                 :            180 :                     n->base.tablespacename = NULL;
 4852 rhaas@postgresql.org     5608                 :            180 :                     n->base.if_not_exists = false;
                               5609                 :                :                     /* FDW-specific data */
 3311 tgl@sss.pgh.pa.us        5610                 :            180 :                     n->servername = $10;
                               5611                 :            180 :                     n->options = $11;
 4852 rhaas@postgresql.org     5612                 :            180 :                     $$ = (Node *) n;
                               5613                 :                :                 }
                               5614                 :                :         | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name
                               5615                 :                :             '(' OptTableElementList ')'
                               5616                 :                :             OptInherit SERVER name create_generic_options
                               5617                 :                :                 {
 4852 rhaas@postgresql.org     5618                 :UBC           0 :                     CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
                               5619                 :                : 
                               5620                 :              0 :                     $7->relpersistence = RELPERSISTENCE_PERMANENT;
                               5621                 :              0 :                     n->base.relation = $7;
 4051 tgl@sss.pgh.pa.us        5622                 :              0 :                     n->base.tableElts = $9;
 3311                          5623                 :              0 :                     n->base.inhRelations = $11;
                               5624                 :              0 :                     n->base.ofTypename = NULL;
                               5625                 :              0 :                     n->base.constraints = NIL;
                               5626                 :              0 :                     n->base.options = NIL;
                               5627                 :              0 :                     n->base.oncommit = ONCOMMIT_NOOP;
                               5628                 :              0 :                     n->base.tablespacename = NULL;
 4852 rhaas@postgresql.org     5629                 :              0 :                     n->base.if_not_exists = true;
                               5630                 :                :                     /* FDW-specific data */
 3311 tgl@sss.pgh.pa.us        5631                 :              0 :                     n->servername = $13;
                               5632                 :              0 :                     n->options = $14;
 4852 rhaas@postgresql.org     5633                 :              0 :                     $$ = (Node *) n;
                               5634                 :                :                 }
                               5635                 :                :         | CREATE FOREIGN TABLE qualified_name
                               5636                 :                :             PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec
                               5637                 :                :             SERVER name create_generic_options
                               5638                 :                :                 {
 2685 rhaas@postgresql.org     5639                 :CBC          45 :                     CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
                               5640                 :                : 
                               5641                 :             45 :                     $4->relpersistence = RELPERSISTENCE_PERMANENT;
                               5642                 :             45 :                     n->base.relation = $4;
                               5643                 :             45 :                     n->base.inhRelations = list_make1($7);
                               5644                 :             45 :                     n->base.tableElts = $8;
 2513 tgl@sss.pgh.pa.us        5645                 :             45 :                     n->base.partbound = $9;
 2685 rhaas@postgresql.org     5646                 :             45 :                     n->base.ofTypename = NULL;
                               5647                 :             45 :                     n->base.constraints = NIL;
                               5648                 :             45 :                     n->base.options = NIL;
                               5649                 :             45 :                     n->base.oncommit = ONCOMMIT_NOOP;
                               5650                 :             45 :                     n->base.tablespacename = NULL;
                               5651                 :             45 :                     n->base.if_not_exists = false;
                               5652                 :                :                     /* FDW-specific data */
                               5653                 :             45 :                     n->servername = $11;
                               5654                 :             45 :                     n->options = $12;
                               5655                 :             45 :                     $$ = (Node *) n;
                               5656                 :                :                 }
                               5657                 :                :         | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name
                               5658                 :                :             PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec
                               5659                 :                :             SERVER name create_generic_options
                               5660                 :                :                 {
 2685 rhaas@postgresql.org     5661                 :UBC           0 :                     CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
                               5662                 :                : 
                               5663                 :              0 :                     $7->relpersistence = RELPERSISTENCE_PERMANENT;
                               5664                 :              0 :                     n->base.relation = $7;
                               5665                 :              0 :                     n->base.inhRelations = list_make1($10);
                               5666                 :              0 :                     n->base.tableElts = $11;
 2513 tgl@sss.pgh.pa.us        5667                 :              0 :                     n->base.partbound = $12;
 2685 rhaas@postgresql.org     5668                 :              0 :                     n->base.ofTypename = NULL;
                               5669                 :              0 :                     n->base.constraints = NIL;
                               5670                 :              0 :                     n->base.options = NIL;
                               5671                 :              0 :                     n->base.oncommit = ONCOMMIT_NOOP;
                               5672                 :              0 :                     n->base.tablespacename = NULL;
                               5673                 :              0 :                     n->base.if_not_exists = true;
                               5674                 :                :                     /* FDW-specific data */
                               5675                 :              0 :                     n->servername = $14;
                               5676                 :              0 :                     n->options = $15;
                               5677                 :              0 :                     $$ = (Node *) n;
                               5678                 :                :                 }
                               5679                 :                :         ;
                               5680                 :                : 
                               5681                 :                : /*****************************************************************************
                               5682                 :                :  *
                               5683                 :                :  *      QUERY:
                               5684                 :                :  *              IMPORT FOREIGN SCHEMA remote_schema
                               5685                 :                :  *              [ { LIMIT TO | EXCEPT } ( table_list ) ]
                               5686                 :                :  *              FROM SERVER server_name INTO local_schema [ OPTIONS (...) ]
                               5687                 :                :  *
                               5688                 :                :  ****************************************************************************/
                               5689                 :                : 
                               5690                 :                : ImportForeignSchemaStmt:
                               5691                 :                :         IMPORT_P FOREIGN SCHEMA name import_qualification
                               5692                 :                :           FROM SERVER name INTO name create_generic_options
                               5693                 :                :             {
 3566 tgl@sss.pgh.pa.us        5694                 :CBC          22 :                 ImportForeignSchemaStmt *n = makeNode(ImportForeignSchemaStmt);
                               5695                 :                : 
                               5696                 :             22 :                 n->server_name = $8;
                               5697                 :             22 :                 n->remote_schema = $4;
                               5698                 :             22 :                 n->local_schema = $10;
                               5699                 :             22 :                 n->list_type = $5->type;
                               5700                 :             22 :                 n->table_list = $5->table_names;
                               5701                 :             22 :                 n->options = $11;
                               5702                 :             22 :                 $$ = (Node *) n;
                               5703                 :                :             }
                               5704                 :                :         ;
                               5705                 :                : 
                               5706                 :                : import_qualification_type:
 1250 peter@eisentraut.org     5707                 :              5 :         LIMIT TO                { $$ = FDW_IMPORT_SCHEMA_LIMIT_TO; }
                               5708                 :              7 :         | EXCEPT                { $$ = FDW_IMPORT_SCHEMA_EXCEPT; }
                               5709                 :                :         ;
                               5710                 :                : 
                               5711                 :                : import_qualification:
                               5712                 :                :         import_qualification_type '(' relation_expr_list ')'
                               5713                 :                :             {
 3566 tgl@sss.pgh.pa.us        5714                 :             12 :                 ImportQual *n = (ImportQual *) palloc(sizeof(ImportQual));
                               5715                 :                : 
                               5716                 :             12 :                 n->type = $1;
                               5717                 :             12 :                 n->table_names = $3;
                               5718                 :             12 :                 $$ = n;
                               5719                 :                :             }
                               5720                 :                :         | /*EMPTY*/
                               5721                 :                :             {
                               5722                 :             10 :                 ImportQual *n = (ImportQual *) palloc(sizeof(ImportQual));
                               5723                 :             10 :                 n->type = FDW_IMPORT_SCHEMA_ALL;
                               5724                 :             10 :                 n->table_names = NIL;
                               5725                 :             10 :                 $$ = n;
                               5726                 :                :             }
                               5727                 :                :         ;
                               5728                 :                : 
                               5729                 :                : /*****************************************************************************
                               5730                 :                :  *
                               5731                 :                :  *      QUERY:
                               5732                 :                :  *             CREATE USER MAPPING FOR auth_ident SERVER name [OPTIONS]
                               5733                 :                :  *
                               5734                 :                :  *****************************************************************************/
                               5735                 :                : 
                               5736                 :                : CreateUserMappingStmt: CREATE USER MAPPING FOR auth_ident SERVER name create_generic_options
                               5737                 :                :                 {
 5595 peter_e@gmx.net          5738                 :            118 :                     CreateUserMappingStmt *n = makeNode(CreateUserMappingStmt);
                               5739                 :                : 
 3324 alvherre@alvh.no-ip.     5740                 :            118 :                     n->user = $5;
 5595 peter_e@gmx.net          5741                 :            118 :                     n->servername = $7;
                               5742                 :            118 :                     n->options = $8;
 2582 andrew@dunslane.net      5743                 :            118 :                     n->if_not_exists = false;
                               5744                 :            118 :                     $$ = (Node *) n;
                               5745                 :                :                 }
                               5746                 :                :                 | CREATE USER MAPPING IF_P NOT EXISTS FOR auth_ident SERVER name create_generic_options
                               5747                 :                :                 {
                               5748                 :              3 :                     CreateUserMappingStmt *n = makeNode(CreateUserMappingStmt);
                               5749                 :                : 
                               5750                 :              3 :                     n->user = $8;
                               5751                 :              3 :                     n->servername = $10;
                               5752                 :              3 :                     n->options = $11;
                               5753                 :              3 :                     n->if_not_exists = true;
 5595 peter_e@gmx.net          5754                 :              3 :                     $$ = (Node *) n;
                               5755                 :                :                 }
                               5756                 :                :         ;
                               5757                 :                : 
                               5758                 :                : /* User mapping authorization identifier */
 3324 alvherre@alvh.no-ip.     5759                 :            216 : auth_ident: RoleSpec            { $$ = $1; }
                               5760                 :             23 :             | USER              { $$ = makeRoleSpec(ROLESPEC_CURRENT_USER, @1); }
                               5761                 :                :         ;
                               5762                 :                : 
                               5763                 :                : /*****************************************************************************
                               5764                 :                :  *
                               5765                 :                :  *      QUERY :
                               5766                 :                :  *              DROP USER MAPPING FOR auth_ident SERVER name
                               5767                 :                :  *
                               5768                 :                :  * XXX you'd think this should have a CASCADE/RESTRICT option, even if it's
                               5769                 :                :  * only pro forma; but the SQL standard doesn't show one.
                               5770                 :                :  ****************************************************************************/
                               5771                 :                : 
                               5772                 :                : DropUserMappingStmt: DROP USER MAPPING FOR auth_ident SERVER name
                               5773                 :                :                 {
 5595 peter_e@gmx.net          5774                 :             44 :                     DropUserMappingStmt *n = makeNode(DropUserMappingStmt);
                               5775                 :                : 
 3324 alvherre@alvh.no-ip.     5776                 :             44 :                     n->user = $5;
 5595 peter_e@gmx.net          5777                 :             44 :                     n->servername = $7;
                               5778                 :             44 :                     n->missing_ok = false;
                               5779                 :             44 :                     $$ = (Node *) n;
                               5780                 :                :                 }
                               5781                 :                :                 |  DROP USER MAPPING IF_P EXISTS FOR auth_ident SERVER name
                               5782                 :                :                 {
                               5783                 :             19 :                     DropUserMappingStmt *n = makeNode(DropUserMappingStmt);
                               5784                 :                : 
 3324 alvherre@alvh.no-ip.     5785                 :             19 :                     n->user = $7;
 5595 peter_e@gmx.net          5786                 :             19 :                     n->servername = $9;
                               5787                 :             19 :                     n->missing_ok = true;
                               5788                 :             19 :                     $$ = (Node *) n;
                               5789                 :                :                 }
                               5790                 :                :         ;
                               5791                 :                : 
                               5792                 :                : /*****************************************************************************
                               5793                 :                :  *
                               5794                 :                :  *      QUERY :
                               5795                 :                :  *              ALTER USER MAPPING FOR auth_ident SERVER name OPTIONS
                               5796                 :                :  *
                               5797                 :                :  ****************************************************************************/
                               5798                 :                : 
                               5799                 :                : AlterUserMappingStmt: ALTER USER MAPPING FOR auth_ident SERVER name alter_generic_options
                               5800                 :                :                 {
                               5801                 :             55 :                     AlterUserMappingStmt *n = makeNode(AlterUserMappingStmt);
                               5802                 :                : 
 3324 alvherre@alvh.no-ip.     5803                 :             55 :                     n->user = $5;
 5595 peter_e@gmx.net          5804                 :             55 :                     n->servername = $7;
                               5805                 :             55 :                     n->options = $8;
                               5806                 :             55 :                     $$ = (Node *) n;
                               5807                 :                :                 }
                               5808                 :                :         ;
                               5809                 :                : 
                               5810                 :                : /*****************************************************************************
                               5811                 :                :  *
                               5812                 :                :  *      QUERIES:
                               5813                 :                :  *              CREATE POLICY name ON table
                               5814                 :                :  *                  [AS { PERMISSIVE | RESTRICTIVE } ]
                               5815                 :                :  *                  [FOR { SELECT | INSERT | UPDATE | DELETE } ]
                               5816                 :                :  *                  [TO role, ...]
                               5817                 :                :  *                  [USING (qual)] [WITH CHECK (with check qual)]
                               5818                 :                :  *              ALTER POLICY name ON table [TO role, ...]
                               5819                 :                :  *                  [USING (qual)] [WITH CHECK (with check qual)]
                               5820                 :                :  *
                               5821                 :                :  *****************************************************************************/
                               5822                 :                : 
                               5823                 :                : CreatePolicyStmt:
                               5824                 :                :             CREATE POLICY name ON qualified_name RowSecurityDefaultPermissive
                               5825                 :                :                 RowSecurityDefaultForCmd RowSecurityDefaultToRole
                               5826                 :                :                 RowSecurityOptionalExpr RowSecurityOptionalWithCheck
                               5827                 :                :                 {
 3495 sfrost@snowman.net       5828                 :            326 :                     CreatePolicyStmt *n = makeNode(CreatePolicyStmt);
                               5829                 :                : 
                               5830                 :            326 :                     n->policy_name = $3;
                               5831                 :            326 :                     n->table = $5;
 2687                          5832                 :            326 :                     n->permissive = $6;
                               5833                 :            326 :                     n->cmd_name = $7;
                               5834                 :            326 :                     n->roles = $8;
                               5835                 :            326 :                     n->qual = $9;
                               5836                 :            326 :                     n->with_check = $10;
 3495                          5837                 :            326 :                     $$ = (Node *) n;
                               5838                 :                :                 }
                               5839                 :                :         ;
                               5840                 :                : 
                               5841                 :                : AlterPolicyStmt:
                               5842                 :                :             ALTER POLICY name ON qualified_name RowSecurityOptionalToRole
                               5843                 :                :                 RowSecurityOptionalExpr RowSecurityOptionalWithCheck
                               5844                 :                :                 {
                               5845                 :             42 :                     AlterPolicyStmt *n = makeNode(AlterPolicyStmt);
                               5846                 :                : 
                               5847                 :             42 :                     n->policy_name = $3;
                               5848                 :             42 :                     n->table = $5;
                               5849                 :             42 :                     n->roles = $6;
                               5850                 :             42 :                     n->qual = $7;
                               5851                 :             42 :                     n->with_check = $8;
                               5852                 :             42 :                     $$ = (Node *) n;
                               5853                 :                :                 }
                               5854                 :                :         ;
                               5855                 :                : 
                               5856                 :                : RowSecurityOptionalExpr:
                               5857                 :            339 :             USING '(' a_expr ')'    { $$ = $3; }
                               5858                 :             29 :             | /* EMPTY */           { $$ = NULL; }
                               5859                 :                :         ;
                               5860                 :                : 
                               5861                 :                : RowSecurityOptionalWithCheck:
                               5862                 :             61 :             WITH CHECK '(' a_expr ')'       { $$ = $4; }
                               5863                 :            307 :             | /* EMPTY */                   { $$ = NULL; }
                               5864                 :                :         ;
                               5865                 :                : 
                               5866                 :                : RowSecurityDefaultToRole:
                               5867                 :             62 :             TO role_list            { $$ = $2; }
 3324 alvherre@alvh.no-ip.     5868                 :            264 :             | /* EMPTY */           { $$ = list_make1(makeRoleSpec(ROLESPEC_PUBLIC, -1)); }
                               5869                 :                :         ;
                               5870                 :                : 
                               5871                 :                : RowSecurityOptionalToRole:
 3495 sfrost@snowman.net       5872                 :              6 :             TO role_list            { $$ = $2; }
                               5873                 :             36 :             | /* EMPTY */           { $$ = NULL; }
                               5874                 :                :         ;
                               5875                 :                : 
                               5876                 :                : RowSecurityDefaultPermissive:
                               5877                 :                :             AS IDENT
                               5878                 :                :                 {
 2687                          5879         [ +  + ]:             40 :                     if (strcmp($2, "permissive") == 0)
                               5880                 :              9 :                         $$ = true;
                               5881         [ +  + ]:             31 :                     else if (strcmp($2, "restrictive") == 0)
                               5882                 :             28 :                         $$ = false;
                               5883                 :                :                     else
                               5884         [ +  - ]:              3 :                         ereport(ERROR,
                               5885                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               5886                 :                :                                  errmsg("unrecognized row security option \"%s\"", $2),
                               5887                 :                :                                  errhint("Only PERMISSIVE or RESTRICTIVE policies are supported currently."),
                               5888                 :                :                                  parser_errposition(@2)));
                               5889                 :                : 
                               5890                 :                :                 }
                               5891                 :            289 :             | /* EMPTY */           { $$ = true; }
                               5892                 :                :         ;
                               5893                 :                : 
                               5894                 :                : RowSecurityDefaultForCmd:
 3495                          5895                 :            157 :             FOR row_security_cmd    { $$ = $2; }
                               5896                 :            169 :             | /* EMPTY */           { $$ = "all"; }
                               5897                 :                :         ;
                               5898                 :                : 
                               5899                 :                : row_security_cmd:
                               5900                 :             22 :             ALL             { $$ = "all"; }
                               5901                 :             53 :         |   SELECT          { $$ = "select"; }
                               5902                 :             22 :         |   INSERT          { $$ = "insert"; }
                               5903                 :             39 :         |   UPDATE          { $$ = "update"; }
                               5904                 :             21 :         |   DELETE_P        { $$ = "delete"; }
                               5905                 :                :         ;
                               5906                 :                : 
                               5907                 :                : /*****************************************************************************
                               5908                 :                :  *
                               5909                 :                :  *      QUERY:
                               5910                 :                :  *             CREATE ACCESS METHOD name HANDLER handler_name
                               5911                 :                :  *
                               5912                 :                :  *****************************************************************************/
                               5913                 :                : 
                               5914                 :                : CreateAmStmt: CREATE ACCESS METHOD name TYPE_P am_type HANDLER handler_name
                               5915                 :                :                 {
 2944 alvherre@alvh.no-ip.     5916                 :             30 :                     CreateAmStmt *n = makeNode(CreateAmStmt);
                               5917                 :                : 
                               5918                 :             30 :                     n->amname = $4;
                               5919                 :             30 :                     n->handler_name = $8;
 1866 andres@anarazel.de       5920                 :             30 :                     n->amtype = $6;
 2944 alvherre@alvh.no-ip.     5921                 :             30 :                     $$ = (Node *) n;
                               5922                 :                :                 }
                               5923                 :                :         ;
                               5924                 :                : 
                               5925                 :                : am_type:
 1866 andres@anarazel.de       5926                 :             16 :             INDEX           { $$ = AMTYPE_INDEX; }
                               5927                 :             14 :         |   TABLE           { $$ = AMTYPE_TABLE; }
                               5928                 :                :         ;
                               5929                 :                : 
                               5930                 :                : /*****************************************************************************
                               5931                 :                :  *
                               5932                 :                :  *      QUERIES :
                               5933                 :                :  *              CREATE TRIGGER ...
                               5934                 :                :  *
                               5935                 :                :  *****************************************************************************/
                               5936                 :                : 
                               5937                 :                : CreateTrigStmt:
                               5938                 :                :             CREATE opt_or_replace TRIGGER name TriggerActionTime TriggerEvents ON
                               5939                 :                :             qualified_name TriggerReferencing TriggerForSpec TriggerWhen
                               5940                 :                :             EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')'
                               5941                 :                :                 {
 9715 bruce@momjian.us         5942                 :           1544 :                     CreateTrigStmt *n = makeNode(CreateTrigStmt);
                               5943                 :                : 
 1247 tgl@sss.pgh.pa.us        5944                 :           1544 :                     n->replace = $2;
                               5945                 :           1544 :                     n->isconstraint = false;
                               5946                 :           1544 :                     n->trigname = $4;
                               5947                 :           1544 :                     n->relation = $8;
                               5948                 :           1544 :                     n->funcname = $14;
                               5949                 :           1544 :                     n->args = $16;
                               5950                 :           1544 :                     n->row = $10;
                               5951                 :           1544 :                     n->timing = $5;
                               5952                 :           1544 :                     n->events = intVal(linitial($6));
                               5953                 :           1544 :                     n->columns = (List *) lsecond($6);
                               5954                 :           1544 :                     n->whenClause = $11;
                               5955                 :           1544 :                     n->transitionRels = $9;
 1116 peter@eisentraut.org     5956                 :           1544 :                     n->deferrable = false;
                               5957                 :           1544 :                     n->initdeferred = false;
 8060 tgl@sss.pgh.pa.us        5958                 :           1544 :                     n->constrrel = NULL;
  702 peter@eisentraut.org     5959                 :           1544 :                     $$ = (Node *) n;
                               5960                 :                :                 }
                               5961                 :                :           | CREATE opt_or_replace CONSTRAINT TRIGGER name AFTER TriggerEvents ON
                               5962                 :                :             qualified_name OptConstrFromTable ConstraintAttributeSpec
                               5963                 :                :             FOR EACH ROW TriggerWhen
                               5964                 :                :             EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')'
                               5965                 :                :                 {
 8964 JanWieck@Yahoo.com       5966                 :             27 :                     CreateTrigStmt *n = makeNode(CreateTrigStmt);
                               5967                 :                : 
 1247 tgl@sss.pgh.pa.us        5968                 :             27 :                     n->replace = $2;
                               5969         [ -  + ]:             27 :                     if (n->replace) /* not supported, see CreateTrigger */
 1247 tgl@sss.pgh.pa.us        5970         [ #  # ]:UBC           0 :                         ereport(ERROR,
                               5971                 :                :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               5972                 :                :                                  errmsg("CREATE OR REPLACE CONSTRAINT TRIGGER is not supported")));
 1247 tgl@sss.pgh.pa.us        5973                 :CBC          27 :                     n->isconstraint = true;
                               5974                 :             27 :                     n->trigname = $5;
                               5975                 :             27 :                     n->relation = $9;
                               5976                 :             27 :                     n->funcname = $18;
                               5977                 :             27 :                     n->args = $20;
 2433 peter_e@gmx.net          5978                 :             27 :                     n->row = true;
 4935 tgl@sss.pgh.pa.us        5979                 :             27 :                     n->timing = TRIGGER_TYPE_AFTER;
 1247                          5980                 :             27 :                     n->events = intVal(linitial($7));
                               5981                 :             27 :                     n->columns = (List *) lsecond($7);
                               5982                 :             27 :                     n->whenClause = $15;
 2718 kgrittn@postgresql.o     5983                 :             27 :                     n->transitionRels = NIL;
 1247 tgl@sss.pgh.pa.us        5984                 :             27 :                     processCASbits($11, @11, "TRIGGER",
                               5985                 :                :                                    &n->deferrable, &n->initdeferred, NULL,
                               5986                 :                :                                    NULL, yyscanner);
                               5987                 :             27 :                     n->constrrel = $10;
  702 peter@eisentraut.org     5988                 :             27 :                     $$ = (Node *) n;
                               5989                 :                :                 }
                               5990                 :                :         ;
                               5991                 :                : 
                               5992                 :                : TriggerActionTime:
 4935 tgl@sss.pgh.pa.us        5993                 :            699 :             BEFORE                              { $$ = TRIGGER_TYPE_BEFORE; }
                               5994                 :            782 :             | AFTER                             { $$ = TRIGGER_TYPE_AFTER; }
                               5995                 :             69 :             | INSTEAD OF                        { $$ = TRIGGER_TYPE_INSTEAD; }
                               5996                 :                :         ;
                               5997                 :                : 
                               5998                 :                : TriggerEvents:
                               5999                 :                :             TriggerOneEvent
 5414                          6000                 :           1577 :                 { $$ = $1; }
                               6001                 :                :             | TriggerEvents OR TriggerOneEvent
                               6002                 :                :                 {
  702 peter@eisentraut.org     6003                 :            538 :                     int         events1 = intVal(linitial($1));
                               6004                 :            538 :                     int         events2 = intVal(linitial($3));
                               6005                 :            538 :                     List       *columns1 = (List *) lsecond($1);
                               6006                 :            538 :                     List       *columns2 = (List *) lsecond($3);
                               6007                 :                : 
 5296 tgl@sss.pgh.pa.us        6008         [ +  + ]:            538 :                     if (events1 & events2)
 5389                          6009                 :              3 :                         parser_yyerror("duplicate trigger events specified");
                               6010                 :                :                     /*
                               6011                 :                :                      * concat'ing the columns lists loses information about
                               6012                 :                :                      * which columns went with which event, but so long as
                               6013                 :                :                      * only UPDATE carries columns and we disallow multiple
                               6014                 :                :                      * UPDATE items, it doesn't matter.  Command execution
                               6015                 :                :                      * should just ignore the columns for non-UPDATE events.
                               6016                 :                :                      */
 5296                          6017                 :            535 :                     $$ = list_make2(makeInteger(events1 | events2),
                               6018                 :                :                                     list_concat(columns1, columns2));
                               6019                 :                :                 }
                               6020                 :                :         ;
                               6021                 :                : 
                               6022                 :                : TriggerOneEvent:
                               6023                 :                :             INSERT
                               6024                 :            790 :                 { $$ = list_make2(makeInteger(TRIGGER_TYPE_INSERT), NIL); }
                               6025                 :                :             | DELETE_P
                               6026                 :            432 :                 { $$ = list_make2(makeInteger(TRIGGER_TYPE_DELETE), NIL); }
                               6027                 :                :             | UPDATE
                               6028                 :            823 :                 { $$ = list_make2(makeInteger(TRIGGER_TYPE_UPDATE), NIL); }
                               6029                 :                :             | UPDATE OF columnList
                               6030                 :             47 :                 { $$ = list_make2(makeInteger(TRIGGER_TYPE_UPDATE), $3); }
                               6031                 :                :             | TRUNCATE
                               6032                 :             23 :                 { $$ = list_make2(makeInteger(TRIGGER_TYPE_TRUNCATE), NIL); }
                               6033                 :                :         ;
                               6034                 :                : 
                               6035                 :                : TriggerReferencing:
 2718 kgrittn@postgresql.o     6036                 :            212 :             REFERENCING TriggerTransitions          { $$ = $2; }
                               6037                 :           1332 :             | /*EMPTY*/                             { $$ = NIL; }
                               6038                 :                :         ;
                               6039                 :                : 
                               6040                 :                : TriggerTransitions:
                               6041                 :            212 :             TriggerTransition                       { $$ = list_make1($1); }
                               6042                 :             69 :             | TriggerTransitions TriggerTransition  { $$ = lappend($1, $2); }
                               6043                 :                :         ;
                               6044                 :                : 
                               6045                 :                : TriggerTransition:
                               6046                 :                :             TransitionOldOrNew TransitionRowOrTable opt_as TransitionRelName
                               6047                 :                :                 {
                               6048                 :            281 :                     TriggerTransition *n = makeNode(TriggerTransition);
                               6049                 :                : 
                               6050                 :            281 :                     n->name = $4;
                               6051                 :            281 :                     n->isNew = $1;
                               6052                 :            281 :                     n->isTable = $2;
  702 peter@eisentraut.org     6053                 :            281 :                     $$ = (Node *) n;
                               6054                 :                :                 }
                               6055                 :                :         ;
                               6056                 :                : 
                               6057                 :                : TransitionOldOrNew:
 2433 peter_e@gmx.net          6058                 :            153 :             NEW                                     { $$ = true; }
                               6059                 :            128 :             | OLD                                   { $$ = false; }
                               6060                 :                :         ;
                               6061                 :                : 
                               6062                 :                : TransitionRowOrTable:
                               6063                 :            281 :             TABLE                                   { $$ = true; }
                               6064                 :                :             /*
                               6065                 :                :              * According to the standard, lack of a keyword here implies ROW.
                               6066                 :                :              * Support for that would require prohibiting ROW entirely here,
                               6067                 :                :              * reserving the keyword ROW, and/or requiring AS (instead of
                               6068                 :                :              * allowing it to be optional, as the standard specifies) as the
                               6069                 :                :              * next token.  Requiring ROW seems cleanest and easiest to
                               6070                 :                :              * explain.
                               6071                 :                :              */
 2433 peter_e@gmx.net          6072                 :UBC           0 :             | ROW                                   { $$ = false; }
                               6073                 :                :         ;
                               6074                 :                : 
                               6075                 :                : TransitionRelName:
 2718 kgrittn@postgresql.o     6076                 :CBC         281 :             ColId                                   { $$ = $1; }
                               6077                 :                :         ;
                               6078                 :                : 
                               6079                 :                : TriggerForSpec:
                               6080                 :                :             FOR TriggerForOptEach TriggerForType
                               6081                 :                :                 {
 9559 lockhart@fourpalms.o     6082                 :           1430 :                     $$ = $3;
                               6083                 :                :                 }
                               6084                 :                :             | /* EMPTY */
                               6085                 :                :                 {
                               6086                 :                :                     /*
                               6087                 :                :                      * If ROW/STATEMENT not specified, default to
                               6088                 :                :                      * STATEMENT, per SQL
                               6089                 :                :                      */
 2433 peter_e@gmx.net          6090                 :            114 :                     $$ = false;
                               6091                 :                :                 }
                               6092                 :                :         ;
                               6093                 :                : 
                               6094                 :                : TriggerForOptEach:
                               6095                 :                :             EACH
                               6096                 :                :             | /*EMPTY*/
                               6097                 :                :         ;
                               6098                 :                : 
                               6099                 :                : TriggerForType:
                               6100                 :           1030 :             ROW                                     { $$ = true; }
                               6101                 :            400 :             | STATEMENT                             { $$ = false; }
                               6102                 :                :         ;
                               6103                 :                : 
                               6104                 :                : TriggerWhen:
 5259 tgl@sss.pgh.pa.us        6105                 :             76 :             WHEN '(' a_expr ')'                     { $$ = $3; }
                               6106                 :           1495 :             | /*EMPTY*/                             { $$ = NULL; }
                               6107                 :                :         ;
                               6108                 :                : 
                               6109                 :                : FUNCTION_or_PROCEDURE:
                               6110                 :                :             FUNCTION
                               6111                 :                :         |   PROCEDURE
                               6112                 :                :         ;
                               6113                 :                : 
                               6114                 :                : TriggerFuncArgs:
 7259 neilc@samurai.com        6115                 :            299 :             TriggerFuncArg                          { $$ = list_make1($1); }
 7971 bruce@momjian.us         6116                 :            132 :             | TriggerFuncArgs ',' TriggerFuncArg    { $$ = lappend($1, $3); }
 7972                          6117                 :           1272 :             | /*EMPTY*/                             { $$ = NIL; }
                               6118                 :                :         ;
                               6119                 :                : 
                               6120                 :                : TriggerFuncArg:
                               6121                 :                :             Iconst
                               6122                 :                :                 {
  948 peter@eisentraut.org     6123                 :             51 :                     $$ = (Node *) makeString(psprintf("%d", $1));
                               6124                 :                :                 }
  948 peter@eisentraut.org     6125                 :UBC           0 :             | FCONST                                { $$ = (Node *) makeString($1); }
  948 peter@eisentraut.org     6126                 :CBC         360 :             | Sconst                                { $$ = (Node *) makeString($1); }
                               6127                 :             20 :             | ColLabel                              { $$ = (Node *) makeString($1); }
                               6128                 :                :         ;
                               6129                 :                : 
                               6130                 :                : OptConstrFromTable:
 7972 bruce@momjian.us         6131                 :              6 :             FROM qualified_name                     { $$ = $2; }
                               6132                 :             21 :             | /*EMPTY*/                             { $$ = NULL; }
                               6133                 :                :         ;
                               6134                 :                : 
                               6135                 :                : ConstraintAttributeSpec:
                               6136                 :                :             /*EMPTY*/
 4687 tgl@sss.pgh.pa.us        6137                 :           7068 :                 { $$ = 0; }
                               6138                 :                :             | ConstraintAttributeSpec ConstraintAttributeElem
                               6139                 :                :                 {
                               6140                 :                :                     /*
                               6141                 :                :                      * We must complain about conflicting options.
                               6142                 :                :                      * We could, but choose not to, complain about redundant
                               6143                 :                :                      * options (ie, where $2's bit is already set in $1).
                               6144                 :                :                      */
                               6145                 :            551 :                     int     newspec = $1 | $2;
                               6146                 :                : 
                               6147                 :                :                     /* special message for this case */
                               6148         [ +  + ]:            551 :                     if ((newspec & (CAS_NOT_DEFERRABLE | CAS_INITIALLY_DEFERRED)) == (CAS_NOT_DEFERRABLE | CAS_INITIALLY_DEFERRED))
 7575                          6149         [ +  - ]:              3 :                         ereport(ERROR,
                               6150                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               6151                 :                :                                  errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE"),
                               6152                 :                :                                  parser_errposition(@2)));
                               6153                 :                :                     /* generic message for other conflicts */
 4687                          6154         [ +  - ]:            548 :                     if ((newspec & (CAS_NOT_DEFERRABLE | CAS_DEFERRABLE)) == (CAS_NOT_DEFERRABLE | CAS_DEFERRABLE) ||
                               6155         [ -  + ]:            548 :                         (newspec & (CAS_INITIALLY_IMMEDIATE | CAS_INITIALLY_DEFERRED)) == (CAS_INITIALLY_IMMEDIATE | CAS_INITIALLY_DEFERRED))
 7575 tgl@sss.pgh.pa.us        6156         [ #  # ]:UBC           0 :                         ereport(ERROR,
                               6157                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               6158                 :                :                                  errmsg("conflicting constraint properties"),
                               6159                 :                :                                  parser_errposition(@2)));
 4687 tgl@sss.pgh.pa.us        6160                 :CBC         548 :                     $$ = newspec;
                               6161                 :                :                 }
                               6162                 :                :         ;
                               6163                 :                : 
                               6164                 :                : ConstraintAttributeElem:
                               6165                 :             18 :             NOT DEFERRABLE                  { $$ = CAS_NOT_DEFERRABLE; }
                               6166                 :            108 :             | DEFERRABLE                    { $$ = CAS_DEFERRABLE; }
                               6167                 :             15 :             | INITIALLY IMMEDIATE           { $$ = CAS_INITIALLY_IMMEDIATE; }
                               6168                 :             81 :             | INITIALLY DEFERRED            { $$ = CAS_INITIALLY_DEFERRED; }
                               6169                 :            258 :             | NOT VALID                     { $$ = CAS_NOT_VALID; }
 4282 alvherre@alvh.no-ip.     6170                 :             71 :             | NO INHERIT                    { $$ = CAS_NO_INHERIT; }
                               6171                 :                :         ;
                               6172                 :                : 
                               6173                 :                : 
                               6174                 :                : /*****************************************************************************
                               6175                 :                :  *
                               6176                 :                :  *      QUERIES :
                               6177                 :                :  *              CREATE EVENT TRIGGER ...
                               6178                 :                :  *              ALTER EVENT TRIGGER ...
                               6179                 :                :  *
                               6180                 :                :  *****************************************************************************/
                               6181                 :                : 
                               6182                 :                : CreateEventTrigStmt:
                               6183                 :                :             CREATE EVENT TRIGGER name ON ColLabel
                               6184                 :                :             EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'
                               6185                 :                :                 {
 4288 rhaas@postgresql.org     6186                 :             49 :                     CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt);
                               6187                 :                : 
                               6188                 :             49 :                     n->trigname = $4;
                               6189                 :             49 :                     n->eventname = $6;
                               6190                 :             49 :                     n->whenclause = NULL;
                               6191                 :             49 :                     n->funcname = $9;
  702 peter@eisentraut.org     6192                 :             49 :                     $$ = (Node *) n;
                               6193                 :                :                 }
                               6194                 :                :           | CREATE EVENT TRIGGER name ON ColLabel
                               6195                 :                :             WHEN event_trigger_when_list
                               6196                 :                :             EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'
                               6197                 :                :                 {
 4288 rhaas@postgresql.org     6198                 :             49 :                     CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt);
                               6199                 :                : 
                               6200                 :             49 :                     n->trigname = $4;
                               6201                 :             49 :                     n->eventname = $6;
                               6202                 :             49 :                     n->whenclause = $8;
                               6203                 :             49 :                     n->funcname = $11;
  702 peter@eisentraut.org     6204                 :             49 :                     $$ = (Node *) n;
                               6205                 :                :                 }
                               6206                 :                :         ;
                               6207                 :                : 
                               6208                 :                : event_trigger_when_list:
                               6209                 :                :           event_trigger_when_item
 4288 rhaas@postgresql.org     6210                 :             49 :             { $$ = list_make1($1); }
                               6211                 :                :         | event_trigger_when_list AND event_trigger_when_item
                               6212                 :              3 :             { $$ = lappend($1, $3); }
                               6213                 :                :         ;
                               6214                 :                : 
                               6215                 :                : event_trigger_when_item:
                               6216                 :                :         ColId IN_P '(' event_trigger_value_list ')'
 2777 peter_e@gmx.net          6217                 :             52 :             { $$ = makeDefElem($1, (Node *) $4, @1); }
                               6218                 :                :         ;
                               6219                 :                : 
                               6220                 :                : event_trigger_value_list:
                               6221                 :                :           SCONST
 4288 rhaas@postgresql.org     6222                 :             52 :             { $$ = list_make1(makeString($1)); }
                               6223                 :                :         | event_trigger_value_list ',' SCONST
                               6224                 :             33 :             { $$ = lappend($1, makeString($3)); }
                               6225                 :                :         ;
                               6226                 :                : 
                               6227                 :                : AlterEventTrigStmt:
                               6228                 :                :             ALTER EVENT TRIGGER name enable_trigger
                               6229                 :                :                 {
                               6230                 :             24 :                     AlterEventTrigStmt *n = makeNode(AlterEventTrigStmt);
                               6231                 :                : 
                               6232                 :             24 :                     n->trigname = $4;
                               6233                 :             24 :                     n->tgenabled = $5;
                               6234                 :             24 :                     $$ = (Node *) n;
                               6235                 :                :                 }
                               6236                 :                :         ;
                               6237                 :                : 
                               6238                 :                : enable_trigger:
                               6239                 :              3 :             ENABLE_P                    { $$ = TRIGGER_FIRES_ON_ORIGIN; }
                               6240                 :              3 :             | ENABLE_P REPLICA          { $$ = TRIGGER_FIRES_ON_REPLICA; }
                               6241                 :              8 :             | ENABLE_P ALWAYS           { $$ = TRIGGER_FIRES_ALWAYS; }
                               6242                 :             10 :             | DISABLE_P                 { $$ = TRIGGER_DISABLED; }
                               6243                 :                :         ;
                               6244                 :                : 
                               6245                 :                : /*****************************************************************************
                               6246                 :                :  *
                               6247                 :                :  *      QUERY :
                               6248                 :                :  *              CREATE ASSERTION ...
                               6249                 :                :  *
                               6250                 :                :  *****************************************************************************/
                               6251                 :                : 
                               6252                 :                : CreateAssertionStmt:
                               6253                 :                :             CREATE ASSERTION any_name CHECK '(' a_expr ')' ConstraintAttributeSpec
                               6254                 :                :                 {
 7575 tgl@sss.pgh.pa.us        6255         [ #  # ]:UBC           0 :                     ereport(ERROR,
                               6256                 :                :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               6257                 :                :                              errmsg("CREATE ASSERTION is not yet implemented")));
                               6258                 :                : 
                               6259                 :                :                     $$ = NULL;
                               6260                 :                :                 }
                               6261                 :                :         ;
                               6262                 :                : 
                               6263                 :                : 
                               6264                 :                : /*****************************************************************************
                               6265                 :                :  *
                               6266                 :                :  *      QUERY :
                               6267                 :                :  *              define (aggregate,operator,type)
                               6268                 :                :  *
                               6269                 :                :  *****************************************************************************/
                               6270                 :                : 
                               6271                 :                : DefineStmt:
                               6272                 :                :             CREATE opt_or_replace AGGREGATE func_name aggr_args definition
                               6273                 :                :                 {
 8773 lockhart@fourpalms.o     6274                 :CBC         271 :                     DefineStmt *n = makeNode(DefineStmt);
                               6275                 :                : 
 7597 peter_e@gmx.net          6276                 :            271 :                     n->kind = OBJECT_AGGREGATE;
 6574 tgl@sss.pgh.pa.us        6277                 :            271 :                     n->oldstyle = false;
 1853 rhodiumtoad@postgres     6278                 :            271 :                     n->replace = $2;
                               6279                 :            271 :                     n->defnames = $4;
                               6280                 :            271 :                     n->args = $5;
                               6281                 :            271 :                     n->definition = $6;
  702 peter@eisentraut.org     6282                 :            271 :                     $$ = (Node *) n;
                               6283                 :                :                 }
                               6284                 :                :             | CREATE opt_or_replace AGGREGATE func_name old_aggr_definition
                               6285                 :                :                 {
                               6286                 :                :                     /* old-style (pre-8.2) syntax for CREATE AGGREGATE */
 6574 tgl@sss.pgh.pa.us        6287                 :            181 :                     DefineStmt *n = makeNode(DefineStmt);
                               6288                 :                : 
                               6289                 :            181 :                     n->kind = OBJECT_AGGREGATE;
                               6290                 :            181 :                     n->oldstyle = true;
 1853 rhodiumtoad@postgres     6291                 :            181 :                     n->replace = $2;
                               6292                 :            181 :                     n->defnames = $4;
 6574 tgl@sss.pgh.pa.us        6293                 :            181 :                     n->args = NIL;
 1853 rhodiumtoad@postgres     6294                 :            181 :                     n->definition = $5;
  702 peter@eisentraut.org     6295                 :            181 :                     $$ = (Node *) n;
                               6296                 :                :                 }
                               6297                 :                :             | CREATE OPERATOR any_operator definition
                               6298                 :                :                 {
 8514 tgl@sss.pgh.pa.us        6299                 :            793 :                     DefineStmt *n = makeNode(DefineStmt);
                               6300                 :                : 
 7597 peter_e@gmx.net          6301                 :            793 :                     n->kind = OBJECT_OPERATOR;
 6574 tgl@sss.pgh.pa.us        6302                 :            793 :                     n->oldstyle = false;
 8034                          6303                 :            793 :                     n->defnames = $3;
 6574                          6304                 :            793 :                     n->args = NIL;
 8514                          6305                 :            793 :                     n->definition = $4;
  702 peter@eisentraut.org     6306                 :            793 :                     $$ = (Node *) n;
                               6307                 :                :                 }
                               6308                 :                :             | CREATE TYPE_P any_name definition
                               6309                 :                :                 {
 8514 tgl@sss.pgh.pa.us        6310                 :            104 :                     DefineStmt *n = makeNode(DefineStmt);
                               6311                 :                : 
 7597 peter_e@gmx.net          6312                 :            104 :                     n->kind = OBJECT_TYPE;
 6574 tgl@sss.pgh.pa.us        6313                 :            104 :                     n->oldstyle = false;
 8052                          6314                 :            104 :                     n->defnames = $3;
 6574                          6315                 :            104 :                     n->args = NIL;
 8773 lockhart@fourpalms.o     6316                 :            104 :                     n->definition = $4;
  702 peter@eisentraut.org     6317                 :            104 :                     $$ = (Node *) n;
                               6318                 :                :                 }
                               6319                 :                :             | CREATE TYPE_P any_name
                               6320                 :                :                 {
                               6321                 :                :                     /* Shell type (identified by lack of definition) */
 6620 tgl@sss.pgh.pa.us        6322                 :             77 :                     DefineStmt *n = makeNode(DefineStmt);
                               6323                 :                : 
                               6324                 :             77 :                     n->kind = OBJECT_TYPE;
 6574                          6325                 :             77 :                     n->oldstyle = false;
 6620                          6326                 :             77 :                     n->defnames = $3;
 6574                          6327                 :             77 :                     n->args = NIL;
 6620                          6328                 :             77 :                     n->definition = NIL;
  702 peter@eisentraut.org     6329                 :             77 :                     $$ = (Node *) n;
                               6330                 :                :                 }
                               6331                 :                :             | CREATE TYPE_P any_name AS '(' OptTableFuncElementList ')'
                               6332                 :                :                 {
 7913 bruce@momjian.us         6333                 :            346 :                     CompositeTypeStmt *n = makeNode(CompositeTypeStmt);
                               6334                 :                : 
                               6335                 :                :                     /* can't use qualified_name, sigh */
 4949 peter_e@gmx.net          6336                 :            346 :                     n->typevar = makeRangeVarFromAnyName($3, @3, yyscanner);
 7899 tgl@sss.pgh.pa.us        6337                 :            346 :                     n->coldeflist = $6;
  702 peter@eisentraut.org     6338                 :            346 :                     $$ = (Node *) n;
                               6339                 :                :                 }
                               6340                 :                :             | CREATE TYPE_P any_name AS ENUM_P '(' opt_enum_val_list ')'
                               6341                 :                :                 {
 6222 tgl@sss.pgh.pa.us        6342                 :             94 :                     CreateEnumStmt *n = makeNode(CreateEnumStmt);
                               6343                 :                : 
 5386 peter_e@gmx.net          6344                 :             94 :                     n->typeName = $3;
 6222 tgl@sss.pgh.pa.us        6345                 :             94 :                     n->vals = $7;
  702 peter@eisentraut.org     6346                 :             94 :                     $$ = (Node *) n;
                               6347                 :                :                 }
                               6348                 :                :             | CREATE TYPE_P any_name AS RANGE definition
                               6349                 :                :                 {
 4546 heikki.linnakangas@i     6350                 :             83 :                     CreateRangeStmt *n = makeNode(CreateRangeStmt);
                               6351                 :                : 
                               6352                 :             83 :                     n->typeName = $3;
 1005 peter@eisentraut.org     6353                 :             83 :                     n->params = $6;
  702                          6354                 :             83 :                     $$ = (Node *) n;
                               6355                 :                :                 }
                               6356                 :                :             | CREATE TEXT_P SEARCH PARSER any_name definition
                               6357                 :                :                 {
 6081 tgl@sss.pgh.pa.us        6358                 :             20 :                     DefineStmt *n = makeNode(DefineStmt);
                               6359                 :                : 
                               6360                 :             20 :                     n->kind = OBJECT_TSPARSER;
                               6361                 :             20 :                     n->args = NIL;
                               6362                 :             20 :                     n->defnames = $5;
                               6363                 :             20 :                     n->definition = $6;
  702 peter@eisentraut.org     6364                 :             20 :                     $$ = (Node *) n;
                               6365                 :                :                 }
                               6366                 :                :             | CREATE TEXT_P SEARCH DICTIONARY any_name definition
                               6367                 :                :                 {
 6081 tgl@sss.pgh.pa.us        6368                 :           1109 :                     DefineStmt *n = makeNode(DefineStmt);
                               6369                 :                : 
                               6370                 :           1109 :                     n->kind = OBJECT_TSDICTIONARY;
                               6371                 :           1109 :                     n->args = NIL;
                               6372                 :           1109 :                     n->defnames = $5;
                               6373                 :           1109 :                     n->definition = $6;
  702 peter@eisentraut.org     6374                 :           1109 :                     $$ = (Node *) n;
                               6375                 :                :                 }
                               6376                 :                :             | CREATE TEXT_P SEARCH TEMPLATE any_name definition
                               6377                 :                :                 {
 6081 tgl@sss.pgh.pa.us        6378                 :             59 :                     DefineStmt *n = makeNode(DefineStmt);
                               6379                 :                : 
                               6380                 :             59 :                     n->kind = OBJECT_TSTEMPLATE;
                               6381                 :             59 :                     n->args = NIL;
                               6382                 :             59 :                     n->defnames = $5;
                               6383                 :             59 :                     n->definition = $6;
  702 peter@eisentraut.org     6384                 :             59 :                     $$ = (Node *) n;
                               6385                 :                :                 }
                               6386                 :                :             | CREATE TEXT_P SEARCH CONFIGURATION any_name definition
                               6387                 :                :                 {
 6081 tgl@sss.pgh.pa.us        6388                 :           1080 :                     DefineStmt *n = makeNode(DefineStmt);
                               6389                 :                : 
                               6390                 :           1080 :                     n->kind = OBJECT_TSCONFIGURATION;
                               6391                 :           1080 :                     n->args = NIL;
                               6392                 :           1080 :                     n->defnames = $5;
                               6393                 :           1080 :                     n->definition = $6;
  702 peter@eisentraut.org     6394                 :           1080 :                     $$ = (Node *) n;
                               6395                 :                :                 }
                               6396                 :                :             | CREATE COLLATION any_name definition
                               6397                 :                :                 {
 4810 peter_e@gmx.net          6398                 :            136 :                     DefineStmt *n = makeNode(DefineStmt);
                               6399                 :                : 
                               6400                 :            136 :                     n->kind = OBJECT_COLLATION;
                               6401                 :            136 :                     n->args = NIL;
                               6402                 :            136 :                     n->defnames = $3;
                               6403                 :            136 :                     n->definition = $4;
  702 peter@eisentraut.org     6404                 :            136 :                     $$ = (Node *) n;
                               6405                 :                :                 }
                               6406                 :                :             | CREATE COLLATION IF_P NOT EXISTS any_name definition
                               6407                 :                :                 {
 2622 peter_e@gmx.net          6408                 :              9 :                     DefineStmt *n = makeNode(DefineStmt);
                               6409                 :                : 
                               6410                 :              9 :                     n->kind = OBJECT_COLLATION;
                               6411                 :              9 :                     n->args = NIL;
                               6412                 :              9 :                     n->defnames = $6;
                               6413                 :              9 :                     n->definition = $7;
                               6414                 :              9 :                     n->if_not_exists = true;
  702 peter@eisentraut.org     6415                 :              9 :                     $$ = (Node *) n;
                               6416                 :                :                 }
                               6417                 :                :             | CREATE COLLATION any_name FROM any_name
                               6418                 :                :                 {
 4810 peter_e@gmx.net          6419                 :             26 :                     DefineStmt *n = makeNode(DefineStmt);
                               6420                 :                : 
                               6421                 :             26 :                     n->kind = OBJECT_COLLATION;
                               6422                 :             26 :                     n->args = NIL;
                               6423                 :             26 :                     n->defnames = $3;
 2777                          6424                 :             26 :                     n->definition = list_make1(makeDefElem("from", (Node *) $5, @5));
  702 peter@eisentraut.org     6425                 :             26 :                     $$ = (Node *) n;
                               6426                 :                :                 }
                               6427                 :                :             | CREATE COLLATION IF_P NOT EXISTS any_name FROM any_name
                               6428                 :                :                 {
 2622 peter_e@gmx.net          6429                 :UBC           0 :                     DefineStmt *n = makeNode(DefineStmt);
                               6430                 :                : 
                               6431                 :              0 :                     n->kind = OBJECT_COLLATION;
                               6432                 :              0 :                     n->args = NIL;
                               6433                 :              0 :                     n->defnames = $6;
                               6434                 :              0 :                     n->definition = list_make1(makeDefElem("from", (Node *) $8, @8));
                               6435                 :              0 :                     n->if_not_exists = true;
  702 peter@eisentraut.org     6436                 :              0 :                     $$ = (Node *) n;
                               6437                 :                :                 }
                               6438                 :                :         ;
                               6439                 :                : 
 7972 bruce@momjian.us         6440                 :CBC        4107 : definition: '(' def_list ')'                        { $$ = $2; }
                               6441                 :                :         ;
                               6442                 :                : 
 4548 peter_e@gmx.net          6443                 :           4107 : def_list:   def_elem                                { $$ = list_make1($1); }
 7972 bruce@momjian.us         6444                 :           6713 :             | def_list ',' def_elem                 { $$ = lappend($1, $3); }
                               6445                 :                :         ;
                               6446                 :                : 
                               6447                 :                : def_elem:   ColLabel '=' def_arg
                               6448                 :                :                 {
 2777 peter_e@gmx.net          6449                 :          10658 :                     $$ = makeDefElem($1, (Node *) $3, @1);
                               6450                 :                :                 }
                               6451                 :                :             | ColLabel
                               6452                 :                :                 {
                               6453                 :            162 :                     $$ = makeDefElem($1, NULL, @1);
                               6454                 :                :                 }
                               6455                 :                :         ;
                               6456                 :                : 
                               6457                 :                : /* Note: any simple identifier will be returned as a type name! */
  702 peter@eisentraut.org     6458                 :           8763 : def_arg:    func_type                       { $$ = (Node *) $1; }
                               6459                 :           1620 :             | reserved_keyword              { $$ = (Node *) makeString(pstrdup($1)); }
                               6460                 :            587 :             | qual_all_Op                   { $$ = (Node *) $1; }
                               6461                 :            640 :             | NumericOnly                   { $$ = (Node *) $1; }
                               6462                 :            902 :             | Sconst                        { $$ = (Node *) makeString($1); }
                               6463                 :             65 :             | NONE                          { $$ = (Node *) makeString(pstrdup($1)); }
                               6464                 :                :         ;
                               6465                 :                : 
 6574 tgl@sss.pgh.pa.us        6466                 :            181 : old_aggr_definition: '(' old_aggr_list ')'          { $$ = $2; }
                               6467                 :                :         ;
                               6468                 :                : 
                               6469                 :            181 : old_aggr_list: old_aggr_elem                        { $$ = list_make1($1); }
                               6470                 :            646 :             | old_aggr_list ',' old_aggr_elem       { $$ = lappend($1, $3); }
                               6471                 :                :         ;
                               6472                 :                : 
                               6473                 :                : /*
                               6474                 :                :  * Must use IDENT here to avoid reduce/reduce conflicts; fortunately none of
                               6475                 :                :  * the item names needed in old aggregate definitions are likely to become
                               6476                 :                :  * SQL keywords.
                               6477                 :                :  */
                               6478                 :                : old_aggr_elem:  IDENT '=' def_arg
                               6479                 :                :                 {
  702 peter@eisentraut.org     6480                 :            827 :                     $$ = makeDefElem($1, (Node *) $3, @1);
                               6481                 :                :                 }
                               6482                 :                :         ;
                               6483                 :                : 
                               6484                 :                : opt_enum_val_list:
 5223 bruce@momjian.us         6485                 :             90 :         enum_val_list                           { $$ = $1; }
                               6486                 :              4 :         | /*EMPTY*/                             { $$ = NIL; }
                               6487                 :                :         ;
                               6488                 :                : 
                               6489                 :                : enum_val_list:  Sconst
 6222 tgl@sss.pgh.pa.us        6490                 :             90 :                 { $$ = list_make1(makeString($1)); }
                               6491                 :                :             | enum_val_list ',' Sconst
                               6492                 :           5197 :                 { $$ = lappend($1, makeString($3)); }
                               6493                 :                :         ;
                               6494                 :                : 
                               6495                 :                : /*****************************************************************************
                               6496                 :                :  *
                               6497                 :                :  *  ALTER TYPE enumtype ADD ...
                               6498                 :                :  *
                               6499                 :                :  *****************************************************************************/
                               6500                 :                : 
                               6501                 :                : AlterEnumStmt:
                               6502                 :                :         ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst
                               6503                 :                :             {
 4548 peter_e@gmx.net          6504                 :             77 :                 AlterEnumStmt *n = makeNode(AlterEnumStmt);
                               6505                 :                : 
                               6506                 :             77 :                 n->typeName = $3;
 2776 tgl@sss.pgh.pa.us        6507                 :             77 :                 n->oldVal = NULL;
 4222 andrew@dunslane.net      6508                 :             77 :                 n->newVal = $7;
 4548 peter_e@gmx.net          6509                 :             77 :                 n->newValNeighbor = NULL;
                               6510                 :             77 :                 n->newValIsAfter = true;
 2776 tgl@sss.pgh.pa.us        6511                 :             77 :                 n->skipIfNewValExists = $6;
 4548 peter_e@gmx.net          6512                 :             77 :                 $$ = (Node *) n;
                               6513                 :                :             }
                               6514                 :                :          | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst BEFORE Sconst
                               6515                 :                :             {
                               6516                 :             97 :                 AlterEnumStmt *n = makeNode(AlterEnumStmt);
                               6517                 :                : 
                               6518                 :             97 :                 n->typeName = $3;
 2776 tgl@sss.pgh.pa.us        6519                 :             97 :                 n->oldVal = NULL;
 4222 andrew@dunslane.net      6520                 :             97 :                 n->newVal = $7;
                               6521                 :             97 :                 n->newValNeighbor = $9;
 4548 peter_e@gmx.net          6522                 :             97 :                 n->newValIsAfter = false;
 2776 tgl@sss.pgh.pa.us        6523                 :             97 :                 n->skipIfNewValExists = $6;
 4548 peter_e@gmx.net          6524                 :             97 :                 $$ = (Node *) n;
                               6525                 :                :             }
                               6526                 :                :          | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst AFTER Sconst
                               6527                 :                :             {
                               6528                 :             11 :                 AlterEnumStmt *n = makeNode(AlterEnumStmt);
                               6529                 :                : 
                               6530                 :             11 :                 n->typeName = $3;
 2776 tgl@sss.pgh.pa.us        6531                 :             11 :                 n->oldVal = NULL;
 4222 andrew@dunslane.net      6532                 :             11 :                 n->newVal = $7;
                               6533                 :             11 :                 n->newValNeighbor = $9;
 4548 peter_e@gmx.net          6534                 :             11 :                 n->newValIsAfter = true;
 2776 tgl@sss.pgh.pa.us        6535                 :             11 :                 n->skipIfNewValExists = $6;
                               6536                 :             11 :                 $$ = (Node *) n;
                               6537                 :                :             }
                               6538                 :                :          | ALTER TYPE_P any_name RENAME VALUE_P Sconst TO Sconst
                               6539                 :                :             {
                               6540                 :             12 :                 AlterEnumStmt *n = makeNode(AlterEnumStmt);
                               6541                 :                : 
                               6542                 :             12 :                 n->typeName = $3;
                               6543                 :             12 :                 n->oldVal = $6;
                               6544                 :             12 :                 n->newVal = $8;
                               6545                 :             12 :                 n->newValNeighbor = NULL;
                               6546                 :             12 :                 n->newValIsAfter = false;
                               6547                 :             12 :                 n->skipIfNewValExists = false;
 4548 peter_e@gmx.net          6548                 :             12 :                 $$ = (Node *) n;
                               6549                 :                :             }
                               6550                 :                :          | ALTER TYPE_P any_name DROP VALUE_P Sconst
                               6551                 :                :             {
                               6552                 :                :                 /*
                               6553                 :                :                  * The following problems must be solved before this can be
                               6554                 :                :                  * implemented:
                               6555                 :                :                  *
                               6556                 :                :                  * - There must be no instance of the target value in
                               6557                 :                :                  *   any table.
                               6558                 :                :                  *
                               6559                 :                :                  * - The value must not appear in any catalog metadata,
                               6560                 :                :                  *   such as stored view expressions or column defaults.
                               6561                 :                :                  *
                               6562                 :                :                  * - The value must not appear in any non-leaf page of a
                               6563                 :                :                  *   btree (and similar issues with other index types).
                               6564                 :                :                  *   This is problematic because a value could persist
                               6565                 :                :                  *   there long after it's gone from user-visible data.
                               6566                 :                :                  *
                               6567                 :                :                  * - Concurrent sessions must not be able to insert the
                               6568                 :                :                  *   value while the preceding conditions are being checked.
                               6569                 :                :                  *
                               6570                 :                :                  * - Possibly more...
                               6571                 :                :                  */
  194 tgl@sss.pgh.pa.us        6572         [ #  # ]:UNC           0 :                 ereport(ERROR,
                               6573                 :                :                         (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               6574                 :                :                          errmsg("dropping an enum value is not implemented"),
                               6575                 :                :                          parser_errposition(@4)));
                               6576                 :                :             }
                               6577                 :                :          ;
                               6578                 :                : 
 4222 andrew@dunslane.net      6579                 :CBC           6 : opt_if_not_exists: IF_P NOT EXISTS              { $$ = true; }
 1245 peter@eisentraut.org     6580                 :            179 :         | /* EMPTY */                          { $$ = false; }
                               6581                 :                :         ;
                               6582                 :                : 
                               6583                 :                : 
                               6584                 :                : /*****************************************************************************
                               6585                 :                :  *
                               6586                 :                :  *      QUERIES :
                               6587                 :                :  *              CREATE OPERATOR CLASS ...
                               6588                 :                :  *              CREATE OPERATOR FAMILY ...
                               6589                 :                :  *              ALTER OPERATOR FAMILY ...
                               6590                 :                :  *              DROP OPERATOR CLASS ...
                               6591                 :                :  *              DROP OPERATOR FAMILY ...
                               6592                 :                :  *
                               6593                 :                :  *****************************************************************************/
                               6594                 :                : 
                               6595                 :                : CreateOpClassStmt:
                               6596                 :                :             CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
                               6597                 :                :             USING name opt_opfamily AS opclass_item_list
                               6598                 :                :                 {
 7930 tgl@sss.pgh.pa.us        6599                 :            191 :                     CreateOpClassStmt *n = makeNode(CreateOpClassStmt);
                               6600                 :                : 
                               6601                 :            191 :                     n->opclassname = $4;
                               6602                 :            191 :                     n->isDefault = $5;
                               6603                 :            191 :                     n->datatype = $8;
                               6604                 :            191 :                     n->amname = $10;
 6291                          6605                 :            191 :                     n->opfamilyname = $11;
                               6606                 :            191 :                     n->items = $13;
 7930                          6607                 :            191 :                     $$ = (Node *) n;
                               6608                 :                :                 }
                               6609                 :                :         ;
                               6610                 :                : 
                               6611                 :                : opclass_item_list:
 7259 neilc@samurai.com        6612                 :            410 :             opclass_item                            { $$ = list_make1($1); }
 7930 tgl@sss.pgh.pa.us        6613                 :           1529 :             | opclass_item_list ',' opclass_item    { $$ = lappend($1, $3); }
                               6614                 :                :         ;
                               6615                 :                : 
                               6616                 :                : opclass_item:
                               6617                 :                :             OPERATOR Iconst any_operator opclass_purpose opt_recheck
                               6618                 :                :                 {
                               6619                 :            546 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
 2664 peter_e@gmx.net          6620                 :            546 :                     ObjectWithArgs *owa = makeNode(ObjectWithArgs);
                               6621                 :                : 
                               6622                 :            546 :                     owa->objname = $3;
                               6623                 :            546 :                     owa->objargs = NIL;
 7930 tgl@sss.pgh.pa.us        6624                 :            546 :                     n->itemtype = OPCLASS_ITEM_OPERATOR;
 2664 peter_e@gmx.net          6625                 :            546 :                     n->name = owa;
 7930 tgl@sss.pgh.pa.us        6626                 :            546 :                     n->number = $2;
 4890                          6627                 :            546 :                     n->order_family = $4;
 7930                          6628                 :            546 :                     $$ = (Node *) n;
                               6629                 :                :                 }
                               6630                 :                :             | OPERATOR Iconst operator_with_argtypes opclass_purpose
                               6631                 :                :               opt_recheck
                               6632                 :                :                 {
                               6633                 :            513 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
                               6634                 :                : 
                               6635                 :            513 :                     n->itemtype = OPCLASS_ITEM_OPERATOR;
 2664 peter_e@gmx.net          6636                 :            513 :                     n->name = $3;
 7930 tgl@sss.pgh.pa.us        6637                 :            513 :                     n->number = $2;
 2664 peter_e@gmx.net          6638                 :            513 :                     n->order_family = $4;
 7930 tgl@sss.pgh.pa.us        6639                 :            513 :                     $$ = (Node *) n;
                               6640                 :                :                 }
                               6641                 :                :             | FUNCTION Iconst function_with_argtypes
                               6642                 :                :                 {
                               6643                 :            687 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
                               6644                 :                : 
                               6645                 :            687 :                     n->itemtype = OPCLASS_ITEM_FUNCTION;
 2664 peter_e@gmx.net          6646                 :            687 :                     n->name = $3;
 7930 tgl@sss.pgh.pa.us        6647                 :            687 :                     n->number = $2;
                               6648                 :            687 :                     $$ = (Node *) n;
                               6649                 :                :                 }
                               6650                 :                :             | FUNCTION Iconst '(' type_list ')' function_with_argtypes
                               6651                 :                :                 {
 6291                          6652                 :             94 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
                               6653                 :                : 
                               6654                 :             94 :                     n->itemtype = OPCLASS_ITEM_FUNCTION;
 2664 peter_e@gmx.net          6655                 :             94 :                     n->name = $6;
 6291 tgl@sss.pgh.pa.us        6656                 :             94 :                     n->number = $2;
                               6657                 :             94 :                     n->class_args = $4;
                               6658                 :             94 :                     $$ = (Node *) n;
                               6659                 :                :                 }
                               6660                 :                :             | STORAGE Typename
                               6661                 :                :                 {
 7930                          6662                 :             99 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
                               6663                 :                : 
                               6664                 :             99 :                     n->itemtype = OPCLASS_ITEM_STORAGETYPE;
                               6665                 :             99 :                     n->storedtype = $2;
                               6666                 :             99 :                     $$ = (Node *) n;
                               6667                 :                :                 }
                               6668                 :                :         ;
                               6669                 :                : 
 2433 peter_e@gmx.net          6670                 :            145 : opt_default:    DEFAULT                     { $$ = true; }
                               6671                 :             78 :             | /*EMPTY*/                     { $$ = false; }
                               6672                 :                :         ;
                               6673                 :                : 
 6291 tgl@sss.pgh.pa.us        6674                 :             22 : opt_opfamily:   FAMILY any_name             { $$ = $2; }
                               6675                 :            169 :             | /*EMPTY*/                     { $$ = NIL; }
                               6676                 :                :         ;
                               6677                 :                : 
 4890 tgl@sss.pgh.pa.us        6678                 :UBC           0 : opclass_purpose: FOR SEARCH                 { $$ = NIL; }
 4890 tgl@sss.pgh.pa.us        6679                 :CBC          36 :             | FOR ORDER BY any_name         { $$ = $4; }
                               6680                 :           1023 :             | /*EMPTY*/                     { $$ = NIL; }
                               6681                 :                :         ;
                               6682                 :                : 
                               6683                 :                : opt_recheck:    RECHECK
                               6684                 :                :                 {
                               6685                 :                :                     /*
                               6686                 :                :                      * RECHECK no longer does anything in opclass definitions,
                               6687                 :                :                      * but we still accept it to ease porting of old database
                               6688                 :                :                      * dumps.
                               6689                 :                :                      */
 5436 tgl@sss.pgh.pa.us        6690         [ #  # ]:UBC           0 :                     ereport(NOTICE,
                               6691                 :                :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               6692                 :                :                              errmsg("RECHECK is no longer required"),
                               6693                 :                :                              errhint("Update your data type."),
                               6694                 :                :                              parser_errposition(@1)));
 2433 peter_e@gmx.net          6695                 :              0 :                     $$ = true;
                               6696                 :                :                 }
 2433 peter_e@gmx.net          6697                 :CBC        1059 :             | /*EMPTY*/                     { $$ = false; }
                               6698                 :                :         ;
                               6699                 :                : 
                               6700                 :                : 
                               6701                 :                : CreateOpFamilyStmt:
                               6702                 :                :             CREATE OPERATOR FAMILY any_name USING name
                               6703                 :                :                 {
 6291 tgl@sss.pgh.pa.us        6704                 :             74 :                     CreateOpFamilyStmt *n = makeNode(CreateOpFamilyStmt);
                               6705                 :                : 
                               6706                 :             74 :                     n->opfamilyname = $4;
                               6707                 :             74 :                     n->amname = $6;
                               6708                 :             74 :                     $$ = (Node *) n;
                               6709                 :                :                 }
                               6710                 :                :         ;
                               6711                 :                : 
                               6712                 :                : AlterOpFamilyStmt:
                               6713                 :                :             ALTER OPERATOR FAMILY any_name USING name ADD_P opclass_item_list
                               6714                 :                :                 {
                               6715                 :            219 :                     AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
                               6716                 :                : 
                               6717                 :            219 :                     n->opfamilyname = $4;
                               6718                 :            219 :                     n->amname = $6;
                               6719                 :            219 :                     n->isDrop = false;
                               6720                 :            219 :                     n->items = $8;
                               6721                 :            219 :                     $$ = (Node *) n;
                               6722                 :                :                 }
                               6723                 :                :             | ALTER OPERATOR FAMILY any_name USING name DROP opclass_drop_list
                               6724                 :                :                 {
                               6725                 :             32 :                     AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
                               6726                 :                : 
                               6727                 :             32 :                     n->opfamilyname = $4;
                               6728                 :             32 :                     n->amname = $6;
                               6729                 :             32 :                     n->isDrop = true;
                               6730                 :             32 :                     n->items = $8;
                               6731                 :             32 :                     $$ = (Node *) n;
                               6732                 :                :                 }
                               6733                 :                :         ;
                               6734                 :                : 
                               6735                 :                : opclass_drop_list:
                               6736                 :             32 :             opclass_drop                            { $$ = list_make1($1); }
                               6737                 :             15 :             | opclass_drop_list ',' opclass_drop    { $$ = lappend($1, $3); }
                               6738                 :                :         ;
                               6739                 :                : 
                               6740                 :                : opclass_drop:
                               6741                 :                :             OPERATOR Iconst '(' type_list ')'
                               6742                 :                :                 {
                               6743                 :             28 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
                               6744                 :                : 
                               6745                 :             28 :                     n->itemtype = OPCLASS_ITEM_OPERATOR;
                               6746                 :             28 :                     n->number = $2;
 2664 peter_e@gmx.net          6747                 :             28 :                     n->class_args = $4;
 6291 tgl@sss.pgh.pa.us        6748                 :             28 :                     $$ = (Node *) n;
                               6749                 :                :                 }
                               6750                 :                :             | FUNCTION Iconst '(' type_list ')'
                               6751                 :                :                 {
                               6752                 :             19 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
                               6753                 :                : 
                               6754                 :             19 :                     n->itemtype = OPCLASS_ITEM_FUNCTION;
                               6755                 :             19 :                     n->number = $2;
 2664 peter_e@gmx.net          6756                 :             19 :                     n->class_args = $4;
 6291 tgl@sss.pgh.pa.us        6757                 :             19 :                     $$ = (Node *) n;
                               6758                 :                :                 }
                               6759                 :                :         ;
                               6760                 :                : 
                               6761                 :                : 
                               6762                 :                : DropOpClassStmt:
                               6763                 :                :             DROP OPERATOR CLASS any_name USING name opt_drop_behavior
                               6764                 :                :                 {
 4532 rhaas@postgresql.org     6765                 :             19 :                     DropStmt *n = makeNode(DropStmt);
                               6766                 :                : 
 3317 alvherre@alvh.no-ip.     6767                 :             19 :                     n->objects = list_make1(lcons(makeString($6), $4));
 4532 rhaas@postgresql.org     6768                 :             19 :                     n->removeType = OBJECT_OPCLASS;
 7930 tgl@sss.pgh.pa.us        6769                 :             19 :                     n->behavior = $7;
 6512 andrew@dunslane.net      6770                 :             19 :                     n->missing_ok = false;
 4391 simon@2ndQuadrant.co     6771                 :             19 :                     n->concurrent = false;
 6512 andrew@dunslane.net      6772                 :             19 :                     $$ = (Node *) n;
                               6773                 :                :                 }
                               6774                 :                :             | DROP OPERATOR CLASS IF_P EXISTS any_name USING name opt_drop_behavior
                               6775                 :                :                 {
 4532 rhaas@postgresql.org     6776                 :              9 :                     DropStmt *n = makeNode(DropStmt);
                               6777                 :                : 
 3317 alvherre@alvh.no-ip.     6778                 :              9 :                     n->objects = list_make1(lcons(makeString($8), $6));
 4532 rhaas@postgresql.org     6779                 :              9 :                     n->removeType = OBJECT_OPCLASS;
 6512 andrew@dunslane.net      6780                 :              9 :                     n->behavior = $9;
                               6781                 :              9 :                     n->missing_ok = true;
 4391 simon@2ndQuadrant.co     6782                 :              9 :                     n->concurrent = false;
 7930 tgl@sss.pgh.pa.us        6783                 :              9 :                     $$ = (Node *) n;
                               6784                 :                :                 }
                               6785                 :                :         ;
                               6786                 :                : 
                               6787                 :                : DropOpFamilyStmt:
                               6788                 :                :             DROP OPERATOR FAMILY any_name USING name opt_drop_behavior
                               6789                 :                :                 {
 4532 rhaas@postgresql.org     6790                 :             55 :                     DropStmt *n = makeNode(DropStmt);
                               6791                 :                : 
 3317 alvherre@alvh.no-ip.     6792                 :             55 :                     n->objects = list_make1(lcons(makeString($6), $4));
 4532 rhaas@postgresql.org     6793                 :             55 :                     n->removeType = OBJECT_OPFAMILY;
 6291 tgl@sss.pgh.pa.us        6794                 :             55 :                     n->behavior = $7;
                               6795                 :             55 :                     n->missing_ok = false;
 4391 simon@2ndQuadrant.co     6796                 :             55 :                     n->concurrent = false;
 6291 tgl@sss.pgh.pa.us        6797                 :             55 :                     $$ = (Node *) n;
                               6798                 :                :                 }
                               6799                 :                :             | DROP OPERATOR FAMILY IF_P EXISTS any_name USING name opt_drop_behavior
                               6800                 :                :                 {
 4532 rhaas@postgresql.org     6801                 :              9 :                     DropStmt *n = makeNode(DropStmt);
                               6802                 :                : 
 3317 alvherre@alvh.no-ip.     6803                 :              9 :                     n->objects = list_make1(lcons(makeString($8), $6));
 4532 rhaas@postgresql.org     6804                 :              9 :                     n->removeType = OBJECT_OPFAMILY;
 6291 tgl@sss.pgh.pa.us        6805                 :              9 :                     n->behavior = $9;
                               6806                 :              9 :                     n->missing_ok = true;
 4391 simon@2ndQuadrant.co     6807                 :              9 :                     n->concurrent = false;
 6291 tgl@sss.pgh.pa.us        6808                 :              9 :                     $$ = (Node *) n;
                               6809                 :                :                 }
                               6810                 :                :         ;
                               6811                 :                : 
                               6812                 :                : 
                               6813                 :                : /*****************************************************************************
                               6814                 :                :  *
                               6815                 :                :  *      QUERY:
                               6816                 :                :  *
                               6817                 :                :  *      DROP OWNED BY username [, username ...] [ RESTRICT | CASCADE ]
                               6818                 :                :  *      REASSIGN OWNED BY username [, username ...] TO username
                               6819                 :                :  *
                               6820                 :                :  *****************************************************************************/
                               6821                 :                : DropOwnedStmt:
                               6822                 :                :             DROP OWNED BY role_list opt_drop_behavior
                               6823                 :                :                 {
 6719 alvherre@alvh.no-ip.     6824                 :             73 :                     DropOwnedStmt *n = makeNode(DropOwnedStmt);
                               6825                 :                : 
                               6826                 :             73 :                     n->roles = $4;
                               6827                 :             73 :                     n->behavior = $5;
  702 peter@eisentraut.org     6828                 :             73 :                     $$ = (Node *) n;
                               6829                 :                :                 }
                               6830                 :                :         ;
                               6831                 :                : 
                               6832                 :                : ReassignOwnedStmt:
                               6833                 :                :             REASSIGN OWNED BY role_list TO RoleSpec
                               6834                 :                :                 {
 6719 alvherre@alvh.no-ip.     6835                 :             19 :                     ReassignOwnedStmt *n = makeNode(ReassignOwnedStmt);
                               6836                 :                : 
                               6837                 :             19 :                     n->roles = $4;
                               6838                 :             19 :                     n->newrole = $6;
  702 peter@eisentraut.org     6839                 :             19 :                     $$ = (Node *) n;
                               6840                 :                :                 }
                               6841                 :                :         ;
                               6842                 :                : 
                               6843                 :                : /*****************************************************************************
                               6844                 :                :  *
                               6845                 :                :  *      QUERY:
                               6846                 :                :  *
                               6847                 :                :  *      DROP itemtype [ IF EXISTS ] itemname [, itemname ...]
                               6848                 :                :  *           [ RESTRICT | CASCADE ]
                               6849                 :                :  *
                               6850                 :                :  *****************************************************************************/
                               6851                 :                : 
                               6852                 :                : DropStmt:   DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior
                               6853                 :                :                 {
 8579 bruce@momjian.us         6854                 :            631 :                     DropStmt *n = makeNode(DropStmt);
                               6855                 :                : 
 8575 tgl@sss.pgh.pa.us        6856                 :            631 :                     n->removeType = $2;
 2433 peter_e@gmx.net          6857                 :            631 :                     n->missing_ok = true;
 6721 andrew@dunslane.net      6858                 :            631 :                     n->objects = $5;
                               6859                 :            631 :                     n->behavior = $6;
 4391 simon@2ndQuadrant.co     6860                 :            631 :                     n->concurrent = false;
  702 peter@eisentraut.org     6861                 :            631 :                     $$ = (Node *) n;
                               6862                 :                :                 }
                               6863                 :                :             | DROP object_type_any_name any_name_list opt_drop_behavior
                               6864                 :                :                 {
 2710 peter_e@gmx.net          6865                 :           7534 :                     DropStmt *n = makeNode(DropStmt);
                               6866                 :                : 
                               6867                 :           7534 :                     n->removeType = $2;
 2433                          6868                 :           7534 :                     n->missing_ok = false;
 2710                          6869                 :           7534 :                     n->objects = $3;
                               6870                 :           7534 :                     n->behavior = $4;
                               6871                 :           7534 :                     n->concurrent = false;
  702 peter@eisentraut.org     6872                 :           7534 :                     $$ = (Node *) n;
                               6873                 :                :                 }
                               6874                 :                :             | DROP drop_type_name IF_P EXISTS name_list opt_drop_behavior
                               6875                 :                :                 {
 2710 peter_e@gmx.net          6876                 :             39 :                     DropStmt *n = makeNode(DropStmt);
                               6877                 :                : 
                               6878                 :             39 :                     n->removeType = $2;
 2433                          6879                 :             39 :                     n->missing_ok = true;
 2710                          6880                 :             39 :                     n->objects = $5;
                               6881                 :             39 :                     n->behavior = $6;
                               6882                 :             39 :                     n->concurrent = false;
  702 peter@eisentraut.org     6883                 :             39 :                     $$ = (Node *) n;
                               6884                 :                :                 }
                               6885                 :                :             | DROP drop_type_name name_list opt_drop_behavior
                               6886                 :                :                 {
 6721 andrew@dunslane.net      6887                 :            621 :                     DropStmt *n = makeNode(DropStmt);
                               6888                 :                : 
                               6889                 :            621 :                     n->removeType = $2;
 2433 peter_e@gmx.net          6890                 :            621 :                     n->missing_ok = false;
 8060 tgl@sss.pgh.pa.us        6891                 :            621 :                     n->objects = $3;
 8062 bruce@momjian.us         6892                 :            621 :                     n->behavior = $4;
 4391 simon@2ndQuadrant.co     6893                 :            621 :                     n->concurrent = false;
  702 peter@eisentraut.org     6894                 :            621 :                     $$ = (Node *) n;
                               6895                 :                :                 }
                               6896                 :                :             | DROP object_type_name_on_any_name name ON any_name opt_drop_behavior
                               6897                 :                :                 {
 2609 peter_e@gmx.net          6898                 :            536 :                     DropStmt *n = makeNode(DropStmt);
                               6899                 :                : 
                               6900                 :            536 :                     n->removeType = $2;
                               6901                 :            536 :                     n->objects = list_make1(lappend($5, makeString($3)));
                               6902                 :            536 :                     n->behavior = $6;
                               6903                 :            536 :                     n->missing_ok = false;
                               6904                 :            536 :                     n->concurrent = false;
                               6905                 :            536 :                     $$ = (Node *) n;
                               6906                 :                :                 }
                               6907                 :                :             | DROP object_type_name_on_any_name IF_P EXISTS name ON any_name opt_drop_behavior
                               6908                 :                :                 {
                               6909                 :             24 :                     DropStmt *n = makeNode(DropStmt);
                               6910                 :                : 
                               6911                 :             24 :                     n->removeType = $2;
                               6912                 :             24 :                     n->objects = list_make1(lappend($7, makeString($5)));
                               6913                 :             24 :                     n->behavior = $8;
                               6914                 :             24 :                     n->missing_ok = true;
                               6915                 :             24 :                     n->concurrent = false;
                               6916                 :             24 :                     $$ = (Node *) n;
                               6917                 :                :                 }
                               6918                 :                :             | DROP TYPE_P type_name_list opt_drop_behavior
                               6919                 :                :                 {
 3393 alvherre@alvh.no-ip.     6920                 :            265 :                     DropStmt *n = makeNode(DropStmt);
                               6921                 :                : 
                               6922                 :            265 :                     n->removeType = OBJECT_TYPE;
 2433 peter_e@gmx.net          6923                 :            265 :                     n->missing_ok = false;
 3393 alvherre@alvh.no-ip.     6924                 :            265 :                     n->objects = $3;
                               6925                 :            265 :                     n->behavior = $4;
                               6926                 :            265 :                     n->concurrent = false;
                               6927                 :            265 :                     $$ = (Node *) n;
                               6928                 :                :                 }
                               6929                 :                :             | DROP TYPE_P IF_P EXISTS type_name_list opt_drop_behavior
                               6930                 :                :                 {
                               6931                 :             11 :                     DropStmt *n = makeNode(DropStmt);
                               6932                 :                : 
                               6933                 :             11 :                     n->removeType = OBJECT_TYPE;
 2433 peter_e@gmx.net          6934                 :             11 :                     n->missing_ok = true;
 3393 alvherre@alvh.no-ip.     6935                 :             11 :                     n->objects = $5;
                               6936                 :             11 :                     n->behavior = $6;
                               6937                 :             11 :                     n->concurrent = false;
                               6938                 :             11 :                     $$ = (Node *) n;
                               6939                 :                :                 }
                               6940                 :                :             | DROP DOMAIN_P type_name_list opt_drop_behavior
                               6941                 :                :                 {
                               6942                 :            202 :                     DropStmt *n = makeNode(DropStmt);
                               6943                 :                : 
                               6944                 :            202 :                     n->removeType = OBJECT_DOMAIN;
 2433 peter_e@gmx.net          6945                 :            202 :                     n->missing_ok = false;
 3393 alvherre@alvh.no-ip.     6946                 :            202 :                     n->objects = $3;
                               6947                 :            202 :                     n->behavior = $4;
                               6948                 :            202 :                     n->concurrent = false;
                               6949                 :            202 :                     $$ = (Node *) n;
                               6950                 :                :                 }
                               6951                 :                :             | DROP DOMAIN_P IF_P EXISTS type_name_list opt_drop_behavior
                               6952                 :                :                 {
                               6953                 :              9 :                     DropStmt *n = makeNode(DropStmt);
                               6954                 :                : 
                               6955                 :              9 :                     n->removeType = OBJECT_DOMAIN;
 2433 peter_e@gmx.net          6956                 :              9 :                     n->missing_ok = true;
 3393 alvherre@alvh.no-ip.     6957                 :              9 :                     n->objects = $5;
                               6958                 :              9 :                     n->behavior = $6;
                               6959                 :              9 :                     n->concurrent = false;
                               6960                 :              9 :                     $$ = (Node *) n;
                               6961                 :                :                 }
                               6962                 :                :             | DROP INDEX CONCURRENTLY any_name_list opt_drop_behavior
                               6963                 :                :                 {
 4391 simon@2ndQuadrant.co     6964                 :             67 :                     DropStmt *n = makeNode(DropStmt);
                               6965                 :                : 
                               6966                 :             67 :                     n->removeType = OBJECT_INDEX;
 2433 peter_e@gmx.net          6967                 :             67 :                     n->missing_ok = false;
 4391 simon@2ndQuadrant.co     6968                 :             67 :                     n->objects = $4;
                               6969                 :             67 :                     n->behavior = $5;
                               6970                 :             67 :                     n->concurrent = true;
  702 peter@eisentraut.org     6971                 :             67 :                     $$ = (Node *) n;
                               6972                 :                :                 }
                               6973                 :                :             | DROP INDEX CONCURRENTLY IF_P EXISTS any_name_list opt_drop_behavior
                               6974                 :                :                 {
 4391 simon@2ndQuadrant.co     6975                 :              6 :                     DropStmt *n = makeNode(DropStmt);
                               6976                 :                : 
                               6977                 :              6 :                     n->removeType = OBJECT_INDEX;
 2433 peter_e@gmx.net          6978                 :              6 :                     n->missing_ok = true;
 4391 simon@2ndQuadrant.co     6979                 :              6 :                     n->objects = $6;
                               6980                 :              6 :                     n->behavior = $7;
                               6981                 :              6 :                     n->concurrent = true;
  702 peter@eisentraut.org     6982                 :              6 :                     $$ = (Node *) n;
                               6983                 :                :                 }
                               6984                 :                :         ;
                               6985                 :                : 
                               6986                 :                : /* object types taking any_name/any_name_list */
                               6987                 :                : object_type_any_name:
 2710 peter_e@gmx.net          6988                 :           7040 :             TABLE                                   { $$ = OBJECT_TABLE; }
 7597                          6989                 :             97 :             | SEQUENCE                              { $$ = OBJECT_SEQUENCE; }
                               6990                 :            468 :             | VIEW                                  { $$ = OBJECT_VIEW; }
 4060 kgrittn@postgresql.o     6991                 :             62 :             | MATERIALIZED VIEW                     { $$ = OBJECT_MATVIEW; }
 7597 peter_e@gmx.net          6992                 :            371 :             | INDEX                                 { $$ = OBJECT_INDEX; }
 4852 rhaas@postgresql.org     6993                 :             85 :             | FOREIGN TABLE                         { $$ = OBJECT_FOREIGN_TABLE; }
 4810 peter_e@gmx.net          6994                 :             45 :             | COLLATION                             { $$ = OBJECT_COLLATION; }
 7597                          6995                 :             28 :             | CONVERSION_P                          { $$ = OBJECT_CONVERSION; }
 2578 alvherre@alvh.no-ip.     6996                 :             96 :             | STATISTICS                            { $$ = OBJECT_STATISTIC_EXT; }
 6081 tgl@sss.pgh.pa.us        6997                 :             10 :             | TEXT_P SEARCH PARSER                  { $$ = OBJECT_TSPARSER; }
                               6998                 :           1051 :             | TEXT_P SEARCH DICTIONARY              { $$ = OBJECT_TSDICTIONARY; }
                               6999                 :             47 :             | TEXT_P SEARCH TEMPLATE                { $$ = OBJECT_TSTEMPLATE; }
                               7000                 :           1053 :             | TEXT_P SEARCH CONFIGURATION           { $$ = OBJECT_TSCONFIGURATION; }
                               7001                 :                :         ;
                               7002                 :                : 
                               7003                 :                : /*
                               7004                 :                :  * object types taking name/name_list
                               7005                 :                :  *
                               7006                 :                :  * DROP handles some of them separately
                               7007                 :                :  */
                               7008                 :                : 
                               7009                 :                : object_type_name:
 1401 peter@eisentraut.org     7010                 :             91 :             drop_type_name                          { $$ = $1; }
                               7011                 :             87 :             | DATABASE                              { $$ = OBJECT_DATABASE; }
                               7012                 :             26 :             | ROLE                                  { $$ = OBJECT_ROLE; }
                               7013                 :              5 :             | SUBSCRIPTION                          { $$ = OBJECT_SUBSCRIPTION; }
 1401 peter@eisentraut.org     7014                 :UBC           0 :             | TABLESPACE                            { $$ = OBJECT_TABLESPACE; }
                               7015                 :                :         ;
                               7016                 :                : 
                               7017                 :                : drop_type_name:
 2710 peter_e@gmx.net          7018                 :CBC          23 :             ACCESS METHOD                           { $$ = OBJECT_ACCESS_METHOD; }
                               7019                 :             63 :             | EVENT TRIGGER                         { $$ = OBJECT_EVENT_TRIGGER; }
                               7020                 :             55 :             | EXTENSION                             { $$ = OBJECT_EXTENSION; }
 2609                          7021                 :             74 :             | FOREIGN DATA_P WRAPPER                { $$ = OBJECT_FDW; }
 1403 peter@eisentraut.org     7022                 :             66 :             | opt_procedural LANGUAGE               { $$ = OBJECT_LANGUAGE; }
 2642 peter_e@gmx.net          7023                 :            141 :             | PUBLICATION                           { $$ = OBJECT_PUBLICATION; }
 2710                          7024                 :            264 :             | SCHEMA                                { $$ = OBJECT_SCHEMA; }
 2609                          7025                 :             65 :             | SERVER                                { $$ = OBJECT_FOREIGN_SERVER; }
                               7026                 :                :         ;
                               7027                 :                : 
                               7028                 :                : /* object types attached to a table */
                               7029                 :                : object_type_name_on_any_name:
                               7030                 :             82 :             POLICY                                  { $$ = OBJECT_POLICY; }
                               7031                 :            125 :             | RULE                                  { $$ = OBJECT_RULE; }
                               7032                 :            379 :             | TRIGGER                               { $$ = OBJECT_TRIGGER; }
                               7033                 :                :         ;
                               7034                 :                : 
                               7035                 :                : any_name_list:
 7259 neilc@samurai.com        7036                 :          11510 :             any_name                                { $$ = list_make1($1); }
 7972 bruce@momjian.us         7037                 :           1868 :             | any_name_list ',' any_name            { $$ = lappend($1, $3); }
                               7038                 :                :         ;
                               7039                 :                : 
 7259 neilc@samurai.com        7040                 :          26195 : any_name:   ColId                       { $$ = list_make1(makeString($1)); }
 7249 tgl@sss.pgh.pa.us        7041                 :           4151 :             | ColId attrs               { $$ = lcons(makeString($1), $2); }
                               7042                 :                :         ;
                               7043                 :                : 
                               7044                 :                : attrs:      '.' attr_name
                               7045                 :          47153 :                     { $$ = list_make1(makeString($2)); }
                               7046                 :                :             | attrs '.' attr_name
 7097                          7047                 :             32 :                     { $$ = lappend($1, makeString($3)); }
                               7048                 :                :         ;
                               7049                 :                : 
                               7050                 :                : type_name_list:
 2710 peter_e@gmx.net          7051                 :            487 :             Typename                                { $$ = list_make1($1); }
                               7052                 :             39 :             | type_name_list ',' Typename           { $$ = lappend($1, $3); }
                               7053                 :                :         ;
                               7054                 :                : 
                               7055                 :                : /*****************************************************************************
                               7056                 :                :  *
                               7057                 :                :  *      QUERY:
                               7058                 :                :  *              truncate table relname1, relname2, ...
                               7059                 :                :  *
                               7060                 :                :  *****************************************************************************/
                               7061                 :                : 
                               7062                 :                : TruncateStmt:
                               7063                 :                :             TRUNCATE opt_table relation_expr_list opt_restart_seqs opt_drop_behavior
                               7064                 :                :                 {
 8970 bruce@momjian.us         7065                 :            723 :                     TruncateStmt *n = makeNode(TruncateStmt);
                               7066                 :                : 
 7017 tgl@sss.pgh.pa.us        7067                 :            723 :                     n->relations = $3;
 5812                          7068                 :            723 :                     n->restart_seqs = $4;
                               7069                 :            723 :                     n->behavior = $5;
  702 peter@eisentraut.org     7070                 :            723 :                     $$ = (Node *) n;
                               7071                 :                :                 }
                               7072                 :                :         ;
                               7073                 :                : 
                               7074                 :                : opt_restart_seqs:
 5812 tgl@sss.pgh.pa.us        7075                 :             12 :             CONTINUE_P IDENTITY_P       { $$ = false; }
                               7076                 :             12 :             | RESTART IDENTITY_P        { $$ = true; }
                               7077                 :            699 :             | /* EMPTY */               { $$ = false; }
                               7078                 :                :         ;
                               7079                 :                : 
                               7080                 :                : /*****************************************************************************
                               7081                 :                :  *
                               7082                 :                :  * COMMENT ON <object> IS <text>
                               7083                 :                :  *
                               7084                 :                :  *****************************************************************************/
                               7085                 :                : 
                               7086                 :                : CommentStmt:
                               7087                 :                :             COMMENT ON object_type_any_name any_name IS comment_text
                               7088                 :                :                 {
 7972 bruce@momjian.us         7089                 :           2226 :                     CommentStmt *n = makeNode(CommentStmt);
                               7090                 :                : 
                               7091                 :           2226 :                     n->objtype = $3;
 2710 peter_e@gmx.net          7092                 :           2226 :                     n->object = (Node *) $4;
                               7093                 :           2226 :                     n->comment = $6;
                               7094                 :           2226 :                     $$ = (Node *) n;
                               7095                 :                :                 }
                               7096                 :                :             | COMMENT ON COLUMN any_name IS comment_text
                               7097                 :                :                 {
 1401 peter@eisentraut.org     7098                 :             54 :                     CommentStmt *n = makeNode(CommentStmt);
                               7099                 :                : 
                               7100                 :             54 :                     n->objtype = OBJECT_COLUMN;
                               7101                 :             54 :                     n->object = (Node *) $4;
                               7102                 :             54 :                     n->comment = $6;
                               7103                 :             54 :                     $$ = (Node *) n;
                               7104                 :                :                 }
                               7105                 :                :             | COMMENT ON object_type_name name IS comment_text
                               7106                 :                :                 {
 2710 peter_e@gmx.net          7107                 :            178 :                     CommentStmt *n = makeNode(CommentStmt);
                               7108                 :                : 
                               7109                 :            178 :                     n->objtype = $3;
                               7110                 :            178 :                     n->object = (Node *) makeString($4);
 7972 bruce@momjian.us         7111                 :            178 :                     n->comment = $6;
                               7112                 :            178 :                     $$ = (Node *) n;
                               7113                 :                :                 }
                               7114                 :                :             | COMMENT ON TYPE_P Typename IS comment_text
                               7115                 :                :                 {
 3393 alvherre@alvh.no-ip.     7116                 :             28 :                     CommentStmt *n = makeNode(CommentStmt);
                               7117                 :                : 
                               7118                 :             28 :                     n->objtype = OBJECT_TYPE;
 2710 peter_e@gmx.net          7119                 :             28 :                     n->object = (Node *) $4;
 3393 alvherre@alvh.no-ip.     7120                 :             28 :                     n->comment = $6;
                               7121                 :             28 :                     $$ = (Node *) n;
                               7122                 :                :                 }
                               7123                 :                :             | COMMENT ON DOMAIN_P Typename IS comment_text
                               7124                 :                :                 {
                               7125                 :              4 :                     CommentStmt *n = makeNode(CommentStmt);
                               7126                 :                : 
                               7127                 :              4 :                     n->objtype = OBJECT_DOMAIN;
 2710 peter_e@gmx.net          7128                 :              4 :                     n->object = (Node *) $4;
 3393 alvherre@alvh.no-ip.     7129                 :              4 :                     n->comment = $6;
                               7130                 :              4 :                     $$ = (Node *) n;
                               7131                 :                :                 }
                               7132                 :                :             | COMMENT ON AGGREGATE aggregate_with_argtypes IS comment_text
                               7133                 :                :                 {
 7972 bruce@momjian.us         7134                 :             20 :                     CommentStmt *n = makeNode(CommentStmt);
                               7135                 :                : 
 7597 peter_e@gmx.net          7136                 :             20 :                     n->objtype = OBJECT_AGGREGATE;
 2710                          7137                 :             20 :                     n->object = (Node *) $4;
 2768                          7138                 :             20 :                     n->comment = $6;
 7972 bruce@momjian.us         7139                 :             20 :                     $$ = (Node *) n;
                               7140                 :                :                 }
                               7141                 :                :             | COMMENT ON FUNCTION function_with_argtypes IS comment_text
                               7142                 :                :                 {
                               7143                 :             85 :                     CommentStmt *n = makeNode(CommentStmt);
                               7144                 :                : 
 7597 peter_e@gmx.net          7145                 :             85 :                     n->objtype = OBJECT_FUNCTION;
 2710                          7146                 :             85 :                     n->object = (Node *) $4;
 2768                          7147                 :             85 :                     n->comment = $6;
 7972 bruce@momjian.us         7148                 :             85 :                     $$ = (Node *) n;
                               7149                 :                :                 }
                               7150                 :                :             | COMMENT ON OPERATOR operator_with_argtypes IS comment_text
                               7151                 :                :                 {
                               7152                 :              9 :                     CommentStmt *n = makeNode(CommentStmt);
                               7153                 :                : 
 7597 peter_e@gmx.net          7154                 :              9 :                     n->objtype = OBJECT_OPERATOR;
 2710                          7155                 :              9 :                     n->object = (Node *) $4;
 2664                          7156                 :              9 :                     n->comment = $6;
 7972 bruce@momjian.us         7157                 :              9 :                     $$ = (Node *) n;
                               7158                 :                :                 }
                               7159                 :                :             | COMMENT ON CONSTRAINT name ON any_name IS comment_text
                               7160                 :                :                 {
                               7161                 :             52 :                     CommentStmt *n = makeNode(CommentStmt);
                               7162                 :                : 
 3400 alvherre@alvh.no-ip.     7163                 :             52 :                     n->objtype = OBJECT_TABCONSTRAINT;
 2710 peter_e@gmx.net          7164                 :             52 :                     n->object = (Node *) lappend($6, makeString($4));
 7972 bruce@momjian.us         7165                 :             52 :                     n->comment = $8;
                               7166                 :             52 :                     $$ = (Node *) n;
                               7167                 :                :                 }
                               7168                 :                :             | COMMENT ON CONSTRAINT name ON DOMAIN_P any_name IS comment_text
                               7169                 :                :                 {
 3400 alvherre@alvh.no-ip.     7170                 :             19 :                     CommentStmt *n = makeNode(CommentStmt);
                               7171                 :                : 
                               7172                 :             19 :                     n->objtype = OBJECT_DOMCONSTRAINT;
                               7173                 :                :                     /*
                               7174                 :                :                      * should use Typename not any_name in the production, but
                               7175                 :                :                      * there's a shift/reduce conflict if we do that, so fix it
                               7176                 :                :                      * up here.
                               7177                 :                :                      */
 2710 peter_e@gmx.net          7178                 :             19 :                     n->object = (Node *) list_make2(makeTypeNameFromNameList($7), makeString($4));
 3400 alvherre@alvh.no-ip.     7179                 :             19 :                     n->comment = $9;
                               7180                 :             19 :                     $$ = (Node *) n;
                               7181                 :                :                 }
                               7182                 :                :             | COMMENT ON object_type_name_on_any_name name ON any_name IS comment_text
                               7183                 :                :                 {
 3426 sfrost@snowman.net       7184                 :             20 :                     CommentStmt *n = makeNode(CommentStmt);
                               7185                 :                : 
 1401 peter@eisentraut.org     7186                 :             20 :                     n->objtype = $3;
 2710 peter_e@gmx.net          7187                 :             20 :                     n->object = (Node *) lappend($6, makeString($4));
 3426 sfrost@snowman.net       7188                 :             20 :                     n->comment = $8;
                               7189                 :             20 :                     $$ = (Node *) n;
                               7190                 :                :                 }
                               7191                 :                :             | COMMENT ON PROCEDURE function_with_argtypes IS comment_text
                               7192                 :                :                 {
 2327 peter_e@gmx.net          7193                 :UBC           0 :                     CommentStmt *n = makeNode(CommentStmt);
                               7194                 :                : 
                               7195                 :              0 :                     n->objtype = OBJECT_PROCEDURE;
                               7196                 :              0 :                     n->object = (Node *) $4;
                               7197                 :              0 :                     n->comment = $6;
                               7198                 :              0 :                     $$ = (Node *) n;
                               7199                 :                :                 }
                               7200                 :                :             | COMMENT ON ROUTINE function_with_argtypes IS comment_text
                               7201                 :                :                 {
                               7202                 :              0 :                     CommentStmt *n = makeNode(CommentStmt);
                               7203                 :                : 
                               7204                 :              0 :                     n->objtype = OBJECT_ROUTINE;
                               7205                 :              0 :                     n->object = (Node *) $4;
                               7206                 :              0 :                     n->comment = $6;
                               7207                 :              0 :                     $$ = (Node *) n;
                               7208                 :                :                 }
                               7209                 :                :             | COMMENT ON TRANSFORM FOR Typename LANGUAGE name IS comment_text
                               7210                 :                :                 {
 3276 peter_e@gmx.net          7211                 :CBC           7 :                     CommentStmt *n = makeNode(CommentStmt);
                               7212                 :                : 
                               7213                 :              7 :                     n->objtype = OBJECT_TRANSFORM;
 2710                          7214                 :              7 :                     n->object = (Node *) list_make2($5, makeString($7));
 3276                          7215                 :              7 :                     n->comment = $9;
                               7216                 :              7 :                     $$ = (Node *) n;
                               7217                 :                :                 }
                               7218                 :                :             | COMMENT ON OPERATOR CLASS any_name USING name IS comment_text
                               7219                 :                :                 {
 7450 tgl@sss.pgh.pa.us        7220                 :UBC           0 :                     CommentStmt *n = makeNode(CommentStmt);
                               7221                 :                : 
                               7222                 :              0 :                     n->objtype = OBJECT_OPCLASS;
 2710 peter_e@gmx.net          7223                 :              0 :                     n->object = (Node *) lcons(makeString($7), $5);
 7450 tgl@sss.pgh.pa.us        7224                 :              0 :                     n->comment = $9;
                               7225                 :              0 :                     $$ = (Node *) n;
                               7226                 :                :                 }
                               7227                 :                :             | COMMENT ON OPERATOR FAMILY any_name USING name IS comment_text
                               7228                 :                :                 {
 6291                          7229                 :              0 :                     CommentStmt *n = makeNode(CommentStmt);
                               7230                 :                : 
                               7231                 :              0 :                     n->objtype = OBJECT_OPFAMILY;
 2710 peter_e@gmx.net          7232                 :              0 :                     n->object = (Node *) lcons(makeString($7), $5);
 6291 tgl@sss.pgh.pa.us        7233                 :              0 :                     n->comment = $9;
                               7234                 :              0 :                     $$ = (Node *) n;
                               7235                 :                :                 }
                               7236                 :                :             | COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
                               7237                 :                :                 {
 7450 tgl@sss.pgh.pa.us        7238                 :CBC          12 :                     CommentStmt *n = makeNode(CommentStmt);
                               7239                 :                : 
                               7240                 :             12 :                     n->objtype = OBJECT_LARGEOBJECT;
 2710 peter_e@gmx.net          7241                 :             12 :                     n->object = (Node *) $5;
 7450 tgl@sss.pgh.pa.us        7242                 :             12 :                     n->comment = $7;
                               7243                 :             12 :                     $$ = (Node *) n;
                               7244                 :                :                 }
                               7245                 :                :             | COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
                               7246                 :                :                 {
 7450 tgl@sss.pgh.pa.us        7247                 :UBC           0 :                     CommentStmt *n = makeNode(CommentStmt);
                               7248                 :                : 
                               7249                 :              0 :                     n->objtype = OBJECT_CAST;
 2710 peter_e@gmx.net          7250                 :              0 :                     n->object = (Node *) list_make2($5, $7);
 7450 tgl@sss.pgh.pa.us        7251                 :              0 :                     n->comment = $10;
                               7252                 :              0 :                     $$ = (Node *) n;
                               7253                 :                :                 }
                               7254                 :                :         ;
                               7255                 :                : 
                               7256                 :                : comment_text:
 7945 tgl@sss.pgh.pa.us        7257                 :CBC        2662 :             Sconst                              { $$ = $1; }
                               7258                 :             52 :             | NULL_P                            { $$ = NULL; }
                               7259                 :                :         ;
                               7260                 :                : 
                               7261                 :                : 
                               7262                 :                : /*****************************************************************************
                               7263                 :                :  *
                               7264                 :                :  *  SECURITY LABEL [FOR <provider>] ON <object> IS <label>
                               7265                 :                :  *
                               7266                 :                :  *  As with COMMENT ON, <object> can refer to various types of database
                               7267                 :                :  *  objects (e.g. TABLE, COLUMN, etc.).
                               7268                 :                :  *
                               7269                 :                :  *****************************************************************************/
                               7270                 :                : 
                               7271                 :                : SecLabelStmt:
                               7272                 :                :             SECURITY LABEL opt_provider ON object_type_any_name any_name
                               7273                 :                :             IS security_label
                               7274                 :                :                 {
 4948 rhaas@postgresql.org     7275                 :             24 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7276                 :                : 
                               7277                 :             24 :                     n->provider = $3;
                               7278                 :             24 :                     n->objtype = $5;
 2710 peter_e@gmx.net          7279                 :             24 :                     n->object = (Node *) $6;
                               7280                 :             24 :                     n->label = $8;
                               7281                 :             24 :                     $$ = (Node *) n;
                               7282                 :                :                 }
                               7283                 :                :             | SECURITY LABEL opt_provider ON COLUMN any_name
                               7284                 :                :               IS security_label
                               7285                 :                :                 {
 1401 peter@eisentraut.org     7286                 :              2 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7287                 :                : 
                               7288                 :              2 :                     n->provider = $3;
                               7289                 :              2 :                     n->objtype = OBJECT_COLUMN;
                               7290                 :              2 :                     n->object = (Node *) $6;
                               7291                 :              2 :                     n->label = $8;
                               7292                 :              2 :                     $$ = (Node *) n;
                               7293                 :                :                 }
                               7294                 :                :             | SECURITY LABEL opt_provider ON object_type_name name
                               7295                 :                :               IS security_label
                               7296                 :                :                 {
 2710 peter_e@gmx.net          7297                 :             22 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7298                 :                : 
                               7299                 :             22 :                     n->provider = $3;
                               7300                 :             22 :                     n->objtype = $5;
                               7301                 :             22 :                     n->object = (Node *) makeString($6);
 4948 rhaas@postgresql.org     7302                 :             22 :                     n->label = $8;
                               7303                 :             22 :                     $$ = (Node *) n;
                               7304                 :                :                 }
                               7305                 :                :             | SECURITY LABEL opt_provider ON TYPE_P Typename
                               7306                 :                :               IS security_label
                               7307                 :                :                 {
 3393 alvherre@alvh.no-ip.     7308                 :UBC           0 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7309                 :                : 
                               7310                 :              0 :                     n->provider = $3;
                               7311                 :              0 :                     n->objtype = OBJECT_TYPE;
 2710 peter_e@gmx.net          7312                 :              0 :                     n->object = (Node *) $6;
 3393 alvherre@alvh.no-ip.     7313                 :              0 :                     n->label = $8;
                               7314                 :              0 :                     $$ = (Node *) n;
                               7315                 :                :                 }
                               7316                 :                :             | SECURITY LABEL opt_provider ON DOMAIN_P Typename
                               7317                 :                :               IS security_label
                               7318                 :                :                 {
 3393 alvherre@alvh.no-ip.     7319                 :CBC           1 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7320                 :                : 
                               7321                 :              1 :                     n->provider = $3;
 2447 peter_e@gmx.net          7322                 :              1 :                     n->objtype = OBJECT_DOMAIN;
 2710                          7323                 :              1 :                     n->object = (Node *) $6;
 3393 alvherre@alvh.no-ip.     7324                 :              1 :                     n->label = $8;
                               7325                 :              1 :                     $$ = (Node *) n;
                               7326                 :                :                 }
                               7327                 :                :             | SECURITY LABEL opt_provider ON AGGREGATE aggregate_with_argtypes
                               7328                 :                :               IS security_label
                               7329                 :                :                 {
 4948 rhaas@postgresql.org     7330                 :UBC           0 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7331                 :                : 
                               7332                 :              0 :                     n->provider = $3;
                               7333                 :              0 :                     n->objtype = OBJECT_AGGREGATE;
 2710 peter_e@gmx.net          7334                 :              0 :                     n->object = (Node *) $6;
 2768                          7335                 :              0 :                     n->label = $8;
 4948 rhaas@postgresql.org     7336                 :              0 :                     $$ = (Node *) n;
                               7337                 :                :                 }
                               7338                 :                :             | SECURITY LABEL opt_provider ON FUNCTION function_with_argtypes
                               7339                 :                :               IS security_label
                               7340                 :                :                 {
 4948 rhaas@postgresql.org     7341                 :CBC           1 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7342                 :                : 
                               7343                 :              1 :                     n->provider = $3;
                               7344                 :              1 :                     n->objtype = OBJECT_FUNCTION;
 2710 peter_e@gmx.net          7345                 :              1 :                     n->object = (Node *) $6;
 2768                          7346                 :              1 :                     n->label = $8;
 4948 rhaas@postgresql.org     7347                 :              1 :                     $$ = (Node *) n;
                               7348                 :                :                 }
                               7349                 :                :             | SECURITY LABEL opt_provider ON LARGE_P OBJECT_P NumericOnly
                               7350                 :                :               IS security_label
                               7351                 :                :                 {
 4948 rhaas@postgresql.org     7352                 :UBC           0 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7353                 :                : 
                               7354                 :              0 :                     n->provider = $3;
                               7355                 :              0 :                     n->objtype = OBJECT_LARGEOBJECT;
 2710 peter_e@gmx.net          7356                 :              0 :                     n->object = (Node *) $7;
 4948 rhaas@postgresql.org     7357                 :              0 :                     n->label = $9;
                               7358                 :              0 :                     $$ = (Node *) n;
                               7359                 :                :                 }
                               7360                 :                :             | SECURITY LABEL opt_provider ON PROCEDURE function_with_argtypes
                               7361                 :                :               IS security_label
                               7362                 :                :                 {
 2327 peter_e@gmx.net          7363                 :              0 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7364                 :                : 
                               7365                 :              0 :                     n->provider = $3;
                               7366                 :              0 :                     n->objtype = OBJECT_PROCEDURE;
                               7367                 :              0 :                     n->object = (Node *) $6;
                               7368                 :              0 :                     n->label = $8;
                               7369                 :              0 :                     $$ = (Node *) n;
                               7370                 :                :                 }
                               7371                 :                :             | SECURITY LABEL opt_provider ON ROUTINE function_with_argtypes
                               7372                 :                :               IS security_label
                               7373                 :                :                 {
                               7374                 :              0 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7375                 :                : 
                               7376                 :              0 :                     n->provider = $3;
                               7377                 :              0 :                     n->objtype = OBJECT_ROUTINE;
                               7378                 :              0 :                     n->object = (Node *) $6;
                               7379                 :              0 :                     n->label = $8;
                               7380                 :              0 :                     $$ = (Node *) n;
                               7381                 :                :                 }
                               7382                 :                :         ;
                               7383                 :                : 
 3969 tgl@sss.pgh.pa.us        7384                 :CBC          10 : opt_provider:   FOR NonReservedWord_or_Sconst   { $$ = $2; }
 1245 peter@eisentraut.org     7385                 :             40 :                 | /* EMPTY */                   { $$ = NULL; }
                               7386                 :                :         ;
                               7387                 :                : 
 4948 rhaas@postgresql.org     7388                 :             50 : security_label: Sconst              { $$ = $1; }
 4948 rhaas@postgresql.org     7389                 :UBC           0 :                 | NULL_P            { $$ = NULL; }
                               7390                 :                :         ;
                               7391                 :                : 
                               7392                 :                : /*****************************************************************************
                               7393                 :                :  *
                               7394                 :                :  *      QUERY:
                               7395                 :                :  *          fetch/move
                               7396                 :                :  *
                               7397                 :                :  *****************************************************************************/
                               7398                 :                : 
                               7399                 :                : FetchStmt:  FETCH fetch_args
                               7400                 :                :                 {
 7705 tgl@sss.pgh.pa.us        7401                 :CBC        2653 :                     FetchStmt *n = (FetchStmt *) $2;
                               7402                 :                : 
 2433 peter_e@gmx.net          7403                 :           2653 :                     n->ismove = false;
  702 peter@eisentraut.org     7404                 :           2653 :                     $$ = (Node *) n;
                               7405                 :                :                 }
                               7406                 :                :             | MOVE fetch_args
                               7407                 :                :                 {
 7705 tgl@sss.pgh.pa.us        7408                 :             47 :                     FetchStmt *n = (FetchStmt *) $2;
                               7409                 :                : 
 2433 peter_e@gmx.net          7410                 :             47 :                     n->ismove = true;
  702 peter@eisentraut.org     7411                 :             47 :                     $$ = (Node *) n;
                               7412                 :                :                 }
                               7413                 :                :         ;
                               7414                 :                : 
                               7415                 :                : fetch_args: cursor_name
                               7416                 :                :                 {
 8853 bruce@momjian.us         7417                 :             80 :                     FetchStmt *n = makeNode(FetchStmt);
                               7418                 :                : 
 5268 alvherre@alvh.no-ip.     7419                 :             80 :                     n->portalname = $1;
 7734 tgl@sss.pgh.pa.us        7420                 :             80 :                     n->direction = FETCH_FORWARD;
 8853 bruce@momjian.us         7421                 :             80 :                     n->howMany = 1;
  702 peter@eisentraut.org     7422                 :             80 :                     $$ = (Node *) n;
                               7423                 :                :                 }
                               7424                 :                :             | from_in cursor_name
                               7425                 :                :                 {
 8853 bruce@momjian.us         7426                 :             74 :                     FetchStmt *n = makeNode(FetchStmt);
                               7427                 :                : 
 5268 alvherre@alvh.no-ip.     7428                 :             74 :                     n->portalname = $2;
 7734 tgl@sss.pgh.pa.us        7429                 :             74 :                     n->direction = FETCH_FORWARD;
 8853 bruce@momjian.us         7430                 :             74 :                     n->howMany = 1;
  702 peter@eisentraut.org     7431                 :             74 :                     $$ = (Node *) n;
                               7432                 :                :                 }
                               7433                 :                :             | NEXT opt_from_in cursor_name
                               7434                 :                :                 {
 9694 vadim4o@yahoo.com        7435                 :            128 :                     FetchStmt *n = makeNode(FetchStmt);
                               7436                 :                : 
 5268 alvherre@alvh.no-ip.     7437                 :            128 :                     n->portalname = $3;
 7705 tgl@sss.pgh.pa.us        7438                 :            128 :                     n->direction = FETCH_FORWARD;
                               7439                 :            128 :                     n->howMany = 1;
  702 peter@eisentraut.org     7440                 :            128 :                     $$ = (Node *) n;
                               7441                 :                :                 }
                               7442                 :                :             | PRIOR opt_from_in cursor_name
                               7443                 :                :                 {
 8853 bruce@momjian.us         7444                 :             15 :                     FetchStmt *n = makeNode(FetchStmt);
                               7445                 :                : 
 5268 alvherre@alvh.no-ip.     7446                 :             15 :                     n->portalname = $3;
 7705 tgl@sss.pgh.pa.us        7447                 :             15 :                     n->direction = FETCH_BACKWARD;
                               7448                 :             15 :                     n->howMany = 1;
  702 peter@eisentraut.org     7449                 :             15 :                     $$ = (Node *) n;
                               7450                 :                :                 }
                               7451                 :                :             | FIRST_P opt_from_in cursor_name
                               7452                 :                :                 {
 8853 bruce@momjian.us         7453                 :             12 :                     FetchStmt *n = makeNode(FetchStmt);
                               7454                 :                : 
 5268 alvherre@alvh.no-ip.     7455                 :             12 :                     n->portalname = $3;
 7705 tgl@sss.pgh.pa.us        7456                 :             12 :                     n->direction = FETCH_ABSOLUTE;
 8853 bruce@momjian.us         7457                 :             12 :                     n->howMany = 1;
  702 peter@eisentraut.org     7458                 :             12 :                     $$ = (Node *) n;
                               7459                 :                :                 }
                               7460                 :                :             | LAST_P opt_from_in cursor_name
                               7461                 :                :                 {
 7705 tgl@sss.pgh.pa.us        7462                 :              9 :                     FetchStmt *n = makeNode(FetchStmt);
                               7463                 :                : 
 5268 alvherre@alvh.no-ip.     7464                 :              9 :                     n->portalname = $3;
 7705 tgl@sss.pgh.pa.us        7465                 :              9 :                     n->direction = FETCH_ABSOLUTE;
                               7466                 :              9 :                     n->howMany = -1;
  702 peter@eisentraut.org     7467                 :              9 :                     $$ = (Node *) n;
                               7468                 :                :                 }
                               7469                 :                :             | ABSOLUTE_P SignedIconst opt_from_in cursor_name
                               7470                 :                :                 {
 7705 tgl@sss.pgh.pa.us        7471                 :             40 :                     FetchStmt *n = makeNode(FetchStmt);
                               7472                 :                : 
 5268 alvherre@alvh.no-ip.     7473                 :             40 :                     n->portalname = $4;
 7705 tgl@sss.pgh.pa.us        7474                 :             40 :                     n->direction = FETCH_ABSOLUTE;
                               7475                 :             40 :                     n->howMany = $2;
  702 peter@eisentraut.org     7476                 :             40 :                     $$ = (Node *) n;
                               7477                 :                :                 }
                               7478                 :                :             | RELATIVE_P SignedIconst opt_from_in cursor_name
                               7479                 :                :                 {
 7705 tgl@sss.pgh.pa.us        7480                 :             15 :                     FetchStmt *n = makeNode(FetchStmt);
                               7481                 :                : 
 5268 alvherre@alvh.no-ip.     7482                 :             15 :                     n->portalname = $4;
 7705 tgl@sss.pgh.pa.us        7483                 :             15 :                     n->direction = FETCH_RELATIVE;
                               7484                 :             15 :                     n->howMany = $2;
  702 peter@eisentraut.org     7485                 :             15 :                     $$ = (Node *) n;
                               7486                 :                :                 }
                               7487                 :                :             | SignedIconst opt_from_in cursor_name
                               7488                 :                :                 {
 7705 tgl@sss.pgh.pa.us        7489                 :           1967 :                     FetchStmt *n = makeNode(FetchStmt);
                               7490                 :                : 
 5268 alvherre@alvh.no-ip.     7491                 :           1967 :                     n->portalname = $3;
 7705 tgl@sss.pgh.pa.us        7492                 :           1967 :                     n->direction = FETCH_FORWARD;
                               7493                 :           1967 :                     n->howMany = $1;
  702 peter@eisentraut.org     7494                 :           1967 :                     $$ = (Node *) n;
                               7495                 :                :                 }
                               7496                 :                :             | ALL opt_from_in cursor_name
                               7497                 :                :                 {
 7705 tgl@sss.pgh.pa.us        7498                 :            132 :                     FetchStmt *n = makeNode(FetchStmt);
                               7499                 :                : 
 5268 alvherre@alvh.no-ip.     7500                 :            132 :                     n->portalname = $3;
 7705 tgl@sss.pgh.pa.us        7501                 :            132 :                     n->direction = FETCH_FORWARD;
                               7502                 :            132 :                     n->howMany = FETCH_ALL;
  702 peter@eisentraut.org     7503                 :            132 :                     $$ = (Node *) n;
                               7504                 :                :                 }
                               7505                 :                :             | FORWARD opt_from_in cursor_name
                               7506                 :                :                 {
 8853 bruce@momjian.us         7507                 :              9 :                     FetchStmt *n = makeNode(FetchStmt);
                               7508                 :                : 
 5268 alvherre@alvh.no-ip.     7509                 :              9 :                     n->portalname = $3;
 7734 tgl@sss.pgh.pa.us        7510                 :              9 :                     n->direction = FETCH_FORWARD;
 8853 bruce@momjian.us         7511                 :              9 :                     n->howMany = 1;
  702 peter@eisentraut.org     7512                 :              9 :                     $$ = (Node *) n;
                               7513                 :                :                 }
                               7514                 :                :             | FORWARD SignedIconst opt_from_in cursor_name
                               7515                 :                :                 {
 8853 bruce@momjian.us         7516                 :              1 :                     FetchStmt *n = makeNode(FetchStmt);
                               7517                 :                : 
 5268 alvherre@alvh.no-ip.     7518                 :              1 :                     n->portalname = $4;
 7734 tgl@sss.pgh.pa.us        7519                 :              1 :                     n->direction = FETCH_FORWARD;
 7705                          7520                 :              1 :                     n->howMany = $2;
  702 peter@eisentraut.org     7521                 :              1 :                     $$ = (Node *) n;
                               7522                 :                :                 }
                               7523                 :                :             | FORWARD ALL opt_from_in cursor_name
                               7524                 :                :                 {
 7705 tgl@sss.pgh.pa.us        7525                 :              7 :                     FetchStmt *n = makeNode(FetchStmt);
                               7526                 :                : 
 5268 alvherre@alvh.no-ip.     7527                 :              7 :                     n->portalname = $4;
 7705 tgl@sss.pgh.pa.us        7528                 :              7 :                     n->direction = FETCH_FORWARD;
                               7529                 :              7 :                     n->howMany = FETCH_ALL;
  702 peter@eisentraut.org     7530                 :              7 :                     $$ = (Node *) n;
                               7531                 :                :                 }
                               7532                 :                :             | BACKWARD opt_from_in cursor_name
                               7533                 :                :                 {
 7705 tgl@sss.pgh.pa.us        7534                 :             39 :                     FetchStmt *n = makeNode(FetchStmt);
                               7535                 :                : 
 5268 alvherre@alvh.no-ip.     7536                 :             39 :                     n->portalname = $3;
 7705 tgl@sss.pgh.pa.us        7537                 :             39 :                     n->direction = FETCH_BACKWARD;
 8853 bruce@momjian.us         7538                 :             39 :                     n->howMany = 1;
  702 peter@eisentraut.org     7539                 :             39 :                     $$ = (Node *) n;
                               7540                 :                :                 }
                               7541                 :                :             | BACKWARD SignedIconst opt_from_in cursor_name
                               7542                 :                :                 {
 7705 tgl@sss.pgh.pa.us        7543                 :            109 :                     FetchStmt *n = makeNode(FetchStmt);
                               7544                 :                : 
 5268 alvherre@alvh.no-ip.     7545                 :            109 :                     n->portalname = $4;
 7705 tgl@sss.pgh.pa.us        7546                 :            109 :                     n->direction = FETCH_BACKWARD;
                               7547                 :            109 :                     n->howMany = $2;
  702 peter@eisentraut.org     7548                 :            109 :                     $$ = (Node *) n;
                               7549                 :                :                 }
                               7550                 :                :             | BACKWARD ALL opt_from_in cursor_name
                               7551                 :                :                 {
 7705 tgl@sss.pgh.pa.us        7552                 :             63 :                     FetchStmt *n = makeNode(FetchStmt);
                               7553                 :                : 
 5268 alvherre@alvh.no-ip.     7554                 :             63 :                     n->portalname = $4;
 7705 tgl@sss.pgh.pa.us        7555                 :             63 :                     n->direction = FETCH_BACKWARD;
                               7556                 :             63 :                     n->howMany = FETCH_ALL;
  702 peter@eisentraut.org     7557                 :             63 :                     $$ = (Node *) n;
                               7558                 :                :                 }
                               7559                 :                :         ;
                               7560                 :                : 
                               7561                 :                : from_in:    FROM
                               7562                 :                :             | IN_P
                               7563                 :                :         ;
                               7564                 :                : 
                               7565                 :                : opt_from_in:    from_in
                               7566                 :                :             | /* EMPTY */
                               7567                 :                :         ;
                               7568                 :                : 
                               7569                 :                : 
                               7570                 :                : /*****************************************************************************
                               7571                 :                :  *
                               7572                 :                :  * GRANT and REVOKE statements
                               7573                 :                :  *
                               7574                 :                :  *****************************************************************************/
                               7575                 :                : 
                               7576                 :                : GrantStmt:  GRANT privileges ON privilege_target TO grantee_list
                               7577                 :                :             opt_grant_grant_option opt_granted_by
                               7578                 :                :                 {
 8345 peter_e@gmx.net          7579                 :           4068 :                     GrantStmt *n = makeNode(GrantStmt);
                               7580                 :                : 
                               7581                 :           4068 :                     n->is_grant = true;
                               7582                 :           4068 :                     n->privileges = $2;
 5298 tgl@sss.pgh.pa.us        7583                 :           4068 :                     n->targtype = ($4)->targtype;
 8091 peter_e@gmx.net          7584                 :           4068 :                     n->objtype = ($4)->objtype;
                               7585                 :           4068 :                     n->objects = ($4)->objs;
                               7586                 :           4068 :                     n->grantees = $6;
 7752                          7587                 :           4068 :                     n->grant_option = $7;
 1170 peter@eisentraut.org     7588                 :           4068 :                     n->grantor = $8;
  702                          7589                 :           4068 :                     $$ = (Node *) n;
                               7590                 :                :                 }
                               7591                 :                :         ;
                               7592                 :                : 
                               7593                 :                : RevokeStmt:
                               7594                 :                :             REVOKE privileges ON privilege_target
                               7595                 :                :             FROM grantee_list opt_granted_by opt_drop_behavior
                               7596                 :                :                 {
 8091 peter_e@gmx.net          7597                 :           3462 :                     GrantStmt *n = makeNode(GrantStmt);
                               7598                 :                : 
                               7599                 :           3462 :                     n->is_grant = false;
 6865 tgl@sss.pgh.pa.us        7600                 :           3462 :                     n->grant_option = false;
                               7601                 :           3462 :                     n->privileges = $2;
 5298                          7602                 :           3462 :                     n->targtype = ($4)->targtype;
 6865                          7603                 :           3462 :                     n->objtype = ($4)->objtype;
                               7604                 :           3462 :                     n->objects = ($4)->objs;
                               7605                 :           3462 :                     n->grantees = $6;
 1170 peter@eisentraut.org     7606                 :           3462 :                     n->grantor = $7;
                               7607                 :           3462 :                     n->behavior = $8;
  702                          7608                 :           3462 :                     $$ = (Node *) n;
                               7609                 :                :                 }
                               7610                 :                :             | REVOKE GRANT OPTION FOR privileges ON privilege_target
                               7611                 :                :             FROM grantee_list opt_granted_by opt_drop_behavior
                               7612                 :                :                 {
 6865 tgl@sss.pgh.pa.us        7613                 :              7 :                     GrantStmt *n = makeNode(GrantStmt);
                               7614                 :                : 
                               7615                 :              7 :                     n->is_grant = false;
                               7616                 :              7 :                     n->grant_option = true;
                               7617                 :              7 :                     n->privileges = $5;
 5298                          7618                 :              7 :                     n->targtype = ($7)->targtype;
 6865                          7619                 :              7 :                     n->objtype = ($7)->objtype;
                               7620                 :              7 :                     n->objects = ($7)->objs;
                               7621                 :              7 :                     n->grantees = $9;
 1170 peter@eisentraut.org     7622                 :              7 :                     n->grantor = $10;
                               7623                 :              7 :                     n->behavior = $11;
  702                          7624                 :              7 :                     $$ = (Node *) n;
                               7625                 :                :                 }
                               7626                 :                :         ;
                               7627                 :                : 
                               7628                 :                : 
                               7629                 :                : /*
                               7630                 :                :  * Privilege names are represented as strings; the validity of the privilege
                               7631                 :                :  * names gets checked at execution.  This is a bit annoying but we have little
                               7632                 :                :  * choice because of the syntactic conflict with lists of role names in
                               7633                 :                :  * GRANT/REVOKE.  What's more, we have to call out in the "privilege"
                               7634                 :                :  * production any reserved keywords that need to be usable as privilege names.
                               7635                 :                :  */
                               7636                 :                : 
                               7637                 :                : /* either ALL [PRIVILEGES] or a list of individual privileges */
                               7638                 :                : privileges: privilege_list
 6865 tgl@sss.pgh.pa.us        7639                 :           6573 :                 { $$ = $1; }
                               7640                 :                :             | ALL
                               7641                 :            981 :                 { $$ = NIL; }
                               7642                 :                :             | ALL PRIVILEGES
                               7643                 :             60 :                 { $$ = NIL; }
                               7644                 :                :             | ALL '(' columnList ')'
                               7645                 :                :                 {
 5561                          7646                 :              9 :                     AccessPriv *n = makeNode(AccessPriv);
                               7647                 :                : 
                               7648                 :              9 :                     n->priv_name = NULL;
                               7649                 :              9 :                     n->cols = $3;
                               7650                 :              9 :                     $$ = list_make1(n);
                               7651                 :                :                 }
                               7652                 :                :             | ALL PRIVILEGES '(' columnList ')'
                               7653                 :                :                 {
 5561 tgl@sss.pgh.pa.us        7654                 :UBC           0 :                     AccessPriv *n = makeNode(AccessPriv);
                               7655                 :                : 
                               7656                 :              0 :                     n->priv_name = NULL;
                               7657                 :              0 :                     n->cols = $4;
                               7658                 :              0 :                     $$ = list_make1(n);
                               7659                 :                :                 }
                               7660                 :                :         ;
                               7661                 :                : 
 5561 tgl@sss.pgh.pa.us        7662                 :CBC        7015 : privilege_list: privilege                           { $$ = list_make1($1); }
                               7663                 :            219 :             | privilege_list ',' privilege          { $$ = lappend($1, $3); }
                               7664                 :                :         ;
                               7665                 :                : 
                               7666                 :                : privilege:  SELECT opt_column_list
                               7667                 :                :             {
                               7668                 :           2901 :                 AccessPriv *n = makeNode(AccessPriv);
                               7669                 :                : 
                               7670                 :           2901 :                 n->priv_name = pstrdup($1);
                               7671                 :           2901 :                 n->cols = $2;
                               7672                 :           2901 :                 $$ = n;
                               7673                 :                :             }
                               7674                 :                :         | REFERENCES opt_column_list
                               7675                 :                :             {
                               7676                 :              7 :                 AccessPriv *n = makeNode(AccessPriv);
                               7677                 :                : 
                               7678                 :              7 :                 n->priv_name = pstrdup($1);
                               7679                 :              7 :                 n->cols = $2;
                               7680                 :              7 :                 $$ = n;
                               7681                 :                :             }
                               7682                 :                :         | CREATE opt_column_list
                               7683                 :                :             {
                               7684                 :            123 :                 AccessPriv *n = makeNode(AccessPriv);
                               7685                 :                : 
                               7686                 :            123 :                 n->priv_name = pstrdup($1);
                               7687                 :            123 :                 n->cols = $2;
                               7688                 :            123 :                 $$ = n;
                               7689                 :                :             }
                               7690                 :                :         | ALTER SYSTEM_P
                               7691                 :                :             {
  739                          7692                 :             12 :                 AccessPriv *n = makeNode(AccessPriv);
                               7693                 :             12 :                 n->priv_name = pstrdup("alter system");
                               7694                 :             12 :                 n->cols = NIL;
                               7695                 :             12 :                 $$ = n;
                               7696                 :                :             }
                               7697                 :                :         | ColId opt_column_list
                               7698                 :                :             {
 5561                          7699                 :           4191 :                 AccessPriv *n = makeNode(AccessPriv);
                               7700                 :                : 
                               7701                 :           4191 :                 n->priv_name = $1;
                               7702                 :           4191 :                 n->cols = $2;
                               7703                 :           4191 :                 $$ = n;
                               7704                 :                :             }
                               7705                 :                :         ;
                               7706                 :                : 
                               7707                 :                : parameter_name_list:
                               7708                 :                :         parameter_name
                               7709                 :                :             {
  739                          7710                 :             38 :                 $$ = list_make1(makeString($1));
                               7711                 :                :             }
                               7712                 :                :         | parameter_name_list ',' parameter_name
                               7713                 :                :             {
                               7714                 :             25 :                 $$ = lappend($1, makeString($3));
                               7715                 :                :             }
                               7716                 :                :         ;
                               7717                 :                : 
                               7718                 :                : parameter_name:
                               7719                 :                :         ColId
                               7720                 :                :             {
                               7721                 :             63 :                 $$ = $1;
                               7722                 :                :             }
                               7723                 :                :         | parameter_name '.' ColId
                               7724                 :                :             {
                               7725                 :             16 :                 $$ = psprintf("%s.%s", $1, $3);
                               7726                 :                :             }
                               7727                 :                :         ;
                               7728                 :                : 
                               7729                 :                : 
                               7730                 :                : /* Don't bother trying to fold the first two rules into one using
                               7731                 :                :  * opt_table.  You're going to get conflicts.
                               7732                 :                :  */
                               7733                 :                : privilege_target:
                               7734                 :                :             qualified_name_list
                               7735                 :                :                 {
 5561                          7736                 :           3656 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7737                 :                : 
 5298                          7738                 :           3656 :                     n->targtype = ACL_TARGET_OBJECT;
 2377 peter_e@gmx.net          7739                 :           3656 :                     n->objtype = OBJECT_TABLE;
 8091                          7740                 :           3656 :                     n->objs = $1;
                               7741                 :           3656 :                     $$ = n;
                               7742                 :                :                 }
                               7743                 :                :             | TABLE qualified_name_list
                               7744                 :                :                 {
 5561 tgl@sss.pgh.pa.us        7745                 :            160 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7746                 :                : 
 5298                          7747                 :            160 :                     n->targtype = ACL_TARGET_OBJECT;
 2377 peter_e@gmx.net          7748                 :            160 :                     n->objtype = OBJECT_TABLE;
 8091                          7749                 :            160 :                     n->objs = $2;
                               7750                 :            160 :                     $$ = n;
                               7751                 :                :                 }
                               7752                 :                :             | SEQUENCE qualified_name_list
                               7753                 :                :                 {
 5561 tgl@sss.pgh.pa.us        7754                 :              8 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7755                 :                : 
 5298                          7756                 :              8 :                     n->targtype = ACL_TARGET_OBJECT;
 2377 peter_e@gmx.net          7757                 :              8 :                     n->objtype = OBJECT_SEQUENCE;
 6658 bruce@momjian.us         7758                 :              8 :                     n->objs = $2;
                               7759                 :              8 :                     $$ = n;
                               7760                 :                :                 }
                               7761                 :                :             | FOREIGN DATA_P WRAPPER name_list
                               7762                 :                :                 {
 5561 tgl@sss.pgh.pa.us        7763                 :             46 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7764                 :                : 
 5298                          7765                 :             46 :                     n->targtype = ACL_TARGET_OBJECT;
 2377 peter_e@gmx.net          7766                 :             46 :                     n->objtype = OBJECT_FDW;
 5595                          7767                 :             46 :                     n->objs = $4;
                               7768                 :             46 :                     $$ = n;
                               7769                 :                :                 }
                               7770                 :                :             | FOREIGN SERVER name_list
                               7771                 :                :                 {
 5561 tgl@sss.pgh.pa.us        7772                 :             39 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7773                 :                : 
 5298                          7774                 :             39 :                     n->targtype = ACL_TARGET_OBJECT;
 2377 peter_e@gmx.net          7775                 :             39 :                     n->objtype = OBJECT_FOREIGN_SERVER;
 5595                          7776                 :             39 :                     n->objs = $3;
                               7777                 :             39 :                     $$ = n;
                               7778                 :                :                 }
                               7779                 :                :             | FUNCTION function_with_argtypes_list
                               7780                 :                :                 {
 5561 tgl@sss.pgh.pa.us        7781                 :           3159 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7782                 :                : 
 5298                          7783                 :           3159 :                     n->targtype = ACL_TARGET_OBJECT;
 2377 peter_e@gmx.net          7784                 :           3159 :                     n->objtype = OBJECT_FUNCTION;
 8029 tgl@sss.pgh.pa.us        7785                 :           3159 :                     n->objs = $2;
                               7786                 :           3159 :                     $$ = n;
                               7787                 :                :                 }
                               7788                 :                :             | PROCEDURE function_with_argtypes_list
                               7789                 :                :                 {
 2327 peter_e@gmx.net          7790                 :             21 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7791                 :                : 
                               7792                 :             21 :                     n->targtype = ACL_TARGET_OBJECT;
 2377                          7793                 :             21 :                     n->objtype = OBJECT_PROCEDURE;
 2327                          7794                 :             21 :                     n->objs = $2;
                               7795                 :             21 :                     $$ = n;
                               7796                 :                :                 }
                               7797                 :                :             | ROUTINE function_with_argtypes_list
                               7798                 :                :                 {
 2327 peter_e@gmx.net          7799                 :UBC           0 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7800                 :                : 
                               7801                 :              0 :                     n->targtype = ACL_TARGET_OBJECT;
 2377                          7802                 :              0 :                     n->objtype = OBJECT_ROUTINE;
 2327                          7803                 :              0 :                     n->objs = $2;
                               7804                 :              0 :                     $$ = n;
                               7805                 :                :                 }
                               7806                 :                :             | DATABASE name_list
                               7807                 :                :                 {
 5561 tgl@sss.pgh.pa.us        7808                 :CBC         131 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7809                 :                : 
 5298                          7810                 :            131 :                     n->targtype = ACL_TARGET_OBJECT;
 2377 peter_e@gmx.net          7811                 :            131 :                     n->objtype = OBJECT_DATABASE;
 8091                          7812                 :            131 :                     n->objs = $2;
                               7813                 :            131 :                     $$ = n;
                               7814                 :                :                 }
                               7815                 :                :             | DOMAIN_P any_name_list
                               7816                 :                :                 {
 4499                          7817                 :             13 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7818                 :                : 
                               7819                 :             13 :                     n->targtype = ACL_TARGET_OBJECT;
 2377                          7820                 :             13 :                     n->objtype = OBJECT_DOMAIN;
 4499                          7821                 :             13 :                     n->objs = $2;
                               7822                 :             13 :                     $$ = n;
                               7823                 :                :                 }
                               7824                 :                :             | LANGUAGE name_list
                               7825                 :                :                 {
 5561 tgl@sss.pgh.pa.us        7826                 :             21 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7827                 :                : 
 5298                          7828                 :             21 :                     n->targtype = ACL_TARGET_OBJECT;
 2377 peter_e@gmx.net          7829                 :             21 :                     n->objtype = OBJECT_LANGUAGE;
 8029 tgl@sss.pgh.pa.us        7830                 :             21 :                     n->objs = $2;
                               7831                 :             21 :                     $$ = n;
                               7832                 :                :                 }
                               7833                 :                :             | LARGE_P OBJECT_P NumericOnly_list
                               7834                 :                :                 {
 5238 itagaki.takahiro@gma     7835                 :             40 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7836                 :                : 
                               7837                 :             40 :                     n->targtype = ACL_TARGET_OBJECT;
 2377 peter_e@gmx.net          7838                 :             40 :                     n->objtype = OBJECT_LARGEOBJECT;
 5238 itagaki.takahiro@gma     7839                 :             40 :                     n->objs = $3;
                               7840                 :             40 :                     $$ = n;
                               7841                 :                :                 }
                               7842                 :                :             | PARAMETER parameter_name_list
                               7843                 :                :                 {
  739 tgl@sss.pgh.pa.us        7844                 :             38 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7845                 :             38 :                     n->targtype = ACL_TARGET_OBJECT;
                               7846                 :             38 :                     n->objtype = OBJECT_PARAMETER_ACL;
                               7847                 :             38 :                     n->objs = $2;
                               7848                 :             38 :                     $$ = n;
                               7849                 :                :                 }
                               7850                 :                :             | SCHEMA name_list
                               7851                 :                :                 {
 5561                          7852                 :            141 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7853                 :                : 
 5298                          7854                 :            141 :                     n->targtype = ACL_TARGET_OBJECT;
 2377 peter_e@gmx.net          7855                 :            141 :                     n->objtype = OBJECT_SCHEMA;
 8091                          7856                 :            141 :                     n->objs = $2;
                               7857                 :            141 :                     $$ = n;
                               7858                 :                :                 }
                               7859                 :                :             | TABLESPACE name_list
                               7860                 :                :                 {
 5561 tgl@sss.pgh.pa.us        7861                 :UBC           0 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7862                 :                : 
 5298                          7863                 :              0 :                     n->targtype = ACL_TARGET_OBJECT;
 2377 peter_e@gmx.net          7864                 :              0 :                     n->objtype = OBJECT_TABLESPACE;
 7240 tgl@sss.pgh.pa.us        7865                 :              0 :                     n->objs = $2;
                               7866                 :              0 :                     $$ = n;
                               7867                 :                :                 }
                               7868                 :                :             | TYPE_P any_name_list
                               7869                 :                :                 {
 4499 peter_e@gmx.net          7870                 :CBC          55 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7871                 :                : 
                               7872                 :             55 :                     n->targtype = ACL_TARGET_OBJECT;
 2377                          7873                 :             55 :                     n->objtype = OBJECT_TYPE;
 4499                          7874                 :             55 :                     n->objs = $2;
                               7875                 :             55 :                     $$ = n;
                               7876                 :                :                 }
                               7877                 :                :             | ALL TABLES IN_P SCHEMA name_list
                               7878                 :                :                 {
 5298 tgl@sss.pgh.pa.us        7879                 :              6 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7880                 :                : 
                               7881                 :              6 :                     n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
 2377 peter_e@gmx.net          7882                 :              6 :                     n->objtype = OBJECT_TABLE;
 5298 tgl@sss.pgh.pa.us        7883                 :              6 :                     n->objs = $5;
                               7884                 :              6 :                     $$ = n;
                               7885                 :                :                 }
                               7886                 :                :             | ALL SEQUENCES IN_P SCHEMA name_list
                               7887                 :                :                 {
 5298 tgl@sss.pgh.pa.us        7888                 :UBC           0 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7889                 :                : 
                               7890                 :              0 :                     n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
 2377 peter_e@gmx.net          7891                 :              0 :                     n->objtype = OBJECT_SEQUENCE;
 5298 tgl@sss.pgh.pa.us        7892                 :              0 :                     n->objs = $5;
                               7893                 :              0 :                     $$ = n;
                               7894                 :                :                 }
                               7895                 :                :             | ALL FUNCTIONS IN_P SCHEMA name_list
                               7896                 :                :                 {
 5298 tgl@sss.pgh.pa.us        7897                 :CBC           3 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7898                 :                : 
                               7899                 :              3 :                     n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
 2377 peter_e@gmx.net          7900                 :              3 :                     n->objtype = OBJECT_FUNCTION;
 5298 tgl@sss.pgh.pa.us        7901                 :              3 :                     n->objs = $5;
                               7902                 :              3 :                     $$ = n;
                               7903                 :                :                 }
                               7904                 :                :             | ALL PROCEDURES IN_P SCHEMA name_list
                               7905                 :                :                 {
 2327 peter_e@gmx.net          7906                 :              3 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7907                 :                : 
                               7908                 :              3 :                     n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
 2377                          7909                 :              3 :                     n->objtype = OBJECT_PROCEDURE;
 2327                          7910                 :              3 :                     n->objs = $5;
                               7911                 :              3 :                     $$ = n;
                               7912                 :                :                 }
                               7913                 :                :             | ALL ROUTINES IN_P SCHEMA name_list
                               7914                 :                :                 {
                               7915                 :              3 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7916                 :                : 
                               7917                 :              3 :                     n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
 2377                          7918                 :              3 :                     n->objtype = OBJECT_ROUTINE;
 2327                          7919                 :              3 :                     n->objs = $5;
                               7920                 :              3 :                     $$ = n;
                               7921                 :                :                 }
                               7922                 :                :         ;
                               7923                 :                : 
                               7924                 :                : 
                               7925                 :                : grantee_list:
 7259 neilc@samurai.com        7926                 :           7617 :             grantee                                 { $$ = list_make1($1); }
 7972 bruce@momjian.us         7927                 :             51 :             | grantee_list ',' grantee              { $$ = lappend($1, $3); }
                               7928                 :                :         ;
                               7929                 :                : 
                               7930                 :                : grantee:
 3324 alvherre@alvh.no-ip.     7931                 :           7656 :             RoleSpec                                { $$ = $1; }
                               7932                 :             12 :             | GROUP_P RoleSpec                      { $$ = $2; }
                               7933                 :                :         ;
                               7934                 :                : 
                               7935                 :                : 
                               7936                 :                : opt_grant_grant_option:
 2433 peter_e@gmx.net          7937                 :             43 :             WITH GRANT OPTION { $$ = true; }
                               7938                 :           4075 :             | /*EMPTY*/ { $$ = false; }
                               7939                 :                :         ;
                               7940                 :                : 
                               7941                 :                : /*****************************************************************************
                               7942                 :                :  *
                               7943                 :                :  * GRANT and REVOKE ROLE statements
                               7944                 :                :  *
                               7945                 :                :  *****************************************************************************/
                               7946                 :                : 
                               7947                 :                : GrantRoleStmt:
                               7948                 :                :             GRANT privilege_list TO role_list opt_granted_by
                               7949                 :                :                 {
 6865 tgl@sss.pgh.pa.us        7950                 :            275 :                     GrantRoleStmt *n = makeNode(GrantRoleStmt);
                               7951                 :                : 
                               7952                 :            275 :                     n->is_grant = true;
                               7953                 :            275 :                     n->granted_roles = $2;
                               7954                 :            275 :                     n->grantee_roles = $4;
  598 rhaas@postgresql.org     7955                 :            275 :                     n->opt = NIL;
                               7956                 :            275 :                     n->grantor = $5;
                               7957                 :            275 :                     $$ = (Node *) n;
                               7958                 :                :                 }
                               7959                 :                :           | GRANT privilege_list TO role_list WITH grant_role_opt_list opt_granted_by
                               7960                 :                :                 {
                               7961                 :             89 :                     GrantRoleStmt *n = makeNode(GrantRoleStmt);
                               7962                 :                : 
                               7963                 :             89 :                     n->is_grant = true;
                               7964                 :             89 :                     n->granted_roles = $2;
                               7965                 :             89 :                     n->grantee_roles = $4;
                               7966                 :             89 :                     n->opt = $6;
                               7967                 :             89 :                     n->grantor = $7;
  702 peter@eisentraut.org     7968                 :             89 :                     $$ = (Node *) n;
                               7969                 :                :                 }
                               7970                 :                :         ;
                               7971                 :                : 
                               7972                 :                : RevokeRoleStmt:
                               7973                 :                :             REVOKE privilege_list FROM role_list opt_granted_by opt_drop_behavior
                               7974                 :                :                 {
 6865 tgl@sss.pgh.pa.us        7975                 :             45 :                     GrantRoleStmt *n = makeNode(GrantRoleStmt);
                               7976                 :                : 
                               7977                 :             45 :                     n->is_grant = false;
  598 rhaas@postgresql.org     7978                 :             45 :                     n->opt = NIL;
 6865 tgl@sss.pgh.pa.us        7979                 :             45 :                     n->granted_roles = $2;
                               7980                 :             45 :                     n->grantee_roles = $4;
  601 rhaas@postgresql.org     7981                 :             45 :                     n->grantor = $5;
 6865 tgl@sss.pgh.pa.us        7982                 :             45 :                     n->behavior = $6;
  702 peter@eisentraut.org     7983                 :             45 :                     $$ = (Node *) n;
                               7984                 :                :                 }
                               7985                 :                :             | REVOKE ColId OPTION FOR privilege_list FROM role_list opt_granted_by opt_drop_behavior
                               7986                 :                :                 {
 6865 tgl@sss.pgh.pa.us        7987                 :             33 :                     GrantRoleStmt *n = makeNode(GrantRoleStmt);
                               7988                 :                :                     DefElem *opt;
                               7989                 :                : 
  598 rhaas@postgresql.org     7990                 :             33 :                     opt = makeDefElem(pstrdup($2),
                               7991                 :             33 :                                       (Node *) makeBoolean(false), @2);
 6865 tgl@sss.pgh.pa.us        7992                 :             33 :                     n->is_grant = false;
  598 rhaas@postgresql.org     7993                 :             33 :                     n->opt = list_make1(opt);
 6865 tgl@sss.pgh.pa.us        7994                 :             33 :                     n->granted_roles = $5;
                               7995                 :             33 :                     n->grantee_roles = $7;
  601 rhaas@postgresql.org     7996                 :             33 :                     n->grantor = $8;
 6865 tgl@sss.pgh.pa.us        7997                 :             33 :                     n->behavior = $9;
  702 peter@eisentraut.org     7998                 :             33 :                     $$ = (Node *) n;
                               7999                 :                :                 }
                               8000                 :                :         ;
                               8001                 :                : 
                               8002                 :                : grant_role_opt_list:
  598 rhaas@postgresql.org     8003                 :             60 :             grant_role_opt_list ',' grant_role_opt  { $$ = lappend($1, $3); }
                               8004                 :             89 :             | grant_role_opt                        { $$ = list_make1($1); }
                               8005                 :                :         ;
                               8006                 :                : 
                               8007                 :                : grant_role_opt:
                               8008                 :                :         ColLabel grant_role_opt_value
                               8009                 :                :             {
                               8010                 :            149 :                 $$ = makeDefElem(pstrdup($1), $2, @1);
                               8011                 :                :             }
                               8012                 :                :         ;
                               8013                 :                : 
                               8014                 :                : grant_role_opt_value:
                               8015                 :             36 :         OPTION          { $$ = (Node *) makeBoolean(true); }
                               8016                 :             56 :         | TRUE_P        { $$ = (Node *) makeBoolean(true); }
                               8017                 :             57 :         | FALSE_P       { $$ = (Node *) makeBoolean(false); }
                               8018                 :                :         ;
                               8019                 :                : 
 3324 alvherre@alvh.no-ip.     8020                 :             69 : opt_granted_by: GRANTED BY RoleSpec                     { $$ = $3; }
 6865 tgl@sss.pgh.pa.us        8021                 :           7910 :             | /*EMPTY*/                                 { $$ = NULL; }
                               8022                 :                :         ;
                               8023                 :                : 
                               8024                 :                : /*****************************************************************************
                               8025                 :                :  *
                               8026                 :                :  * ALTER DEFAULT PRIVILEGES statement
                               8027                 :                :  *
                               8028                 :                :  *****************************************************************************/
                               8029                 :                : 
                               8030                 :                : AlterDefaultPrivilegesStmt:
                               8031                 :                :             ALTER DEFAULT PRIVILEGES DefACLOptionList DefACLAction
                               8032                 :                :                 {
 5305                          8033                 :             80 :                     AlterDefaultPrivilegesStmt *n = makeNode(AlterDefaultPrivilegesStmt);
                               8034                 :                : 
                               8035                 :             80 :                     n->options = $4;
                               8036                 :             80 :                     n->action = (GrantStmt *) $5;
  702 peter@eisentraut.org     8037                 :             80 :                     $$ = (Node *) n;
                               8038                 :                :                 }
                               8039                 :                :         ;
                               8040                 :                : 
                               8041                 :                : DefACLOptionList:
 5305 tgl@sss.pgh.pa.us        8042                 :             61 :             DefACLOptionList DefACLOption           { $$ = lappend($1, $2); }
                               8043                 :             80 :             | /* EMPTY */                           { $$ = NIL; }
                               8044                 :                :         ;
                               8045                 :                : 
                               8046                 :                : DefACLOption:
                               8047                 :                :             IN_P SCHEMA name_list
                               8048                 :                :                 {
  702 peter@eisentraut.org     8049                 :             27 :                     $$ = makeDefElem("schemas", (Node *) $3, @1);
                               8050                 :                :                 }
                               8051                 :                :             | FOR ROLE role_list
                               8052                 :                :                 {
                               8053                 :             34 :                     $$ = makeDefElem("roles", (Node *) $3, @1);
                               8054                 :                :                 }
                               8055                 :                :             | FOR USER role_list
                               8056                 :                :                 {
  702 peter@eisentraut.org     8057                 :UBC           0 :                     $$ = makeDefElem("roles", (Node *) $3, @1);
                               8058                 :                :                 }
                               8059                 :                :         ;
                               8060                 :                : 
                               8061                 :                : /*
                               8062                 :                :  * This should match GRANT/REVOKE, except that individual target objects
                               8063                 :                :  * are not mentioned and we only allow a subset of object types.
                               8064                 :                :  */
                               8065                 :                : DefACLAction:
                               8066                 :                :             GRANT privileges ON defacl_privilege_target TO grantee_list
                               8067                 :                :             opt_grant_grant_option
                               8068                 :                :                 {
 5305 tgl@sss.pgh.pa.us        8069                 :CBC          50 :                     GrantStmt *n = makeNode(GrantStmt);
                               8070                 :                : 
                               8071                 :             50 :                     n->is_grant = true;
                               8072                 :             50 :                     n->privileges = $2;
 5298                          8073                 :             50 :                     n->targtype = ACL_TARGET_DEFAULTS;
 5305                          8074                 :             50 :                     n->objtype = $4;
                               8075                 :             50 :                     n->objects = NIL;
                               8076                 :             50 :                     n->grantees = $6;
                               8077                 :             50 :                     n->grant_option = $7;
  702 peter@eisentraut.org     8078                 :             50 :                     $$ = (Node *) n;
                               8079                 :                :                 }
                               8080                 :                :             | REVOKE privileges ON defacl_privilege_target
                               8081                 :                :             FROM grantee_list opt_drop_behavior
                               8082                 :                :                 {
 5305 tgl@sss.pgh.pa.us        8083                 :             30 :                     GrantStmt *n = makeNode(GrantStmt);
                               8084                 :                : 
                               8085                 :             30 :                     n->is_grant = false;
                               8086                 :             30 :                     n->grant_option = false;
                               8087                 :             30 :                     n->privileges = $2;
 5298                          8088                 :             30 :                     n->targtype = ACL_TARGET_DEFAULTS;
 5305                          8089                 :             30 :                     n->objtype = $4;
                               8090                 :             30 :                     n->objects = NIL;
                               8091                 :             30 :                     n->grantees = $6;
                               8092                 :             30 :                     n->behavior = $7;
  702 peter@eisentraut.org     8093                 :             30 :                     $$ = (Node *) n;
                               8094                 :                :                 }
                               8095                 :                :             | REVOKE GRANT OPTION FOR privileges ON defacl_privilege_target
                               8096                 :                :             FROM grantee_list opt_drop_behavior
                               8097                 :                :                 {
 5305 tgl@sss.pgh.pa.us        8098                 :UBC           0 :                     GrantStmt *n = makeNode(GrantStmt);
                               8099                 :                : 
                               8100                 :              0 :                     n->is_grant = false;
                               8101                 :              0 :                     n->grant_option = true;
                               8102                 :              0 :                     n->privileges = $5;
 5298                          8103                 :              0 :                     n->targtype = ACL_TARGET_DEFAULTS;
 5305                          8104                 :              0 :                     n->objtype = $7;
                               8105                 :              0 :                     n->objects = NIL;
                               8106                 :              0 :                     n->grantees = $9;
                               8107                 :              0 :                     n->behavior = $10;
  702 peter@eisentraut.org     8108                 :              0 :                     $$ = (Node *) n;
                               8109                 :                :                 }
                               8110                 :                :         ;
                               8111                 :                : 
                               8112                 :                : defacl_privilege_target:
 2377 peter_e@gmx.net          8113                 :CBC          39 :             TABLES          { $$ = OBJECT_TABLE; }
                               8114                 :              8 :             | FUNCTIONS     { $$ = OBJECT_FUNCTION; }
                               8115                 :              3 :             | ROUTINES      { $$ = OBJECT_FUNCTION; }
                               8116                 :              3 :             | SEQUENCES     { $$ = OBJECT_SEQUENCE; }
                               8117                 :              9 :             | TYPES_P       { $$ = OBJECT_TYPE; }
                               8118                 :             18 :             | SCHEMAS       { $$ = OBJECT_SCHEMA; }
                               8119                 :                :         ;
                               8120                 :                : 
                               8121                 :                : 
                               8122                 :                : /*****************************************************************************
                               8123                 :                :  *
                               8124                 :                :  *      QUERY: CREATE INDEX
                               8125                 :                :  *
                               8126                 :                :  * Note: we cannot put TABLESPACE clause after WHERE clause unless we are
                               8127                 :                :  * willing to make TABLESPACE a fully reserved word.
                               8128                 :                :  *****************************************************************************/
                               8129                 :                : 
                               8130                 :                : IndexStmt:  CREATE opt_unique INDEX opt_concurrently opt_single_name
                               8131                 :                :             ON relation_expr access_method_clause '(' index_params ')'
                               8132                 :                :             opt_include opt_unique_null_treatment opt_reloptions OptTableSpace where_clause
                               8133                 :                :                 {
 6442 tgl@sss.pgh.pa.us        8134                 :           3180 :                     IndexStmt *n = makeNode(IndexStmt);
                               8135                 :                : 
                               8136                 :           3180 :                     n->unique = $2;
 5226                          8137                 :           3180 :                     n->concurrent = $4;
 6442                          8138                 :           3180 :                     n->idxname = $5;
                               8139                 :           3180 :                     n->relation = $7;
                               8140                 :           3180 :                     n->accessMethod = $8;
                               8141                 :           3180 :                     n->indexParams = $10;
 2199 teodor@sigaev.ru         8142                 :           3180 :                     n->indexIncludingParams = $12;
  801 peter@eisentraut.org     8143                 :           3180 :                     n->nulls_not_distinct = !$13;
                               8144                 :           3180 :                     n->options = $14;
                               8145                 :           3180 :                     n->tableSpace = $15;
                               8146                 :           3180 :                     n->whereClause = $16;
 4290 tgl@sss.pgh.pa.us        8147                 :           3180 :                     n->excludeOpNames = NIL;
                               8148                 :           3180 :                     n->idxcomment = NULL;
 4828                          8149                 :           3180 :                     n->indexOid = InvalidOid;
  648 rhaas@postgresql.org     8150                 :           3180 :                     n->oldNumber = InvalidRelFileNumber;
 1471 noah@leadboat.com        8151                 :           3180 :                     n->oldCreateSubid = InvalidSubTransactionId;
  648 rhaas@postgresql.org     8152                 :           3180 :                     n->oldFirstRelfilelocatorSubid = InvalidSubTransactionId;
 4290 tgl@sss.pgh.pa.us        8153                 :           3180 :                     n->primary = false;
                               8154                 :           3180 :                     n->isconstraint = false;
                               8155                 :           3180 :                     n->deferrable = false;
                               8156                 :           3180 :                     n->initdeferred = false;
 3339                          8157                 :           3180 :                     n->transformed = false;
 3447 fujii@postgresql.org     8158                 :           3180 :                     n->if_not_exists = false;
 1816 alvherre@alvh.no-ip.     8159                 :           3180 :                     n->reset_default_tblspc = false;
  702 peter@eisentraut.org     8160                 :           3180 :                     $$ = (Node *) n;
                               8161                 :                :                 }
                               8162                 :                :             | CREATE opt_unique INDEX opt_concurrently IF_P NOT EXISTS name
                               8163                 :                :             ON relation_expr access_method_clause '(' index_params ')'
                               8164                 :                :             opt_include opt_unique_null_treatment opt_reloptions OptTableSpace where_clause
                               8165                 :                :                 {
 3447 fujii@postgresql.org     8166                 :              9 :                     IndexStmt *n = makeNode(IndexStmt);
                               8167                 :                : 
                               8168                 :              9 :                     n->unique = $2;
                               8169                 :              9 :                     n->concurrent = $4;
                               8170                 :              9 :                     n->idxname = $8;
                               8171                 :              9 :                     n->relation = $10;
                               8172                 :              9 :                     n->accessMethod = $11;
                               8173                 :              9 :                     n->indexParams = $13;
 2199 teodor@sigaev.ru         8174                 :              9 :                     n->indexIncludingParams = $15;
  801 peter@eisentraut.org     8175                 :              9 :                     n->nulls_not_distinct = !$16;
                               8176                 :              9 :                     n->options = $17;
                               8177                 :              9 :                     n->tableSpace = $18;
                               8178                 :              9 :                     n->whereClause = $19;
 3447 fujii@postgresql.org     8179                 :              9 :                     n->excludeOpNames = NIL;
                               8180                 :              9 :                     n->idxcomment = NULL;
                               8181                 :              9 :                     n->indexOid = InvalidOid;
  648 rhaas@postgresql.org     8182                 :              9 :                     n->oldNumber = InvalidRelFileNumber;
 1471 noah@leadboat.com        8183                 :              9 :                     n->oldCreateSubid = InvalidSubTransactionId;
  648 rhaas@postgresql.org     8184                 :              9 :                     n->oldFirstRelfilelocatorSubid = InvalidSubTransactionId;
 3447 fujii@postgresql.org     8185                 :              9 :                     n->primary = false;
                               8186                 :              9 :                     n->isconstraint = false;
                               8187                 :              9 :                     n->deferrable = false;
                               8188                 :              9 :                     n->initdeferred = false;
 3339 tgl@sss.pgh.pa.us        8189                 :              9 :                     n->transformed = false;
 3447 fujii@postgresql.org     8190                 :              9 :                     n->if_not_exists = true;
 1816 alvherre@alvh.no-ip.     8191                 :              9 :                     n->reset_default_tblspc = false;
  702 peter@eisentraut.org     8192                 :              9 :                     $$ = (Node *) n;
                               8193                 :                :                 }
                               8194                 :                :         ;
                               8195                 :                : 
                               8196                 :                : opt_unique:
 2433 peter_e@gmx.net          8197                 :            620 :             UNIQUE                                  { $$ = true; }
                               8198                 :           2572 :             | /*EMPTY*/                             { $$ = false; }
                               8199                 :                :         ;
                               8200                 :                : 
                               8201                 :                : access_method_clause:
 1404 peter@eisentraut.org     8202                 :           1478 :             USING name                              { $$ = $2; }
 7971 bruce@momjian.us         8203                 :           1828 :             | /*EMPTY*/                             { $$ = DEFAULT_INDEX_TYPE; }
                               8204                 :                :         ;
                               8205                 :                : 
 7259 neilc@samurai.com        8206                 :           3820 : index_params:   index_elem                          { $$ = list_make1($1); }
 7627 tgl@sss.pgh.pa.us        8207                 :            974 :             | index_params ',' index_elem           { $$ = lappend($1, $3); }
                               8208                 :                :         ;
                               8209                 :                : 
                               8210                 :                : 
                               8211                 :                : index_elem_options:
                               8212                 :                :     opt_collate opt_qualified_name opt_asc_desc opt_nulls_order
                               8213                 :                :         {
 1476 akorotkov@postgresql     8214                 :           5084 :             $$ = makeNode(IndexElem);
                               8215                 :           5084 :             $$->name = NULL;
                               8216                 :           5084 :             $$->expr = NULL;
                               8217                 :           5084 :             $$->indexcolname = NULL;
                               8218                 :           5084 :             $$->collation = $1;
                               8219                 :           5084 :             $$->opclass = $2;
                               8220                 :           5084 :             $$->opclassopts = NIL;
                               8221                 :           5084 :             $$->ordering = $3;
                               8222                 :           5084 :             $$->nulls_ordering = $4;
                               8223                 :                :         }
                               8224                 :                :     | opt_collate any_name reloptions opt_asc_desc opt_nulls_order
                               8225                 :                :         {
                               8226                 :             69 :             $$ = makeNode(IndexElem);
                               8227                 :             69 :             $$->name = NULL;
                               8228                 :             69 :             $$->expr = NULL;
                               8229                 :             69 :             $$->indexcolname = NULL;
                               8230                 :             69 :             $$->collation = $1;
                               8231                 :             69 :             $$->opclass = $2;
                               8232                 :             69 :             $$->opclassopts = $3;
                               8233                 :             69 :             $$->ordering = $4;
                               8234                 :             69 :             $$->nulls_ordering = $5;
                               8235                 :                :         }
                               8236                 :                :     ;
                               8237                 :                : 
                               8238                 :                : /*
                               8239                 :                :  * Index attributes can be either simple column references, or arbitrary
                               8240                 :                :  * expressions in parens.  For backwards-compatibility reasons, we allow
                               8241                 :                :  * an expression that's just a function call to be written without parens.
                               8242                 :                :  */
                               8243                 :                : index_elem: ColId index_elem_options
                               8244                 :                :                 {
                               8245                 :           4637 :                     $$ = $2;
 7627 tgl@sss.pgh.pa.us        8246                 :           4637 :                     $$->name = $1;
                               8247                 :                :                 }
                               8248                 :                :             | func_expr_windowless index_elem_options
                               8249                 :                :                 {
 1476 akorotkov@postgresql     8250                 :            284 :                     $$ = $2;
 7137 tgl@sss.pgh.pa.us        8251                 :            284 :                     $$->expr = $1;
                               8252                 :                :                 }
                               8253                 :                :             | '(' a_expr ')' index_elem_options
                               8254                 :                :                 {
 1476 akorotkov@postgresql     8255                 :            232 :                     $$ = $4;
 7627 tgl@sss.pgh.pa.us        8256                 :            232 :                     $$->expr = $2;
                               8257                 :                :                 }
                               8258                 :                :         ;
                               8259                 :                : 
 2199 teodor@sigaev.ru         8260                 :            106 : opt_include:        INCLUDE '(' index_including_params ')'          { $$ = $3; }
                               8261                 :           3083 :              |      /* EMPTY */                     { $$ = NIL; }
                               8262                 :                :         ;
                               8263                 :                : 
                               8264                 :            106 : index_including_params: index_elem                      { $$ = list_make1($1); }
                               8265                 :             83 :             | index_including_params ',' index_elem     { $$ = lappend($1, $3); }
                               8266                 :                :         ;
                               8267                 :                : 
 4814 peter_e@gmx.net          8268                 :             83 : opt_collate: COLLATE any_name                       { $$ = $2; }
                               8269                 :           7742 :             | /*EMPTY*/                             { $$ = NIL; }
                               8270                 :                :         ;
                               8271                 :                : 
                               8272                 :                : 
 6305 tgl@sss.pgh.pa.us        8273                 :            866 : opt_asc_desc: ASC                           { $$ = SORTBY_ASC; }
 5704                          8274                 :           1346 :             | DESC                          { $$ = SORTBY_DESC; }
                               8275                 :          45979 :             | /*EMPTY*/                     { $$ = SORTBY_DEFAULT; }
                               8276                 :                :         ;
                               8277                 :                : 
 3337                          8278                 :            145 : opt_nulls_order: NULLS_LA FIRST_P           { $$ = SORTBY_NULLS_FIRST; }
                               8279                 :            836 :             | NULLS_LA LAST_P               { $$ = SORTBY_NULLS_LAST; }
 6305                          8280                 :          47320 :             | /*EMPTY*/                     { $$ = SORTBY_NULLS_DEFAULT; }
                               8281                 :                :         ;
                               8282                 :                : 
                               8283                 :                : 
                               8284                 :                : /*****************************************************************************
                               8285                 :                :  *
                               8286                 :                :  *      QUERY:
                               8287                 :                :  *              create [or replace] function <fname>
                               8288                 :                :  *                      [(<type-1> { , <type-n>})]
                               8289                 :                :  *                      returns <type-r>
                               8290                 :                :  *                      as <filename or code in language as appropriate>
                               8291                 :                :  *                      language <lang> [with parameters]
                               8292                 :                :  *
                               8293                 :                :  *****************************************************************************/
                               8294                 :                : 
                               8295                 :                : CreateFunctionStmt:
                               8296                 :                :             CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
                               8297                 :                :             RETURNS func_return opt_createfunc_opt_list opt_routine_body
                               8298                 :                :                 {
 8003 peter_e@gmx.net          8299                 :           9742 :                     CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
                               8300                 :                : 
 2270 tgl@sss.pgh.pa.us        8301                 :           9742 :                     n->is_procedure = false;
 8230                          8302                 :           9742 :                     n->replace = $2;
 8041                          8303                 :           9742 :                     n->funcname = $4;
 7404                          8304                 :           9742 :                     n->parameters = $5;
 8052                          8305                 :           9742 :                     n->returnType = $7;
 8003 peter_e@gmx.net          8306                 :           9742 :                     n->options = $8;
 1103 peter@eisentraut.org     8307                 :           9742 :                     n->sql_body = $9;
  702                          8308                 :           9742 :                     $$ = (Node *) n;
                               8309                 :                :                 }
                               8310                 :                :             | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
                               8311                 :                :               RETURNS TABLE '(' table_func_column_list ')' opt_createfunc_opt_list opt_routine_body
                               8312                 :                :                 {
 5749 tgl@sss.pgh.pa.us        8313                 :             94 :                     CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
                               8314                 :                : 
 2270                          8315                 :             94 :                     n->is_procedure = false;
 5749                          8316                 :             94 :                     n->replace = $2;
                               8317                 :             94 :                     n->funcname = $4;
                               8318                 :             94 :                     n->parameters = mergeTableFuncParameters($5, $9);
                               8319                 :             94 :                     n->returnType = TableFuncTypeName($9);
                               8320                 :             94 :                     n->returnType->location = @7;
                               8321                 :             94 :                     n->options = $11;
 1103 peter@eisentraut.org     8322                 :             94 :                     n->sql_body = $12;
  702                          8323                 :             94 :                     $$ = (Node *) n;
                               8324                 :                :                 }
                               8325                 :                :             | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
                               8326                 :                :               opt_createfunc_opt_list opt_routine_body
                               8327                 :                :                 {
 6954 tgl@sss.pgh.pa.us        8328                 :            236 :                     CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
                               8329                 :                : 
 2270                          8330                 :            236 :                     n->is_procedure = false;
 6954                          8331                 :            236 :                     n->replace = $2;
                               8332                 :            236 :                     n->funcname = $4;
                               8333                 :            236 :                     n->parameters = $5;
                               8334                 :            236 :                     n->returnType = NULL;
                               8335                 :            236 :                     n->options = $6;
 1103 peter@eisentraut.org     8336                 :            236 :                     n->sql_body = $7;
  702                          8337                 :            236 :                     $$ = (Node *) n;
                               8338                 :                :                 }
                               8339                 :                :             | CREATE opt_or_replace PROCEDURE func_name func_args_with_defaults
                               8340                 :                :               opt_createfunc_opt_list opt_routine_body
                               8341                 :                :                 {
 2327 peter_e@gmx.net          8342                 :            165 :                     CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
                               8343                 :                : 
 2270 tgl@sss.pgh.pa.us        8344                 :            165 :                     n->is_procedure = true;
 2327 peter_e@gmx.net          8345                 :            165 :                     n->replace = $2;
                               8346                 :            165 :                     n->funcname = $4;
                               8347                 :            165 :                     n->parameters = $5;
                               8348                 :            165 :                     n->returnType = NULL;
                               8349                 :            165 :                     n->options = $6;
 1103 peter@eisentraut.org     8350                 :            165 :                     n->sql_body = $7;
  702                          8351                 :            165 :                     $$ = (Node *) n;
                               8352                 :                :                 }
                               8353                 :                :         ;
                               8354                 :                : 
                               8355                 :                : opt_or_replace:
 2433 peter_e@gmx.net          8356                 :           3889 :             OR REPLACE                              { $$ = true; }
                               8357                 :           8980 :             | /*EMPTY*/                             { $$ = false; }
                               8358                 :                :         ;
                               8359                 :                : 
 7972 bruce@momjian.us         8360                 :           4330 : func_args:  '(' func_args_list ')'                  { $$ = $2; }
                               8361                 :           2152 :             | '(' ')'                               { $$ = NIL; }
                               8362                 :                :         ;
                               8363                 :                : 
                               8364                 :                : func_args_list:
 7259 neilc@samurai.com        8365                 :           4330 :             func_arg                                { $$ = list_make1($1); }
 7972 bruce@momjian.us         8366                 :           3716 :             | func_args_list ',' func_arg           { $$ = lappend($1, $3); }
                               8367                 :                :         ;
                               8368                 :                : 
                               8369                 :                : function_with_argtypes_list:
 2768 peter_e@gmx.net          8370                 :           4948 :             function_with_argtypes                  { $$ = list_make1($1); }
                               8371                 :                :             | function_with_argtypes_list ',' function_with_argtypes
                               8372                 :             36 :                                                     { $$ = lappend($1, $3); }
                               8373                 :                :         ;
                               8374                 :                : 
                               8375                 :                : function_with_argtypes:
                               8376                 :                :             func_name func_args
                               8377                 :                :                 {
 2664                          8378                 :           6482 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
                               8379                 :                : 
                               8380                 :           6482 :                     n->objname = $1;
 1039 tgl@sss.pgh.pa.us        8381                 :           6482 :                     n->objargs = extractArgTypes($2);
                               8382                 :           6482 :                     n->objfuncargs = $2;
 2768 peter_e@gmx.net          8383                 :           6482 :                     $$ = n;
                               8384                 :                :                 }
                               8385                 :                :             /*
                               8386                 :                :              * Because of reduce/reduce conflicts, we can't use func_name
                               8387                 :                :              * below, but we can write it out the long way, which actually
                               8388                 :                :              * allows more cases.
                               8389                 :                :              */
                               8390                 :                :             | type_func_name_keyword
                               8391                 :                :                 {
 2593 peter_e@gmx.net          8392                 :UBC           0 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
                               8393                 :                : 
                               8394                 :              0 :                     n->objname = list_make1(makeString(pstrdup($1)));
                               8395                 :              0 :                     n->args_unspecified = true;
                               8396                 :              0 :                     $$ = n;
                               8397                 :                :                 }
                               8398                 :                :             | ColId
                               8399                 :                :                 {
 2593 peter_e@gmx.net          8400                 :CBC         153 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
                               8401                 :                : 
                               8402                 :            153 :                     n->objname = list_make1(makeString($1));
                               8403                 :            153 :                     n->args_unspecified = true;
                               8404                 :            153 :                     $$ = n;
                               8405                 :                :                 }
                               8406                 :                :             | ColId indirection
                               8407                 :                :                 {
                               8408                 :             14 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
                               8409                 :                : 
                               8410                 :             14 :                     n->objname = check_func_name(lcons(makeString($1), $2),
                               8411                 :                :                                                   yyscanner);
                               8412                 :             14 :                     n->args_unspecified = true;
                               8413                 :             14 :                     $$ = n;
                               8414                 :                :                 }
                               8415                 :                :         ;
                               8416                 :                : 
                               8417                 :                : /*
                               8418                 :                :  * func_args_with_defaults is separate because we only want to accept
                               8419                 :                :  * defaults in CREATE FUNCTION, not in ALTER etc.
                               8420                 :                :  */
                               8421                 :                : func_args_with_defaults:
 5610                          8422                 :           8186 :         '(' func_args_with_defaults_list ')'        { $$ = $2; }
 5596 tgl@sss.pgh.pa.us        8423                 :           2051 :         | '(' ')'                                   { $$ = NIL; }
                               8424                 :                :         ;
                               8425                 :                : 
                               8426                 :                : func_args_with_defaults_list:
                               8427                 :           8186 :         func_arg_with_default                       { $$ = list_make1($1); }
                               8428                 :                :         | func_args_with_defaults_list ',' func_arg_with_default
                               8429                 :          13417 :                                                     { $$ = lappend($1, $3); }
                               8430                 :                :         ;
                               8431                 :                : 
                               8432                 :                : /*
                               8433                 :                :  * The style with arg_class first is SQL99 standard, but Oracle puts
                               8434                 :                :  * param_name first; accept both since it's likely people will try both
                               8435                 :                :  * anyway.  Don't bother trying to save productions by letting arg_class
                               8436                 :                :  * have an empty alternative ... you'll get shift/reduce conflicts.
                               8437                 :                :  *
                               8438                 :                :  * We can catch over-specified arguments here if we want to,
                               8439                 :                :  * but for now better to silently swallow typmod, etc.
                               8440                 :                :  * - thomas 2000-03-22
                               8441                 :                :  */
                               8442                 :                : func_arg:
                               8443                 :                :             arg_class param_name func_type
                               8444                 :                :                 {
 7404                          8445                 :           6159 :                     FunctionParameter *n = makeNode(FunctionParameter);
                               8446                 :                : 
                               8447                 :           6159 :                     n->name = $2;
                               8448                 :           6159 :                     n->argType = $3;
 6956                          8449                 :           6159 :                     n->mode = $1;
 5610 peter_e@gmx.net          8450                 :           6159 :                     n->defexpr = NULL;
 7404 tgl@sss.pgh.pa.us        8451                 :           6159 :                     $$ = n;
                               8452                 :                :                 }
                               8453                 :                :             | param_name arg_class func_type
                               8454                 :                :                 {
                               8455                 :            190 :                     FunctionParameter *n = makeNode(FunctionParameter);
                               8456                 :                : 
 6956                          8457                 :            190 :                     n->name = $1;
                               8458                 :            190 :                     n->argType = $3;
                               8459                 :            190 :                     n->mode = $2;
 5610 peter_e@gmx.net          8460                 :            190 :                     n->defexpr = NULL;
 6956 tgl@sss.pgh.pa.us        8461                 :            190 :                     $$ = n;
                               8462                 :                :                 }
                               8463                 :                :             | param_name func_type
                               8464                 :                :                 {
                               8465                 :           6138 :                     FunctionParameter *n = makeNode(FunctionParameter);
                               8466                 :                : 
                               8467                 :           6138 :                     n->name = $1;
 7404                          8468                 :           6138 :                     n->argType = $2;
 1039                          8469                 :           6138 :                     n->mode = FUNC_PARAM_DEFAULT;
 5610 peter_e@gmx.net          8470                 :           6138 :                     n->defexpr = NULL;
 7404 tgl@sss.pgh.pa.us        8471                 :           6138 :                     $$ = n;
                               8472                 :                :                 }
                               8473                 :                :             | arg_class func_type
                               8474                 :                :                 {
 6956                          8475                 :            151 :                     FunctionParameter *n = makeNode(FunctionParameter);
                               8476                 :                : 
                               8477                 :            151 :                     n->name = NULL;
                               8478                 :            151 :                     n->argType = $2;
                               8479                 :            151 :                     n->mode = $1;
 5610 peter_e@gmx.net          8480                 :            151 :                     n->defexpr = NULL;
 6956 tgl@sss.pgh.pa.us        8481                 :            151 :                     $$ = n;
                               8482                 :                :                 }
                               8483                 :                :             | func_type
                               8484                 :                :                 {
                               8485                 :          17460 :                     FunctionParameter *n = makeNode(FunctionParameter);
                               8486                 :                : 
                               8487                 :          17460 :                     n->name = NULL;
                               8488                 :          17460 :                     n->argType = $1;
 1039                          8489                 :          17460 :                     n->mode = FUNC_PARAM_DEFAULT;
 5610 peter_e@gmx.net          8490                 :          17460 :                     n->defexpr = NULL;
 6956 tgl@sss.pgh.pa.us        8491                 :          17460 :                     $$ = n;
                               8492                 :                :                 }
                               8493                 :                :         ;
                               8494                 :                : 
                               8495                 :                : /* INOUT is SQL99 standard, IN OUT is for Oracle compatibility */
 5751                          8496                 :           1420 : arg_class:  IN_P                                { $$ = FUNC_PARAM_IN; }
                               8497                 :           4758 :             | OUT_P                             { $$ = FUNC_PARAM_OUT; }
                               8498                 :             83 :             | INOUT                             { $$ = FUNC_PARAM_INOUT; }
 5751 tgl@sss.pgh.pa.us        8499                 :UBC           0 :             | IN_P OUT_P                        { $$ = FUNC_PARAM_INOUT; }
 5751 tgl@sss.pgh.pa.us        8500                 :CBC         239 :             | VARIADIC                          { $$ = FUNC_PARAM_VARIADIC; }
                               8501                 :                :         ;
                               8502                 :                : 
                               8503                 :                : /*
                               8504                 :                :  * Ideally param_name should be ColId, but that causes too many conflicts.
                               8505                 :                :  */
                               8506                 :                : param_name: type_function_name
                               8507                 :                :         ;
                               8508                 :                : 
                               8509                 :                : func_return:
                               8510                 :                :             func_type
                               8511                 :                :                 {
                               8512                 :                :                     /* We can catch over-specified results here if we want to,
                               8513                 :                :                      * but for now better to silently swallow typmod, etc.
                               8514                 :                :                      * - thomas 2000-03-22
                               8515                 :                :                      */
 8784 lockhart@fourpalms.o     8516                 :           9742 :                     $$ = $1;
                               8517                 :                :                 }
                               8518                 :                :         ;
                               8519                 :                : 
                               8520                 :                : /*
                               8521                 :                :  * We would like to make the %TYPE productions here be ColId attrs etc,
                               8522                 :                :  * but that causes reduce/reduce conflicts.  type_function_name
                               8523                 :                :  * is next best choice.
                               8524                 :                :  */
 7972 bruce@momjian.us         8525                 :          49310 : func_type:  Typename                                { $$ = $1; }
                               8526                 :                :             | type_function_name attrs '%' TYPE_P
                               8527                 :                :                 {
 6315 tgl@sss.pgh.pa.us        8528                 :              9 :                     $$ = makeTypeNameFromNameList(lcons(makeString($1), $2));
 8052                          8529                 :              9 :                     $$->pct_type = true;
 6606                          8530                 :              9 :                     $$->location = @1;
                               8531                 :                :                 }
                               8532                 :                :             | SETOF type_function_name attrs '%' TYPE_P
                               8533                 :                :                 {
 6315                          8534                 :              3 :                     $$ = makeTypeNameFromNameList(lcons(makeString($2), $3));
 6648                          8535                 :              3 :                     $$->pct_type = true;
 2433 peter_e@gmx.net          8536                 :              3 :                     $$->setof = true;
 6606 tgl@sss.pgh.pa.us        8537                 :              3 :                     $$->location = @2;
                               8538                 :                :                 }
                               8539                 :                :         ;
                               8540                 :                : 
                               8541                 :                : func_arg_with_default:
                               8542                 :                :         func_arg
                               8543                 :                :                 {
 4548 peter_e@gmx.net          8544                 :          19215 :                     $$ = $1;
                               8545                 :                :                 }
                               8546                 :                :         | func_arg DEFAULT a_expr
                               8547                 :                :                 {
                               8548                 :           2290 :                     $$ = $1;
                               8549                 :           2290 :                     $$->defexpr = $3;
                               8550                 :                :                 }
                               8551                 :                :         | func_arg '=' a_expr
                               8552                 :                :                 {
                               8553                 :             98 :                     $$ = $1;
                               8554                 :             98 :                     $$->defexpr = $3;
                               8555                 :                :                 }
                               8556                 :                :         ;
                               8557                 :                : 
                               8558                 :                : /* Aggregate args can be most things that function args can be */
                               8559                 :                : aggr_arg:   func_arg
                               8560                 :                :                 {
 1039 tgl@sss.pgh.pa.us        8561         [ +  + ]:            449 :                     if (!($1->mode == FUNC_PARAM_DEFAULT ||
                               8562         [ +  - ]:             30 :                           $1->mode == FUNC_PARAM_IN ||
 3876                          8563         [ -  + ]:             30 :                           $1->mode == FUNC_PARAM_VARIADIC))
 3876 tgl@sss.pgh.pa.us        8564         [ #  # ]:UBC           0 :                         ereport(ERROR,
                               8565                 :                :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               8566                 :                :                                  errmsg("aggregates cannot have output arguments"),
                               8567                 :                :                                  parser_errposition(@1)));
 3876 tgl@sss.pgh.pa.us        8568                 :CBC         449 :                     $$ = $1;
                               8569                 :                :                 }
                               8570                 :                :         ;
                               8571                 :                : 
                               8572                 :                : /*
                               8573                 :                :  * The SQL standard offers no guidance on how to declare aggregate argument
                               8574                 :                :  * lists, since it doesn't have CREATE AGGREGATE etc.  We accept these cases:
                               8575                 :                :  *
                               8576                 :                :  * (*)                                  - normal agg with no args
                               8577                 :                :  * (aggr_arg,...)                       - normal agg with args
                               8578                 :                :  * (ORDER BY aggr_arg,...)              - ordered-set agg with no direct args
                               8579                 :                :  * (aggr_arg,... ORDER BY aggr_arg,...) - ordered-set agg with direct args
                               8580                 :                :  *
                               8581                 :                :  * The zero-argument case is spelled with '*' for consistency with COUNT(*).
                               8582                 :                :  *
                               8583                 :                :  * An additional restriction is that if the direct-args list ends in a
                               8584                 :                :  * VARIADIC item, the ordered-args list must contain exactly one item that
                               8585                 :                :  * is also VARIADIC with the same type.  This allows us to collapse the two
                               8586                 :                :  * VARIADIC items into one, which is necessary to represent the aggregate in
                               8587                 :                :  * pg_proc.  We check this at the grammar stage so that we can return a list
                               8588                 :                :  * in which the second VARIADIC item is already discarded, avoiding extra work
                               8589                 :                :  * in cases such as DROP AGGREGATE.
                               8590                 :                :  *
                               8591                 :                :  * The return value of this production is a two-element list, in which the
                               8592                 :                :  * first item is a sublist of FunctionParameter nodes (with any duplicate
                               8593                 :                :  * VARIADIC item already dropped, as per above) and the second is an Integer
                               8594                 :                :  * node, containing -1 if there was no ORDER BY and otherwise the number
                               8595                 :                :  * of argument declarations before the ORDER BY.  (If this number is equal
                               8596                 :                :  * to the first sublist's length, then we dropped a duplicate VARIADIC item.)
                               8597                 :                :  * This representation is passed as-is to CREATE AGGREGATE; for operations
                               8598                 :                :  * on existing aggregates, we can just apply extractArgTypes to the first
                               8599                 :                :  * sublist.
                               8600                 :                :  */
                               8601                 :                : aggr_args:  '(' '*' ')'
                               8602                 :                :                 {
 3765                          8603                 :             68 :                     $$ = list_make2(NIL, makeInteger(-1));
                               8604                 :                :                 }
                               8605                 :                :             | '(' aggr_args_list ')'
                               8606                 :                :                 {
                               8607                 :            365 :                     $$ = list_make2($2, makeInteger(-1));
                               8608                 :                :                 }
                               8609                 :                :             | '(' ORDER BY aggr_args_list ')'
                               8610                 :                :                 {
                               8611                 :              3 :                     $$ = list_make2($4, makeInteger(0));
                               8612                 :                :                 }
                               8613                 :                :             | '(' aggr_args_list ORDER BY aggr_args_list ')'
                               8614                 :                :                 {
                               8615                 :                :                     /* this is the only case requiring consistency checking */
                               8616                 :             16 :                     $$ = makeOrderedSetArgs($2, $5, yyscanner);
                               8617                 :                :                 }
                               8618                 :                :         ;
                               8619                 :                : 
                               8620                 :                : aggr_args_list:
 3876                          8621                 :            400 :             aggr_arg                                { $$ = list_make1($1); }
                               8622                 :             49 :             | aggr_args_list ',' aggr_arg           { $$ = lappend($1, $3); }
                               8623                 :                :         ;
                               8624                 :                : 
                               8625                 :                : aggregate_with_argtypes:
                               8626                 :                :             func_name aggr_args
                               8627                 :                :                 {
 2664 peter_e@gmx.net          8628                 :            181 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
                               8629                 :                : 
                               8630                 :            181 :                     n->objname = $1;
                               8631                 :            181 :                     n->objargs = extractAggrArgTypes($2);
 1039 tgl@sss.pgh.pa.us        8632                 :            181 :                     n->objfuncargs = (List *) linitial($2);
 2768 peter_e@gmx.net          8633                 :            181 :                     $$ = n;
                               8634                 :                :                 }
                               8635                 :                :         ;
                               8636                 :                : 
                               8637                 :                : aggregate_with_argtypes_list:
 2664                          8638                 :             52 :             aggregate_with_argtypes                 { $$ = list_make1($1); }
                               8639                 :                :             | aggregate_with_argtypes_list ',' aggregate_with_argtypes
 2664 peter_e@gmx.net          8640                 :UBC           0 :                                                     { $$ = lappend($1, $3); }
                               8641                 :                :         ;
                               8642                 :                : 
                               8643                 :                : opt_createfunc_opt_list:
                               8644                 :                :             createfunc_opt_list
 1103 peter@eisentraut.org     8645                 :CBC          23 :             | /*EMPTY*/ { $$ = NIL; }
                               8646                 :                :     ;
                               8647                 :                : 
                               8648                 :                : createfunc_opt_list:
                               8649                 :                :             /* Must be at least one to prevent conflict */
 4548 peter_e@gmx.net          8650                 :          10214 :             createfunc_opt_item                     { $$ = list_make1($1); }
 7971 bruce@momjian.us         8651                 :          26160 :             | createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); }
                               8652                 :                :     ;
                               8653                 :                : 
                               8654                 :                : /*
                               8655                 :                :  * Options common to both CREATE FUNCTION and ALTER FUNCTION
                               8656                 :                :  */
                               8657                 :                : common_func_opt_item:
                               8658                 :                :             CALLED ON NULL_P INPUT_P
                               8659                 :                :                 {
  702 peter@eisentraut.org     8660                 :            126 :                     $$ = makeDefElem("strict", (Node *) makeBoolean(false), @1);
                               8661                 :                :                 }
                               8662                 :                :             | RETURNS NULL_P ON NULL_P INPUT_P
                               8663                 :                :                 {
                               8664                 :            342 :                     $$ = makeDefElem("strict", (Node *) makeBoolean(true), @1);
                               8665                 :                :                 }
                               8666                 :                :             | STRICT_P
                               8667                 :                :                 {
                               8668                 :           5049 :                     $$ = makeDefElem("strict", (Node *) makeBoolean(true), @1);
                               8669                 :                :                 }
                               8670                 :                :             | IMMUTABLE
                               8671                 :                :                 {
                               8672                 :           3922 :                     $$ = makeDefElem("volatility", (Node *) makeString("immutable"), @1);
                               8673                 :                :                 }
                               8674                 :                :             | STABLE
                               8675                 :                :                 {
                               8676                 :            905 :                     $$ = makeDefElem("volatility", (Node *) makeString("stable"), @1);
                               8677                 :                :                 }
                               8678                 :                :             | VOLATILE
                               8679                 :                :                 {
                               8680                 :            649 :                     $$ = makeDefElem("volatility", (Node *) makeString("volatile"), @1);
                               8681                 :                :                 }
                               8682                 :                :             | EXTERNAL SECURITY DEFINER
                               8683                 :                :                 {
  702 peter@eisentraut.org     8684                 :UBC           0 :                     $$ = makeDefElem("security", (Node *) makeBoolean(true), @1);
                               8685                 :                :                 }
                               8686                 :                :             | EXTERNAL SECURITY INVOKER
                               8687                 :                :                 {
                               8688                 :              0 :                     $$ = makeDefElem("security", (Node *) makeBoolean(false), @1);
                               8689                 :                :                 }
                               8690                 :                :             | SECURITY DEFINER
                               8691                 :                :                 {
  702 peter@eisentraut.org     8692                 :CBC          26 :                     $$ = makeDefElem("security", (Node *) makeBoolean(true), @1);
                               8693                 :                :                 }
                               8694                 :                :             | SECURITY INVOKER
                               8695                 :                :                 {
                               8696                 :              6 :                     $$ = makeDefElem("security", (Node *) makeBoolean(false), @1);
                               8697                 :                :                 }
                               8698                 :                :             | LEAKPROOF
                               8699                 :                :                 {
                               8700                 :             23 :                     $$ = makeDefElem("leakproof", (Node *) makeBoolean(true), @1);
                               8701                 :                :                 }
                               8702                 :                :             | NOT LEAKPROOF
                               8703                 :                :                 {
                               8704                 :              6 :                     $$ = makeDefElem("leakproof", (Node *) makeBoolean(false), @1);
                               8705                 :                :                 }
                               8706                 :                :             | COST NumericOnly
                               8707                 :                :                 {
                               8708                 :           1684 :                     $$ = makeDefElem("cost", (Node *) $2, @1);
                               8709                 :                :                 }
                               8710                 :                :             | ROWS NumericOnly
                               8711                 :                :                 {
                               8712                 :            226 :                     $$ = makeDefElem("rows", (Node *) $2, @1);
                               8713                 :                :                 }
                               8714                 :                :             | SUPPORT any_name
                               8715                 :                :                 {
                               8716                 :             46 :                     $$ = makeDefElem("support", (Node *) $2, @1);
                               8717                 :                :                 }
                               8718                 :                :             | FunctionSetResetClause
                               8719                 :                :                 {
                               8720                 :                :                     /* we abuse the normal content of a DefElem here */
                               8721                 :             56 :                     $$ = makeDefElem("set", (Node *) $1, @1);
                               8722                 :                :                 }
                               8723                 :                :             | PARALLEL ColId
                               8724                 :                :                 {
                               8725                 :           5269 :                     $$ = makeDefElem("parallel", (Node *) makeString($2), @1);
                               8726                 :                :                 }
                               8727                 :                :         ;
                               8728                 :                : 
                               8729                 :                : createfunc_opt_item:
                               8730                 :                :             AS func_as
                               8731                 :                :                 {
                               8732                 :           8081 :                     $$ = makeDefElem("as", (Node *) $2, @1);
                               8733                 :                :                 }
                               8734                 :                :             | LANGUAGE NonReservedWord_or_Sconst
                               8735                 :                :                 {
                               8736                 :          10205 :                     $$ = makeDefElem("language", (Node *) makeString($2), @1);
                               8737                 :                :                 }
                               8738                 :                :             | TRANSFORM transform_type_list
                               8739                 :                :                 {
                               8740                 :             59 :                     $$ = makeDefElem("transform", (Node *) $2, @1);
                               8741                 :                :                 }
                               8742                 :                :             | WINDOW
                               8743                 :                :                 {
                               8744                 :             10 :                     $$ = makeDefElem("window", (Node *) makeBoolean(true), @1);
                               8745                 :                :                 }
                               8746                 :                :             | common_func_opt_item
                               8747                 :                :                 {
 6971 neilc@samurai.com        8748                 :          18019 :                     $$ = $1;
                               8749                 :                :                 }
                               8750                 :                :         ;
                               8751                 :                : 
 7259                          8752                 :           6876 : func_as:    Sconst                      { $$ = list_make1(makeString($1)); }
                               8753                 :                :             | Sconst ',' Sconst
                               8754                 :                :                 {
                               8755                 :           1205 :                     $$ = list_make2(makeString($1), makeString($3));
                               8756                 :                :                 }
                               8757                 :                :         ;
                               8758                 :                : 
                               8759                 :                : ReturnStmt: RETURN a_expr
                               8760                 :                :                 {
 1103 peter@eisentraut.org     8761                 :           1854 :                     ReturnStmt *r = makeNode(ReturnStmt);
                               8762                 :                : 
                               8763                 :           1854 :                     r->returnval = (Node *) $2;
                               8764                 :           1854 :                     $$ = (Node *) r;
                               8765                 :                :                 }
                               8766                 :                :         ;
                               8767                 :                : 
                               8768                 :                : opt_routine_body:
                               8769                 :                :             ReturnStmt
                               8770                 :                :                 {
                               8771                 :           1851 :                     $$ = $1;
                               8772                 :                :                 }
                               8773                 :                :             | BEGIN_P ATOMIC routine_body_stmt_list END_P
                               8774                 :                :                 {
                               8775                 :                :                     /*
                               8776                 :                :                      * A compound statement is stored as a single-item list
                               8777                 :                :                      * containing the list of statements as its member.  That
                               8778                 :                :                      * way, the parse analysis code can tell apart an empty
                               8779                 :                :                      * body from no body at all.
                               8780                 :                :                      */
                               8781                 :            308 :                     $$ = (Node *) list_make1($3);
                               8782                 :                :                 }
                               8783                 :                :             | /*EMPTY*/
                               8784                 :                :                 {
                               8785                 :           8078 :                     $$ = NULL;
                               8786                 :                :                 }
                               8787                 :                :         ;
                               8788                 :                : 
                               8789                 :                : routine_body_stmt_list:
                               8790                 :                :             routine_body_stmt_list routine_body_stmt ';'
                               8791                 :                :                 {
                               8792                 :                :                     /* As in stmtmulti, discard empty statements */
 1041 tgl@sss.pgh.pa.us        8793         [ +  + ]:            316 :                     if ($2 != NULL)
                               8794                 :            307 :                         $$ = lappend($1, $2);
                               8795                 :                :                     else
                               8796                 :              9 :                         $$ = $1;
                               8797                 :                :                 }
                               8798                 :                :             | /*EMPTY*/
                               8799                 :                :                 {
 1103 peter@eisentraut.org     8800                 :            308 :                     $$ = NIL;
                               8801                 :                :                 }
                               8802                 :                :         ;
                               8803                 :                : 
                               8804                 :                : routine_body_stmt:
                               8805                 :                :             stmt
                               8806                 :                :             | ReturnStmt
                               8807                 :                :         ;
                               8808                 :                : 
                               8809                 :                : transform_type_list:
 3276 peter_e@gmx.net          8810                 :             59 :             FOR TYPE_P Typename { $$ = list_make1($3); }
                               8811                 :              2 :             | transform_type_list ',' FOR TYPE_P Typename { $$ = lappend($1, $5); }
                               8812                 :                :         ;
                               8813                 :                : 
                               8814                 :                : opt_definition:
 7972 bruce@momjian.us         8815                 :            266 :             WITH definition                         { $$ = $2; }
                               8816                 :           4608 :             | /*EMPTY*/                             { $$ = NIL; }
                               8817                 :                :         ;
                               8818                 :                : 
                               8819                 :                : table_func_column:  param_name func_type
                               8820                 :                :                 {
 5749 tgl@sss.pgh.pa.us        8821                 :            203 :                     FunctionParameter *n = makeNode(FunctionParameter);
                               8822                 :                : 
                               8823                 :            203 :                     n->name = $1;
                               8824                 :            203 :                     n->argType = $2;
                               8825                 :            203 :                     n->mode = FUNC_PARAM_TABLE;
 5596                          8826                 :            203 :                     n->defexpr = NULL;
 5749                          8827                 :            203 :                     $$ = n;
                               8828                 :                :                 }
                               8829                 :                :         ;
                               8830                 :                : 
                               8831                 :                : table_func_column_list:
                               8832                 :                :             table_func_column
                               8833                 :                :                 {
                               8834                 :             94 :                     $$ = list_make1($1);
                               8835                 :                :                 }
                               8836                 :                :             | table_func_column_list ',' table_func_column
                               8837                 :                :                 {
                               8838                 :            109 :                     $$ = lappend($1, $3);
                               8839                 :                :                 }
                               8840                 :                :         ;
                               8841                 :                : 
                               8842                 :                : /*****************************************************************************
                               8843                 :                :  * ALTER FUNCTION / ALTER PROCEDURE / ALTER ROUTINE
                               8844                 :                :  *
                               8845                 :                :  * RENAME and OWNER subcommands are already provided by the generic
                               8846                 :                :  * ALTER infrastructure, here we just specify alterations that can
                               8847                 :                :  * only be applied to functions.
                               8848                 :                :  *
                               8849                 :                :  *****************************************************************************/
                               8850                 :                : AlterFunctionStmt:
                               8851                 :                :             ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict
                               8852                 :                :                 {
 6971 neilc@samurai.com        8853                 :            307 :                     AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
                               8854                 :                : 
 2327 peter_e@gmx.net          8855                 :            307 :                     n->objtype = OBJECT_FUNCTION;
                               8856                 :            307 :                     n->func = $3;
                               8857                 :            307 :                     n->actions = $4;
                               8858                 :            307 :                     $$ = (Node *) n;
                               8859                 :                :                 }
                               8860                 :                :             | ALTER PROCEDURE function_with_argtypes alterfunc_opt_list opt_restrict
                               8861                 :                :                 {
                               8862                 :              9 :                     AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
                               8863                 :                : 
                               8864                 :              9 :                     n->objtype = OBJECT_PROCEDURE;
                               8865                 :              9 :                     n->func = $3;
                               8866                 :              9 :                     n->actions = $4;
                               8867                 :              9 :                     $$ = (Node *) n;
                               8868                 :                :                 }
                               8869                 :                :             | ALTER ROUTINE function_with_argtypes alterfunc_opt_list opt_restrict
                               8870                 :                :                 {
 2327 peter_e@gmx.net          8871                 :UBC           0 :                     AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
                               8872                 :                : 
                               8873                 :              0 :                     n->objtype = OBJECT_ROUTINE;
 6956 tgl@sss.pgh.pa.us        8874                 :              0 :                     n->func = $3;
 6971 neilc@samurai.com        8875                 :              0 :                     n->actions = $4;
                               8876                 :              0 :                     $$ = (Node *) n;
                               8877                 :                :                 }
                               8878                 :                :         ;
                               8879                 :                : 
                               8880                 :                : alterfunc_opt_list:
                               8881                 :                :             /* At least one option must be specified */
 6971 neilc@samurai.com        8882                 :CBC         316 :             common_func_opt_item                    { $$ = list_make1($1); }
 6971 neilc@samurai.com        8883                 :UBC           0 :             | alterfunc_opt_list common_func_opt_item { $$ = lappend($1, $2); }
                               8884                 :                :         ;
                               8885                 :                : 
                               8886                 :                : /* Ignored, merely for SQL compliance */
                               8887                 :                : opt_restrict:
                               8888                 :                :             RESTRICT
                               8889                 :                :             | /* EMPTY */
                               8890                 :                :         ;
                               8891                 :                : 
                               8892                 :                : 
                               8893                 :                : /*****************************************************************************
                               8894                 :                :  *
                               8895                 :                :  *      QUERY:
                               8896                 :                :  *
                               8897                 :                :  *      DROP FUNCTION funcname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
                               8898                 :                :  *      DROP PROCEDURE procname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
                               8899                 :                :  *      DROP ROUTINE routname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
                               8900                 :                :  *      DROP AGGREGATE aggname (arg1, ...) [ RESTRICT | CASCADE ]
                               8901                 :                :  *      DROP OPERATOR opname (leftoperand_typ, rightoperand_typ) [ RESTRICT | CASCADE ]
                               8902                 :                :  *
                               8903                 :                :  *****************************************************************************/
                               8904                 :                : 
                               8905                 :                : RemoveFuncStmt:
                               8906                 :                :             DROP FUNCTION function_with_argtypes_list opt_drop_behavior
                               8907                 :                :                 {
 4532 rhaas@postgresql.org     8908                 :CBC        1557 :                     DropStmt *n = makeNode(DropStmt);
                               8909                 :                : 
                               8910                 :           1557 :                     n->removeType = OBJECT_FUNCTION;
 2664 peter_e@gmx.net          8911                 :           1557 :                     n->objects = $3;
 2768                          8912                 :           1557 :                     n->behavior = $4;
 6512 andrew@dunslane.net      8913                 :           1557 :                     n->missing_ok = false;
 4391 simon@2ndQuadrant.co     8914                 :           1557 :                     n->concurrent = false;
  702 peter@eisentraut.org     8915                 :           1557 :                     $$ = (Node *) n;
                               8916                 :                :                 }
                               8917                 :                :             | DROP FUNCTION IF_P EXISTS function_with_argtypes_list opt_drop_behavior
                               8918                 :                :                 {
 4532 rhaas@postgresql.org     8919                 :            130 :                     DropStmt *n = makeNode(DropStmt);
                               8920                 :                : 
                               8921                 :            130 :                     n->removeType = OBJECT_FUNCTION;
 2664 peter_e@gmx.net          8922                 :            130 :                     n->objects = $5;
 2768                          8923                 :            130 :                     n->behavior = $6;
 6512 andrew@dunslane.net      8924                 :            130 :                     n->missing_ok = true;
 4391 simon@2ndQuadrant.co     8925                 :            130 :                     n->concurrent = false;
  702 peter@eisentraut.org     8926                 :            130 :                     $$ = (Node *) n;
                               8927                 :                :                 }
                               8928                 :                :             | DROP PROCEDURE function_with_argtypes_list opt_drop_behavior
                               8929                 :                :                 {
 2327 peter_e@gmx.net          8930                 :             69 :                     DropStmt *n = makeNode(DropStmt);
                               8931                 :                : 
                               8932                 :             69 :                     n->removeType = OBJECT_PROCEDURE;
                               8933                 :             69 :                     n->objects = $3;
                               8934                 :             69 :                     n->behavior = $4;
                               8935                 :             69 :                     n->missing_ok = false;
                               8936                 :             69 :                     n->concurrent = false;
  702 peter@eisentraut.org     8937                 :             69 :                     $$ = (Node *) n;
                               8938                 :                :                 }
                               8939                 :                :             | DROP PROCEDURE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
                               8940                 :                :                 {
 2327 peter_e@gmx.net          8941                 :              3 :                     DropStmt *n = makeNode(DropStmt);
                               8942                 :                : 
                               8943                 :              3 :                     n->removeType = OBJECT_PROCEDURE;
                               8944                 :              3 :                     n->objects = $5;
                               8945                 :              3 :                     n->behavior = $6;
                               8946                 :              3 :                     n->missing_ok = true;
                               8947                 :              3 :                     n->concurrent = false;
  702 peter@eisentraut.org     8948                 :              3 :                     $$ = (Node *) n;
                               8949                 :                :                 }
                               8950                 :                :             | DROP ROUTINE function_with_argtypes_list opt_drop_behavior
                               8951                 :                :                 {
 2327 peter_e@gmx.net          8952                 :              6 :                     DropStmt *n = makeNode(DropStmt);
                               8953                 :                : 
                               8954                 :              6 :                     n->removeType = OBJECT_ROUTINE;
                               8955                 :              6 :                     n->objects = $3;
                               8956                 :              6 :                     n->behavior = $4;
                               8957                 :              6 :                     n->missing_ok = false;
                               8958                 :              6 :                     n->concurrent = false;
  702 peter@eisentraut.org     8959                 :              6 :                     $$ = (Node *) n;
                               8960                 :                :                 }
                               8961                 :                :             | DROP ROUTINE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
                               8962                 :                :                 {
 2327 peter_e@gmx.net          8963                 :              3 :                     DropStmt *n = makeNode(DropStmt);
                               8964                 :                : 
                               8965                 :              3 :                     n->removeType = OBJECT_ROUTINE;
                               8966                 :              3 :                     n->objects = $5;
                               8967                 :              3 :                     n->behavior = $6;
                               8968                 :              3 :                     n->missing_ok = true;
                               8969                 :              3 :                     n->concurrent = false;
  702 peter@eisentraut.org     8970                 :              3 :                     $$ = (Node *) n;
                               8971                 :                :                 }
                               8972                 :                :         ;
                               8973                 :                : 
                               8974                 :                : RemoveAggrStmt:
                               8975                 :                :             DROP AGGREGATE aggregate_with_argtypes_list opt_drop_behavior
                               8976                 :                :                 {
 4532 rhaas@postgresql.org     8977                 :             37 :                     DropStmt *n = makeNode(DropStmt);
                               8978                 :                : 
                               8979                 :             37 :                     n->removeType = OBJECT_AGGREGATE;
 2664 peter_e@gmx.net          8980                 :             37 :                     n->objects = $3;
 2768                          8981                 :             37 :                     n->behavior = $4;
 6512 andrew@dunslane.net      8982                 :             37 :                     n->missing_ok = false;
 4391 simon@2ndQuadrant.co     8983                 :             37 :                     n->concurrent = false;
  702 peter@eisentraut.org     8984                 :             37 :                     $$ = (Node *) n;
                               8985                 :                :                 }
                               8986                 :                :             | DROP AGGREGATE IF_P EXISTS aggregate_with_argtypes_list opt_drop_behavior
                               8987                 :                :                 {
 4532 rhaas@postgresql.org     8988                 :             15 :                     DropStmt *n = makeNode(DropStmt);
                               8989                 :                : 
                               8990                 :             15 :                     n->removeType = OBJECT_AGGREGATE;
 2664 peter_e@gmx.net          8991                 :             15 :                     n->objects = $5;
 2768                          8992                 :             15 :                     n->behavior = $6;
 6512 andrew@dunslane.net      8993                 :             15 :                     n->missing_ok = true;
 4391 simon@2ndQuadrant.co     8994                 :             15 :                     n->concurrent = false;
  702 peter@eisentraut.org     8995                 :             15 :                     $$ = (Node *) n;
                               8996                 :                :                 }
                               8997                 :                :         ;
                               8998                 :                : 
                               8999                 :                : RemoveOperStmt:
                               9000                 :                :             DROP OPERATOR operator_with_argtypes_list opt_drop_behavior
                               9001                 :                :                 {
 4532 rhaas@postgresql.org     9002                 :             97 :                     DropStmt *n = makeNode(DropStmt);
                               9003                 :                : 
                               9004                 :             97 :                     n->removeType = OBJECT_OPERATOR;
 2664 peter_e@gmx.net          9005                 :             97 :                     n->objects = $3;
                               9006                 :             97 :                     n->behavior = $4;
 6512 andrew@dunslane.net      9007                 :             97 :                     n->missing_ok = false;
 4391 simon@2ndQuadrant.co     9008                 :             97 :                     n->concurrent = false;
  702 peter@eisentraut.org     9009                 :             97 :                     $$ = (Node *) n;
                               9010                 :                :                 }
                               9011                 :                :             | DROP OPERATOR IF_P EXISTS operator_with_argtypes_list opt_drop_behavior
                               9012                 :                :                 {
 4532 rhaas@postgresql.org     9013                 :             15 :                     DropStmt *n = makeNode(DropStmt);
                               9014                 :                : 
                               9015                 :             15 :                     n->removeType = OBJECT_OPERATOR;
 2664 peter_e@gmx.net          9016                 :             15 :                     n->objects = $5;
                               9017                 :             15 :                     n->behavior = $6;
 6512 andrew@dunslane.net      9018                 :             15 :                     n->missing_ok = true;
 4391 simon@2ndQuadrant.co     9019                 :             15 :                     n->concurrent = false;
  702 peter@eisentraut.org     9020                 :             15 :                     $$ = (Node *) n;
                               9021                 :                :                 }
                               9022                 :                :         ;
                               9023                 :                : 
                               9024                 :                : oper_argtypes:
                               9025                 :                :             '(' Typename ')'
                               9026                 :                :                 {
 7575 tgl@sss.pgh.pa.us        9027         [ +  - ]:              6 :                    ereport(ERROR,
                               9028                 :                :                            (errcode(ERRCODE_SYNTAX_ERROR),
                               9029                 :                :                             errmsg("missing argument"),
                               9030                 :                :                             errhint("Use NONE to denote the missing argument of a unary operator."),
                               9031                 :                :                             parser_errposition(@3)));
                               9032                 :                :                 }
                               9033                 :                :             | '(' Typename ',' Typename ')'
 5704                          9034                 :            954 :                     { $$ = list_make2($2, $4); }
                               9035                 :                :             | '(' NONE ',' Typename ')'                 /* left unary */
                               9036                 :             16 :                     { $$ = list_make2(NULL, $4); }
                               9037                 :                :             | '(' Typename ',' NONE ')'                 /* right unary */
                               9038                 :              6 :                     { $$ = list_make2($2, NULL); }
                               9039                 :                :         ;
                               9040                 :                : 
                               9041                 :                : any_operator:
                               9042                 :                :             all_Op
 7259 neilc@samurai.com        9043                 :           9565 :                     { $$ = list_make1(makeString($1)); }
                               9044                 :                :             | ColId '.' any_operator
 7971 bruce@momjian.us         9045                 :           7133 :                     { $$ = lcons(makeString($1), $3); }
                               9046                 :                :         ;
                               9047                 :                : 
                               9048                 :                : operator_with_argtypes_list:
 2664 peter_e@gmx.net          9049                 :            112 :             operator_with_argtypes                  { $$ = list_make1($1); }
                               9050                 :                :             | operator_with_argtypes_list ',' operator_with_argtypes
 2664 peter_e@gmx.net          9051                 :UBC           0 :                                                     { $$ = lappend($1, $3); }
                               9052                 :                :         ;
                               9053                 :                : 
                               9054                 :                : operator_with_argtypes:
                               9055                 :                :             any_operator oper_argtypes
                               9056                 :                :                 {
 2664 peter_e@gmx.net          9057                 :CBC         976 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
                               9058                 :                : 
                               9059                 :            976 :                     n->objname = $1;
                               9060                 :            976 :                     n->objargs = $2;
                               9061                 :            976 :                     $$ = n;
                               9062                 :                :                 }
                               9063                 :                :         ;
                               9064                 :                : 
                               9065                 :                : /*****************************************************************************
                               9066                 :                :  *
                               9067                 :                :  *      DO <anonymous code block> [ LANGUAGE language ]
                               9068                 :                :  *
                               9069                 :                :  * We use a DefElem list for future extensibility, and to allow flexibility
                               9070                 :                :  * in the clause order.
                               9071                 :                :  *
                               9072                 :                :  *****************************************************************************/
                               9073                 :                : 
                               9074                 :                : DoStmt: DO dostmt_opt_list
                               9075                 :                :                 {
 5318 tgl@sss.pgh.pa.us        9076                 :            545 :                     DoStmt *n = makeNode(DoStmt);
                               9077                 :                : 
                               9078                 :            545 :                     n->args = $2;
  702 peter@eisentraut.org     9079                 :            545 :                     $$ = (Node *) n;
                               9080                 :                :                 }
                               9081                 :                :         ;
                               9082                 :                : 
                               9083                 :                : dostmt_opt_list:
 5318 tgl@sss.pgh.pa.us        9084                 :            545 :             dostmt_opt_item                     { $$ = list_make1($1); }
                               9085                 :             98 :             | dostmt_opt_list dostmt_opt_item   { $$ = lappend($1, $2); }
                               9086                 :                :         ;
                               9087                 :                : 
                               9088                 :                : dostmt_opt_item:
                               9089                 :                :             Sconst
                               9090                 :                :                 {
  702 peter@eisentraut.org     9091                 :            545 :                     $$ = makeDefElem("as", (Node *) makeString($1), @1);
                               9092                 :                :                 }
                               9093                 :                :             | LANGUAGE NonReservedWord_or_Sconst
                               9094                 :                :                 {
                               9095                 :             98 :                     $$ = makeDefElem("language", (Node *) makeString($2), @1);
                               9096                 :                :                 }
                               9097                 :                :         ;
                               9098                 :                : 
                               9099                 :                : /*****************************************************************************
                               9100                 :                :  *
                               9101                 :                :  *      CREATE CAST / DROP CAST
                               9102                 :                :  *
                               9103                 :                :  *****************************************************************************/
                               9104                 :                : 
                               9105                 :                : CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
                               9106                 :                :                     WITH FUNCTION function_with_argtypes cast_context
                               9107                 :                :                 {
 7941 peter_e@gmx.net          9108                 :             51 :                     CreateCastStmt *n = makeNode(CreateCastStmt);
                               9109                 :                : 
                               9110                 :             51 :                     n->sourcetype = $4;
                               9111                 :             51 :                     n->targettype = $6;
 6956 tgl@sss.pgh.pa.us        9112                 :             51 :                     n->func = $10;
 7879                          9113                 :             51 :                     n->context = (CoercionContext) $11;
 5644 heikki.linnakangas@i     9114                 :             51 :                     n->inout = false;
  702 peter@eisentraut.org     9115                 :             51 :                     $$ = (Node *) n;
                               9116                 :                :                 }
                               9117                 :                :             | CREATE CAST '(' Typename AS Typename ')'
                               9118                 :                :                     WITHOUT FUNCTION cast_context
                               9119                 :                :                 {
 7941 peter_e@gmx.net          9120                 :             81 :                     CreateCastStmt *n = makeNode(CreateCastStmt);
                               9121                 :                : 
                               9122                 :             81 :                     n->sourcetype = $4;
                               9123                 :             81 :                     n->targettype = $6;
                               9124                 :             81 :                     n->func = NULL;
 7879 tgl@sss.pgh.pa.us        9125                 :             81 :                     n->context = (CoercionContext) $10;
 5644 heikki.linnakangas@i     9126                 :             81 :                     n->inout = false;
  702 peter@eisentraut.org     9127                 :             81 :                     $$ = (Node *) n;
                               9128                 :                :                 }
                               9129                 :                :             | CREATE CAST '(' Typename AS Typename ')'
                               9130                 :                :                     WITH INOUT cast_context
                               9131                 :                :                 {
 5644 heikki.linnakangas@i     9132                 :              3 :                     CreateCastStmt *n = makeNode(CreateCastStmt);
                               9133                 :                : 
                               9134                 :              3 :                     n->sourcetype = $4;
                               9135                 :              3 :                     n->targettype = $6;
                               9136                 :              3 :                     n->func = NULL;
                               9137                 :              3 :                     n->context = (CoercionContext) $10;
                               9138                 :              3 :                     n->inout = true;
  702 peter@eisentraut.org     9139                 :              3 :                     $$ = (Node *) n;
                               9140                 :                :                 }
                               9141                 :                :         ;
                               9142                 :                : 
 7879 tgl@sss.pgh.pa.us        9143                 :             15 : cast_context:  AS IMPLICIT_P                    { $$ = COERCION_IMPLICIT; }
                               9144                 :             29 :         | AS ASSIGNMENT                         { $$ = COERCION_ASSIGNMENT; }
                               9145                 :             91 :         | /*EMPTY*/                             { $$ = COERCION_EXPLICIT; }
                               9146                 :                :         ;
                               9147                 :                : 
                               9148                 :                : 
                               9149                 :                : DropCastStmt: DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior
                               9150                 :                :                 {
 4532 rhaas@postgresql.org     9151                 :             27 :                     DropStmt *n = makeNode(DropStmt);
                               9152                 :                : 
                               9153                 :             27 :                     n->removeType = OBJECT_CAST;
 2710 peter_e@gmx.net          9154                 :             27 :                     n->objects = list_make1(list_make2($5, $7));
 6512 andrew@dunslane.net      9155                 :             27 :                     n->behavior = $9;
      tgl@sss.pgh.pa.us        9156                 :             27 :                     n->missing_ok = $3;
 4391 simon@2ndQuadrant.co     9157                 :             27 :                     n->concurrent = false;
  702 peter@eisentraut.org     9158                 :             27 :                     $$ = (Node *) n;
                               9159                 :                :                 }
                               9160                 :                :         ;
                               9161                 :                : 
 2433 peter_e@gmx.net          9162                 :             18 : opt_if_exists: IF_P EXISTS                      { $$ = true; }
                               9163                 :             16 :         | /*EMPTY*/                             { $$ = false; }
                               9164                 :                :         ;
                               9165                 :                : 
                               9166                 :                : 
                               9167                 :                : /*****************************************************************************
                               9168                 :                :  *
                               9169                 :                :  *      CREATE TRANSFORM / DROP TRANSFORM
                               9170                 :                :  *
                               9171                 :                :  *****************************************************************************/
                               9172                 :                : 
                               9173                 :                : CreateTransformStmt: CREATE opt_or_replace TRANSFORM FOR Typename LANGUAGE name '(' transform_element_list ')'
                               9174                 :                :                 {
 3276                          9175                 :             25 :                     CreateTransformStmt *n = makeNode(CreateTransformStmt);
                               9176                 :                : 
                               9177                 :             25 :                     n->replace = $2;
                               9178                 :             25 :                     n->type_name = $5;
                               9179                 :             25 :                     n->lang = $7;
                               9180                 :             25 :                     n->fromsql = linitial($9);
                               9181                 :             25 :                     n->tosql = lsecond($9);
  702 peter@eisentraut.org     9182                 :             25 :                     $$ = (Node *) n;
                               9183                 :                :                 }
                               9184                 :                :         ;
                               9185                 :                : 
                               9186                 :                : transform_element_list: FROM SQL_P WITH FUNCTION function_with_argtypes ',' TO SQL_P WITH FUNCTION function_with_argtypes
                               9187                 :                :                 {
 3276 peter_e@gmx.net          9188                 :             22 :                     $$ = list_make2($5, $11);
                               9189                 :                :                 }
                               9190                 :                :                 | TO SQL_P WITH FUNCTION function_with_argtypes ',' FROM SQL_P WITH FUNCTION function_with_argtypes
                               9191                 :                :                 {
 3276 peter_e@gmx.net          9192                 :UBC           0 :                     $$ = list_make2($11, $5);
                               9193                 :                :                 }
                               9194                 :                :                 | FROM SQL_P WITH FUNCTION function_with_argtypes
                               9195                 :                :                 {
 3276 peter_e@gmx.net          9196                 :CBC           2 :                     $$ = list_make2($5, NULL);
                               9197                 :                :                 }
                               9198                 :                :                 | TO SQL_P WITH FUNCTION function_with_argtypes
                               9199                 :                :                 {
                               9200                 :              1 :                     $$ = list_make2(NULL, $5);
                               9201                 :                :                 }
                               9202                 :                :         ;
                               9203                 :                : 
                               9204                 :                : 
                               9205                 :                : DropTransformStmt: DROP TRANSFORM opt_if_exists FOR Typename LANGUAGE name opt_drop_behavior
                               9206                 :                :                 {
                               9207                 :              7 :                     DropStmt *n = makeNode(DropStmt);
                               9208                 :                : 
                               9209                 :              7 :                     n->removeType = OBJECT_TRANSFORM;
 2710                          9210                 :              7 :                     n->objects = list_make1(list_make2($5, makeString($7)));
 3276                          9211                 :              7 :                     n->behavior = $8;
                               9212                 :              7 :                     n->missing_ok = $3;
  702 peter@eisentraut.org     9213                 :              7 :                     $$ = (Node *) n;
                               9214                 :                :                 }
                               9215                 :                :         ;
                               9216                 :                : 
                               9217                 :                : 
                               9218                 :                : /*****************************************************************************
                               9219                 :                :  *
                               9220                 :                :  *      QUERY:
                               9221                 :                :  *
                               9222                 :                :  *      REINDEX [ (options) ] {INDEX | TABLE | SCHEMA} [CONCURRENTLY] <name>
                               9223                 :                :  *      REINDEX [ (options) ] {DATABASE | SYSTEM} [CONCURRENTLY] [<name>]
                               9224                 :                :  *****************************************************************************/
                               9225                 :                : 
                               9226                 :                : ReindexStmt:
                               9227                 :                :             REINDEX opt_reindex_option_list reindex_target_relation opt_concurrently qualified_name
                               9228                 :                :                 {
 8822 inoue@tpf.co.jp          9229                 :            432 :                     ReindexStmt *n = makeNode(ReindexStmt);
                               9230                 :                : 
  632 alvherre@alvh.no-ip.     9231                 :            432 :                     n->kind = $3;
                               9232                 :            432 :                     n->relation = $5;
 8060 tgl@sss.pgh.pa.us        9233                 :            432 :                     n->name = NULL;
  632 alvherre@alvh.no-ip.     9234                 :            432 :                     n->params = $2;
                               9235         [ +  + ]:            432 :                     if ($4)
 1228 michael@paquier.xyz      9236                 :            242 :                         n->params = lappend(n->params,
  632 alvherre@alvh.no-ip.     9237                 :            242 :                                             makeDefElem("concurrently", NULL, @4));
  702 peter@eisentraut.org     9238                 :            432 :                     $$ = (Node *) n;
                               9239                 :                :                 }
                               9240                 :                :             | REINDEX opt_reindex_option_list SCHEMA opt_concurrently name
                               9241                 :                :                 {
 3414 simon@2ndQuadrant.co     9242                 :             58 :                     ReindexStmt *n = makeNode(ReindexStmt);
                               9243                 :                : 
  632 alvherre@alvh.no-ip.     9244                 :             58 :                     n->kind = REINDEX_OBJECT_SCHEMA;
 3414 simon@2ndQuadrant.co     9245                 :             58 :                     n->relation = NULL;
  628 michael@paquier.xyz      9246                 :             58 :                     n->name = $5;
  632 alvherre@alvh.no-ip.     9247                 :             58 :                     n->params = $2;
                               9248         [ +  + ]:             58 :                     if ($4)
 1228 michael@paquier.xyz      9249                 :             20 :                         n->params = lappend(n->params,
  632 alvherre@alvh.no-ip.     9250                 :             20 :                                             makeDefElem("concurrently", NULL, @4));
  702 peter@eisentraut.org     9251                 :             58 :                     $$ = (Node *) n;
                               9252                 :                :                 }
                               9253                 :                :             | REINDEX opt_reindex_option_list reindex_target_all opt_concurrently opt_single_name
                               9254                 :                :                 {
 8060 tgl@sss.pgh.pa.us        9255                 :             34 :                     ReindexStmt *n = makeNode(ReindexStmt);
                               9256                 :                : 
  628 michael@paquier.xyz      9257                 :             34 :                     n->kind = $3;
 8060 tgl@sss.pgh.pa.us        9258                 :             34 :                     n->relation = NULL;
  628 michael@paquier.xyz      9259                 :             34 :                     n->name = $5;
  632 alvherre@alvh.no-ip.     9260                 :             34 :                     n->params = $2;
  628 michael@paquier.xyz      9261         [ +  + ]:             34 :                     if ($4)
                               9262                 :              5 :                         n->params = lappend(n->params,
                               9263                 :              5 :                                             makeDefElem("concurrently", NULL, @4));
  702 peter@eisentraut.org     9264                 :             34 :                     $$ = (Node *) n;
                               9265                 :                :                 }
                               9266                 :                :         ;
                               9267                 :                : reindex_target_relation:
 3257 fujii@postgresql.org     9268                 :            183 :             INDEX                   { $$ = REINDEX_OBJECT_INDEX; }
                               9269                 :            249 :             | TABLE                 { $$ = REINDEX_OBJECT_TABLE; }
                               9270                 :                :         ;
                               9271                 :                : reindex_target_all:
  628 michael@paquier.xyz      9272                 :             17 :             SYSTEM_P                { $$ = REINDEX_OBJECT_SYSTEM; }
                               9273                 :             17 :             | DATABASE              { $$ = REINDEX_OBJECT_DATABASE; }
                               9274                 :                :         ;
                               9275                 :                : opt_reindex_option_list:
  632 alvherre@alvh.no-ip.     9276                 :             78 :             '(' utility_option_list ')'             { $$ = $2; }
                               9277                 :            446 :             | /* EMPTY */                           { $$ = NULL; }
                               9278                 :                :         ;
                               9279                 :                : 
                               9280                 :                : /*****************************************************************************
                               9281                 :                :  *
                               9282                 :                :  * ALTER TABLESPACE
                               9283                 :                :  *
                               9284                 :                :  *****************************************************************************/
                               9285                 :                : 
                               9286                 :                : AlterTblSpcStmt:
                               9287                 :                :             ALTER TABLESPACE name SET reloptions
                               9288                 :                :                 {
 3654 sfrost@snowman.net       9289                 :ECB         (6) :                     AlterTableSpaceOptionsStmt *n =
 3654 sfrost@snowman.net       9290                 :CBC           6 :                         makeNode(AlterTableSpaceOptionsStmt);
                               9291                 :                : 
                               9292                 :              6 :                     n->tablespacename = $3;
                               9293                 :              6 :                     n->options = $5;
 2433 peter_e@gmx.net          9294                 :              6 :                     n->isReset = false;
  702 peter@eisentraut.org     9295                 :              6 :                     $$ = (Node *) n;
                               9296                 :                :                 }
                               9297                 :                :             | ALTER TABLESPACE name RESET reloptions
                               9298                 :                :                 {
 3654 sfrost@snowman.net       9299                 :ECB         (6) :                     AlterTableSpaceOptionsStmt *n =
 3654 sfrost@snowman.net       9300                 :CBC           6 :                         makeNode(AlterTableSpaceOptionsStmt);
                               9301                 :                : 
                               9302                 :              6 :                     n->tablespacename = $3;
                               9303                 :              6 :                     n->options = $5;
 2433 peter_e@gmx.net          9304                 :              6 :                     n->isReset = true;
  702 peter@eisentraut.org     9305                 :              6 :                     $$ = (Node *) n;
                               9306                 :                :                 }
                               9307                 :                :         ;
                               9308                 :                : 
                               9309                 :                : /*****************************************************************************
                               9310                 :                :  *
                               9311                 :                :  * ALTER THING name RENAME TO newname
                               9312                 :                :  *
                               9313                 :                :  *****************************************************************************/
                               9314                 :                : 
                               9315                 :                : RenameStmt: ALTER AGGREGATE aggregate_with_argtypes RENAME TO name
                               9316                 :                :                 {
 7597 peter_e@gmx.net          9317                 :             21 :                     RenameStmt *n = makeNode(RenameStmt);
                               9318                 :                : 
                               9319                 :             21 :                     n->renameType = OBJECT_AGGREGATE;
 2710                          9320                 :             21 :                     n->object = (Node *) $3;
 2768                          9321                 :             21 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9322                 :             21 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9323                 :             21 :                     $$ = (Node *) n;
                               9324                 :                :                 }
                               9325                 :                :             | ALTER COLLATION any_name RENAME TO name
                               9326                 :                :                 {
 4810 peter_e@gmx.net          9327                 :              9 :                     RenameStmt *n = makeNode(RenameStmt);
                               9328                 :                : 
                               9329                 :              9 :                     n->renameType = OBJECT_COLLATION;
 2710                          9330                 :              9 :                     n->object = (Node *) $3;
 4810                          9331                 :              9 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9332                 :              9 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9333                 :              9 :                     $$ = (Node *) n;
                               9334                 :                :                 }
                               9335                 :                :             | ALTER CONVERSION_P any_name RENAME TO name
                               9336                 :                :                 {
 7597 peter_e@gmx.net          9337                 :             12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9338                 :                : 
                               9339                 :             12 :                     n->renameType = OBJECT_CONVERSION;
 2710                          9340                 :             12 :                     n->object = (Node *) $3;
 7597                          9341                 :             12 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9342                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9343                 :             12 :                     $$ = (Node *) n;
                               9344                 :                :                 }
                               9345                 :                :             | ALTER DATABASE name RENAME TO name
                               9346                 :                :                 {
 7597 peter_e@gmx.net          9347                 :UBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9348                 :                : 
                               9349                 :              0 :                     n->renameType = OBJECT_DATABASE;
                               9350                 :              0 :                     n->subname = $3;
                               9351                 :              0 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9352                 :              0 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9353                 :              0 :                     $$ = (Node *) n;
                               9354                 :                :                 }
                               9355                 :                :             | ALTER DOMAIN_P any_name RENAME TO name
                               9356                 :                :                 {
 4497 peter_e@gmx.net          9357                 :CBC           3 :                     RenameStmt *n = makeNode(RenameStmt);
                               9358                 :                : 
                               9359                 :              3 :                     n->renameType = OBJECT_DOMAIN;
 2710                          9360                 :              3 :                     n->object = (Node *) $3;
 4497                          9361                 :              3 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9362                 :              3 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9363                 :              3 :                     $$ = (Node *) n;
                               9364                 :                :                 }
                               9365                 :                :             | ALTER DOMAIN_P any_name RENAME CONSTRAINT name TO name
                               9366                 :                :                 {
 4394 peter_e@gmx.net          9367                 :              3 :                     RenameStmt *n = makeNode(RenameStmt);
                               9368                 :                : 
 3400 alvherre@alvh.no-ip.     9369                 :              3 :                     n->renameType = OBJECT_DOMCONSTRAINT;
 2710 peter_e@gmx.net          9370                 :              3 :                     n->object = (Node *) $3;
 4394                          9371                 :              3 :                     n->subname = $6;
                               9372                 :              3 :                     n->newname = $8;
  702 peter@eisentraut.org     9373                 :              3 :                     $$ = (Node *) n;
                               9374                 :                :                 }
                               9375                 :                :             | ALTER FOREIGN DATA_P WRAPPER name RENAME TO name
                               9376                 :                :                 {
 4510 peter_e@gmx.net          9377                 :             12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9378                 :                : 
                               9379                 :             12 :                     n->renameType = OBJECT_FDW;
 2710                          9380                 :             12 :                     n->object = (Node *) makeString($5);
 4510                          9381                 :             12 :                     n->newname = $8;
 4465 simon@2ndQuadrant.co     9382                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9383                 :             12 :                     $$ = (Node *) n;
                               9384                 :                :                 }
                               9385                 :                :             | ALTER FUNCTION function_with_argtypes RENAME TO name
                               9386                 :                :                 {
 7597 peter_e@gmx.net          9387                 :             12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9388                 :                : 
                               9389                 :             12 :                     n->renameType = OBJECT_FUNCTION;
 2710                          9390                 :             12 :                     n->object = (Node *) $3;
 6068 tgl@sss.pgh.pa.us        9391                 :             12 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9392                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9393                 :             12 :                     $$ = (Node *) n;
                               9394                 :                :                 }
                               9395                 :                :             | ALTER GROUP_P RoleId RENAME TO RoleId
                               9396                 :                :                 {
 7597 peter_e@gmx.net          9397                 :UBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9398                 :                : 
 6865 tgl@sss.pgh.pa.us        9399                 :              0 :                     n->renameType = OBJECT_ROLE;
 7597 peter_e@gmx.net          9400                 :              0 :                     n->subname = $3;
                               9401                 :              0 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9402                 :              0 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9403                 :              0 :                     $$ = (Node *) n;
                               9404                 :                :                 }
                               9405                 :                :             | ALTER opt_procedural LANGUAGE name RENAME TO name
                               9406                 :                :                 {
 7597 peter_e@gmx.net          9407                 :CBC           9 :                     RenameStmt *n = makeNode(RenameStmt);
                               9408                 :                : 
                               9409                 :              9 :                     n->renameType = OBJECT_LANGUAGE;
 2710                          9410                 :              9 :                     n->object = (Node *) makeString($4);
 6229 tgl@sss.pgh.pa.us        9411                 :              9 :                     n->newname = $7;
 4465 simon@2ndQuadrant.co     9412                 :              9 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9413                 :              9 :                     $$ = (Node *) n;
                               9414                 :                :                 }
                               9415                 :                :             | ALTER OPERATOR CLASS any_name USING name RENAME TO name
                               9416                 :                :                 {
 7597 peter_e@gmx.net          9417                 :             12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9418                 :                : 
                               9419                 :             12 :                     n->renameType = OBJECT_OPCLASS;
 2710                          9420                 :             12 :                     n->object = (Node *) lcons(makeString($6), $4);
 7597                          9421                 :             12 :                     n->newname = $9;
 4465 simon@2ndQuadrant.co     9422                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9423                 :             12 :                     $$ = (Node *) n;
                               9424                 :                :                 }
                               9425                 :                :             | ALTER OPERATOR FAMILY any_name USING name RENAME TO name
                               9426                 :                :                 {
 6291 tgl@sss.pgh.pa.us        9427                 :             12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9428                 :                : 
                               9429                 :             12 :                     n->renameType = OBJECT_OPFAMILY;
 2710 peter_e@gmx.net          9430                 :             12 :                     n->object = (Node *) lcons(makeString($6), $4);
 6291 tgl@sss.pgh.pa.us        9431                 :             12 :                     n->newname = $9;
 4465 simon@2ndQuadrant.co     9432                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9433                 :             12 :                     $$ = (Node *) n;
                               9434                 :                :                 }
                               9435                 :                :             | ALTER POLICY name ON qualified_name RENAME TO name
                               9436                 :                :                 {
 3495 sfrost@snowman.net       9437                 :              9 :                     RenameStmt *n = makeNode(RenameStmt);
                               9438                 :                : 
                               9439                 :              9 :                     n->renameType = OBJECT_POLICY;
                               9440                 :              9 :                     n->relation = $5;
                               9441                 :              9 :                     n->subname = $3;
                               9442                 :              9 :                     n->newname = $8;
                               9443                 :              9 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9444                 :              9 :                     $$ = (Node *) n;
                               9445                 :                :                 }
                               9446                 :                :             | ALTER POLICY IF_P EXISTS name ON qualified_name RENAME TO name
                               9447                 :                :                 {
 3495 sfrost@snowman.net       9448                 :UBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9449                 :                : 
                               9450                 :              0 :                     n->renameType = OBJECT_POLICY;
                               9451                 :              0 :                     n->relation = $7;
                               9452                 :              0 :                     n->subname = $5;
                               9453                 :              0 :                     n->newname = $10;
                               9454                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9455                 :              0 :                     $$ = (Node *) n;
                               9456                 :                :                 }
                               9457                 :                :             | ALTER PROCEDURE function_with_argtypes RENAME TO name
                               9458                 :                :                 {
 2327 peter_e@gmx.net          9459                 :              0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9460                 :                : 
                               9461                 :              0 :                     n->renameType = OBJECT_PROCEDURE;
                               9462                 :              0 :                     n->object = (Node *) $3;
                               9463                 :              0 :                     n->newname = $6;
                               9464                 :              0 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9465                 :              0 :                     $$ = (Node *) n;
                               9466                 :                :                 }
                               9467                 :                :             | ALTER PUBLICATION name RENAME TO name
                               9468                 :                :                 {
 2599 peter_e@gmx.net          9469                 :CBC           9 :                     RenameStmt *n = makeNode(RenameStmt);
                               9470                 :                : 
                               9471                 :              9 :                     n->renameType = OBJECT_PUBLICATION;
 2710                          9472                 :              9 :                     n->object = (Node *) makeString($3);
 2599                          9473                 :              9 :                     n->newname = $6;
                               9474                 :              9 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9475                 :              9 :                     $$ = (Node *) n;
                               9476                 :                :                 }
                               9477                 :                :             | ALTER ROUTINE function_with_argtypes RENAME TO name
                               9478                 :                :                 {
 2327 peter_e@gmx.net          9479                 :             12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9480                 :                : 
                               9481                 :             12 :                     n->renameType = OBJECT_ROUTINE;
                               9482                 :             12 :                     n->object = (Node *) $3;
                               9483                 :             12 :                     n->newname = $6;
                               9484                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9485                 :             12 :                     $$ = (Node *) n;
                               9486                 :                :                 }
                               9487                 :                :             | ALTER SCHEMA name RENAME TO name
                               9488                 :                :                 {
 7597 peter_e@gmx.net          9489                 :             10 :                     RenameStmt *n = makeNode(RenameStmt);
                               9490                 :                : 
                               9491                 :             10 :                     n->renameType = OBJECT_SCHEMA;
                               9492                 :             10 :                     n->subname = $3;
                               9493                 :             10 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9494                 :             10 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9495                 :             10 :                     $$ = (Node *) n;
                               9496                 :                :                 }
                               9497                 :                :             | ALTER SERVER name RENAME TO name
                               9498                 :                :                 {
 4510 peter_e@gmx.net          9499                 :             12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9500                 :                : 
                               9501                 :             12 :                     n->renameType = OBJECT_FOREIGN_SERVER;
 2710                          9502                 :             12 :                     n->object = (Node *) makeString($3);
 4510                          9503                 :             12 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9504                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9505                 :             12 :                     $$ = (Node *) n;
                               9506                 :                :                 }
                               9507                 :                :             | ALTER SUBSCRIPTION name RENAME TO name
                               9508                 :                :                 {
 2599 peter_e@gmx.net          9509                 :             19 :                     RenameStmt *n = makeNode(RenameStmt);
                               9510                 :                : 
                               9511                 :             19 :                     n->renameType = OBJECT_SUBSCRIPTION;
 2710                          9512                 :             19 :                     n->object = (Node *) makeString($3);
 2599                          9513                 :             19 :                     n->newname = $6;
                               9514                 :             19 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9515                 :             19 :                     $$ = (Node *) n;
                               9516                 :                :                 }
                               9517                 :                :             | ALTER TABLE relation_expr RENAME TO name
                               9518                 :                :                 {
 9715 bruce@momjian.us         9519                 :            143 :                     RenameStmt *n = makeNode(RenameStmt);
                               9520                 :                : 
 7284 tgl@sss.pgh.pa.us        9521                 :            143 :                     n->renameType = OBJECT_TABLE;
                               9522                 :            143 :                     n->relation = $3;
                               9523                 :            143 :                     n->subname = NULL;
                               9524                 :            143 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9525                 :            143 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9526                 :            143 :                     $$ = (Node *) n;
                               9527                 :                :                 }
                               9528                 :                :             | ALTER TABLE IF_P EXISTS relation_expr RENAME TO name
                               9529                 :                :                 {
 4465 simon@2ndQuadrant.co     9530                 :UBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9531                 :                : 
                               9532                 :              0 :                     n->renameType = OBJECT_TABLE;
                               9533                 :              0 :                     n->relation = $5;
                               9534                 :              0 :                     n->subname = NULL;
                               9535                 :              0 :                     n->newname = $8;
                               9536                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9537                 :              0 :                     $$ = (Node *) n;
                               9538                 :                :                 }
                               9539                 :                :             | ALTER SEQUENCE qualified_name RENAME TO name
                               9540                 :                :                 {
 6130 neilc@samurai.com        9541                 :CBC           1 :                     RenameStmt *n = makeNode(RenameStmt);
                               9542                 :                : 
                               9543                 :              1 :                     n->renameType = OBJECT_SEQUENCE;
                               9544                 :              1 :                     n->relation = $3;
                               9545                 :              1 :                     n->subname = NULL;
                               9546                 :              1 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9547                 :              1 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9548                 :              1 :                     $$ = (Node *) n;
                               9549                 :                :                 }
                               9550                 :                :             | ALTER SEQUENCE IF_P EXISTS qualified_name RENAME TO name
                               9551                 :                :                 {
 4465 simon@2ndQuadrant.co     9552                 :UBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9553                 :                : 
                               9554                 :              0 :                     n->renameType = OBJECT_SEQUENCE;
                               9555                 :              0 :                     n->relation = $5;
                               9556                 :              0 :                     n->subname = NULL;
                               9557                 :              0 :                     n->newname = $8;
                               9558                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9559                 :              0 :                     $$ = (Node *) n;
                               9560                 :                :                 }
                               9561                 :                :             | ALTER VIEW qualified_name RENAME TO name
                               9562                 :                :                 {
 6130 neilc@samurai.com        9563                 :CBC           3 :                     RenameStmt *n = makeNode(RenameStmt);
                               9564                 :                : 
                               9565                 :              3 :                     n->renameType = OBJECT_VIEW;
                               9566                 :              3 :                     n->relation = $3;
                               9567                 :              3 :                     n->subname = NULL;
                               9568                 :              3 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9569                 :              3 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9570                 :              3 :                     $$ = (Node *) n;
                               9571                 :                :                 }
                               9572                 :                :             | ALTER VIEW IF_P EXISTS qualified_name RENAME TO name
                               9573                 :                :                 {
 4465 simon@2ndQuadrant.co     9574                 :UBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9575                 :                : 
                               9576                 :              0 :                     n->renameType = OBJECT_VIEW;
                               9577                 :              0 :                     n->relation = $5;
                               9578                 :              0 :                     n->subname = NULL;
                               9579                 :              0 :                     n->newname = $8;
                               9580                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9581                 :              0 :                     $$ = (Node *) n;
                               9582                 :                :                 }
                               9583                 :                :             | ALTER MATERIALIZED VIEW qualified_name RENAME TO name
                               9584                 :                :                 {
 4060 kgrittn@postgresql.o     9585                 :              0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9586                 :                : 
                               9587                 :              0 :                     n->renameType = OBJECT_MATVIEW;
                               9588                 :              0 :                     n->relation = $4;
                               9589                 :              0 :                     n->subname = NULL;
                               9590                 :              0 :                     n->newname = $7;
                               9591                 :              0 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9592                 :              0 :                     $$ = (Node *) n;
                               9593                 :                :                 }
                               9594                 :                :             | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME TO name
                               9595                 :                :                 {
 4060 kgrittn@postgresql.o     9596                 :              0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9597                 :                : 
                               9598                 :              0 :                     n->renameType = OBJECT_MATVIEW;
                               9599                 :              0 :                     n->relation = $6;
                               9600                 :              0 :                     n->subname = NULL;
                               9601                 :              0 :                     n->newname = $9;
                               9602                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9603                 :              0 :                     $$ = (Node *) n;
                               9604                 :                :                 }
                               9605                 :                :             | ALTER INDEX qualified_name RENAME TO name
                               9606                 :                :                 {
 7177 bruce@momjian.us         9607                 :CBC          96 :                     RenameStmt *n = makeNode(RenameStmt);
                               9608                 :                : 
                               9609                 :             96 :                     n->renameType = OBJECT_INDEX;
                               9610                 :             96 :                     n->relation = $3;
                               9611                 :             96 :                     n->subname = NULL;
                               9612                 :             96 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9613                 :             96 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9614                 :             96 :                     $$ = (Node *) n;
                               9615                 :                :                 }
                               9616                 :                :             | ALTER INDEX IF_P EXISTS qualified_name RENAME TO name
                               9617                 :                :                 {
 4465 simon@2ndQuadrant.co     9618                 :              6 :                     RenameStmt *n = makeNode(RenameStmt);
                               9619                 :                : 
                               9620                 :              6 :                     n->renameType = OBJECT_INDEX;
                               9621                 :              6 :                     n->relation = $5;
                               9622                 :              6 :                     n->subname = NULL;
                               9623                 :              6 :                     n->newname = $8;
                               9624                 :              6 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9625                 :              6 :                     $$ = (Node *) n;
                               9626                 :                :                 }
                               9627                 :                :             | ALTER FOREIGN TABLE relation_expr RENAME TO name
                               9628                 :                :                 {
 4852 rhaas@postgresql.org     9629                 :              3 :                     RenameStmt *n = makeNode(RenameStmt);
                               9630                 :                : 
                               9631                 :              3 :                     n->renameType = OBJECT_FOREIGN_TABLE;
                               9632                 :              3 :                     n->relation = $4;
                               9633                 :              3 :                     n->subname = NULL;
                               9634                 :              3 :                     n->newname = $7;
 4465 simon@2ndQuadrant.co     9635                 :              3 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9636                 :              3 :                     $$ = (Node *) n;
                               9637                 :                :                 }
                               9638                 :                :             | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME TO name
                               9639                 :                :                 {
 4465 simon@2ndQuadrant.co     9640                 :              3 :                     RenameStmt *n = makeNode(RenameStmt);
                               9641                 :                : 
                               9642                 :              3 :                     n->renameType = OBJECT_FOREIGN_TABLE;
                               9643                 :              3 :                     n->relation = $6;
                               9644                 :              3 :                     n->subname = NULL;
                               9645                 :              3 :                     n->newname = $9;
                               9646                 :              3 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9647                 :              3 :                     $$ = (Node *) n;
                               9648                 :                :                 }
                               9649                 :                :             | ALTER TABLE relation_expr RENAME opt_column name TO name
                               9650                 :                :                 {
 7284 tgl@sss.pgh.pa.us        9651                 :            119 :                     RenameStmt *n = makeNode(RenameStmt);
                               9652                 :                : 
                               9653                 :            119 :                     n->renameType = OBJECT_COLUMN;
 4852 rhaas@postgresql.org     9654                 :            119 :                     n->relationType = OBJECT_TABLE;
 8060 tgl@sss.pgh.pa.us        9655                 :            119 :                     n->relation = $3;
 7597 peter_e@gmx.net          9656                 :            119 :                     n->subname = $6;
 8378 tgl@sss.pgh.pa.us        9657                 :            119 :                     n->newname = $8;
 4465 simon@2ndQuadrant.co     9658                 :            119 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9659                 :            119 :                     $$ = (Node *) n;
                               9660                 :                :                 }
                               9661                 :                :             | ALTER TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
                               9662                 :                :                 {
 4465 simon@2ndQuadrant.co     9663                 :             12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9664                 :                : 
                               9665                 :             12 :                     n->renameType = OBJECT_COLUMN;
                               9666                 :             12 :                     n->relationType = OBJECT_TABLE;
                               9667                 :             12 :                     n->relation = $5;
                               9668                 :             12 :                     n->subname = $8;
                               9669                 :             12 :                     n->newname = $10;
                               9670                 :             12 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9671                 :             12 :                     $$ = (Node *) n;
                               9672                 :                :                 }
                               9673                 :                :             | ALTER VIEW qualified_name RENAME opt_column name TO name
                               9674                 :                :                 {
 1606 fujii@postgresql.org     9675                 :              3 :                     RenameStmt *n = makeNode(RenameStmt);
                               9676                 :                : 
                               9677                 :              3 :                     n->renameType = OBJECT_COLUMN;
                               9678                 :              3 :                     n->relationType = OBJECT_VIEW;
                               9679                 :              3 :                     n->relation = $3;
                               9680                 :              3 :                     n->subname = $6;
                               9681                 :              3 :                     n->newname = $8;
                               9682                 :              3 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9683                 :              3 :                     $$ = (Node *) n;
                               9684                 :                :                 }
                               9685                 :                :             | ALTER VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
                               9686                 :                :                 {
 1606 fujii@postgresql.org     9687                 :UBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9688                 :                : 
                               9689                 :              0 :                     n->renameType = OBJECT_COLUMN;
                               9690                 :              0 :                     n->relationType = OBJECT_VIEW;
                               9691                 :              0 :                     n->relation = $5;
                               9692                 :              0 :                     n->subname = $8;
                               9693                 :              0 :                     n->newname = $10;
                               9694                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9695                 :              0 :                     $$ = (Node *) n;
                               9696                 :                :                 }
                               9697                 :                :             | ALTER MATERIALIZED VIEW qualified_name RENAME opt_column name TO name
                               9698                 :                :                 {
 4060 kgrittn@postgresql.o     9699                 :              0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9700                 :                : 
                               9701                 :              0 :                     n->renameType = OBJECT_COLUMN;
                               9702                 :              0 :                     n->relationType = OBJECT_MATVIEW;
                               9703                 :              0 :                     n->relation = $4;
                               9704                 :              0 :                     n->subname = $7;
                               9705                 :              0 :                     n->newname = $9;
                               9706                 :              0 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9707                 :              0 :                     $$ = (Node *) n;
                               9708                 :                :                 }
                               9709                 :                :             | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
                               9710                 :                :                 {
 4060 kgrittn@postgresql.o     9711                 :              0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9712                 :                : 
                               9713                 :              0 :                     n->renameType = OBJECT_COLUMN;
                               9714                 :              0 :                     n->relationType = OBJECT_MATVIEW;
                               9715                 :              0 :                     n->relation = $6;
                               9716                 :              0 :                     n->subname = $9;
                               9717                 :              0 :                     n->newname = $11;
                               9718                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9719                 :              0 :                     $$ = (Node *) n;
                               9720                 :                :                 }
                               9721                 :                :             | ALTER TABLE relation_expr RENAME CONSTRAINT name TO name
                               9722                 :                :                 {
 4418 peter_e@gmx.net          9723                 :CBC          33 :                     RenameStmt *n = makeNode(RenameStmt);
                               9724                 :                : 
 3400 alvherre@alvh.no-ip.     9725                 :             33 :                     n->renameType = OBJECT_TABCONSTRAINT;
 4418 peter_e@gmx.net          9726                 :             33 :                     n->relation = $3;
                               9727                 :             33 :                     n->subname = $6;
                               9728                 :             33 :                     n->newname = $8;
 3309 bruce@momjian.us         9729                 :             33 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9730                 :             33 :                     $$ = (Node *) n;
                               9731                 :                :                 }
                               9732                 :                :             | ALTER TABLE IF_P EXISTS relation_expr RENAME CONSTRAINT name TO name
                               9733                 :                :                 {
 3309 bruce@momjian.us         9734                 :              3 :                     RenameStmt *n = makeNode(RenameStmt);
                               9735                 :                : 
                               9736                 :              3 :                     n->renameType = OBJECT_TABCONSTRAINT;
                               9737                 :              3 :                     n->relation = $5;
                               9738                 :              3 :                     n->subname = $8;
                               9739                 :              3 :                     n->newname = $10;
                               9740                 :              3 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9741                 :              3 :                     $$ = (Node *) n;
                               9742                 :                :                 }
                               9743                 :                :             | ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name
                               9744                 :                :                 {
 4852 rhaas@postgresql.org     9745                 :              3 :                     RenameStmt *n = makeNode(RenameStmt);
                               9746                 :                : 
                               9747                 :              3 :                     n->renameType = OBJECT_COLUMN;
                               9748                 :              3 :                     n->relationType = OBJECT_FOREIGN_TABLE;
                               9749                 :              3 :                     n->relation = $4;
                               9750                 :              3 :                     n->subname = $7;
                               9751                 :              3 :                     n->newname = $9;
 4465 simon@2ndQuadrant.co     9752                 :              3 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9753                 :              3 :                     $$ = (Node *) n;
                               9754                 :                :                 }
                               9755                 :                :             | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
                               9756                 :                :                 {
 4465 simon@2ndQuadrant.co     9757                 :              3 :                     RenameStmt *n = makeNode(RenameStmt);
                               9758                 :                : 
                               9759                 :              3 :                     n->renameType = OBJECT_COLUMN;
                               9760                 :              3 :                     n->relationType = OBJECT_FOREIGN_TABLE;
                               9761                 :              3 :                     n->relation = $6;
                               9762                 :              3 :                     n->subname = $9;
                               9763                 :              3 :                     n->newname = $11;
                               9764                 :              3 :                     n->missing_ok = true;
  702 peter@eisentraut.org     9765                 :              3 :                     $$ = (Node *) n;
                               9766                 :                :                 }
                               9767                 :                :             | ALTER RULE name ON qualified_name RENAME TO name
                               9768                 :                :                 {
 4083 tgl@sss.pgh.pa.us        9769                 :             17 :                     RenameStmt *n = makeNode(RenameStmt);
                               9770                 :                : 
                               9771                 :             17 :                     n->renameType = OBJECT_RULE;
                               9772                 :             17 :                     n->relation = $5;
                               9773                 :             17 :                     n->subname = $3;
                               9774                 :             17 :                     n->newname = $8;
                               9775                 :             17 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9776                 :             17 :                     $$ = (Node *) n;
                               9777                 :                :                 }
                               9778                 :                :             | ALTER TRIGGER name ON qualified_name RENAME TO name
                               9779                 :                :                 {
 8026 bruce@momjian.us         9780                 :             20 :                     RenameStmt *n = makeNode(RenameStmt);
                               9781                 :                : 
 6831 tgl@sss.pgh.pa.us        9782                 :             20 :                     n->renameType = OBJECT_TRIGGER;
 8026 bruce@momjian.us         9783                 :             20 :                     n->relation = $5;
 7597 peter_e@gmx.net          9784                 :             20 :                     n->subname = $3;
 8026 bruce@momjian.us         9785                 :             20 :                     n->newname = $8;
 4465 simon@2ndQuadrant.co     9786                 :             20 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9787                 :             20 :                     $$ = (Node *) n;
                               9788                 :                :                 }
                               9789                 :                :             | ALTER EVENT TRIGGER name RENAME TO name
                               9790                 :                :                 {
 4288 rhaas@postgresql.org     9791                 :              6 :                     RenameStmt *n = makeNode(RenameStmt);
                               9792                 :                : 
                               9793                 :              6 :                     n->renameType = OBJECT_EVENT_TRIGGER;
 2710 peter_e@gmx.net          9794                 :              6 :                     n->object = (Node *) makeString($4);
 4288 rhaas@postgresql.org     9795                 :              6 :                     n->newname = $7;
  702 peter@eisentraut.org     9796                 :              6 :                     $$ = (Node *) n;
                               9797                 :                :                 }
                               9798                 :                :             | ALTER ROLE RoleId RENAME TO RoleId
                               9799                 :                :                 {
 7597 peter_e@gmx.net          9800                 :             15 :                     RenameStmt *n = makeNode(RenameStmt);
                               9801                 :                : 
 6865 tgl@sss.pgh.pa.us        9802                 :             15 :                     n->renameType = OBJECT_ROLE;
                               9803                 :             15 :                     n->subname = $3;
                               9804                 :             15 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9805                 :             15 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9806                 :             15 :                     $$ = (Node *) n;
                               9807                 :                :                 }
                               9808                 :                :             | ALTER USER RoleId RENAME TO RoleId
                               9809                 :                :                 {
 6865 tgl@sss.pgh.pa.us        9810                 :UBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9811                 :                : 
                               9812                 :              0 :                     n->renameType = OBJECT_ROLE;
 7597 peter_e@gmx.net          9813                 :              0 :                     n->subname = $3;
                               9814                 :              0 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9815                 :              0 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9816                 :              0 :                     $$ = (Node *) n;
                               9817                 :                :                 }
                               9818                 :                :             | ALTER TABLESPACE name RENAME TO name
                               9819                 :                :                 {
 7233 tgl@sss.pgh.pa.us        9820                 :CBC           3 :                     RenameStmt *n = makeNode(RenameStmt);
                               9821                 :                : 
                               9822                 :              3 :                     n->renameType = OBJECT_TABLESPACE;
                               9823                 :              3 :                     n->subname = $3;
                               9824                 :              3 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9825                 :              3 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9826                 :              3 :                     $$ = (Node *) n;
                               9827                 :                :                 }
                               9828                 :                :             | ALTER STATISTICS any_name RENAME TO name
                               9829                 :                :                 {
 2578 alvherre@alvh.no-ip.     9830                 :             15 :                     RenameStmt *n = makeNode(RenameStmt);
                               9831                 :                : 
                               9832                 :             15 :                     n->renameType = OBJECT_STATISTIC_EXT;
                               9833                 :             15 :                     n->object = (Node *) $3;
                               9834                 :             15 :                     n->newname = $6;
                               9835                 :             15 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9836                 :             15 :                     $$ = (Node *) n;
                               9837                 :                :                 }
                               9838                 :                :             | ALTER TEXT_P SEARCH PARSER any_name RENAME TO name
                               9839                 :                :                 {
 6081 tgl@sss.pgh.pa.us        9840                 :              6 :                     RenameStmt *n = makeNode(RenameStmt);
                               9841                 :                : 
                               9842                 :              6 :                     n->renameType = OBJECT_TSPARSER;
 2710 peter_e@gmx.net          9843                 :              6 :                     n->object = (Node *) $5;
 6081 tgl@sss.pgh.pa.us        9844                 :              6 :                     n->newname = $8;
 4465 simon@2ndQuadrant.co     9845                 :              6 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9846                 :              6 :                     $$ = (Node *) n;
                               9847                 :                :                 }
                               9848                 :                :             | ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name
                               9849                 :                :                 {
 6081 tgl@sss.pgh.pa.us        9850                 :             12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9851                 :                : 
                               9852                 :             12 :                     n->renameType = OBJECT_TSDICTIONARY;
 2710 peter_e@gmx.net          9853                 :             12 :                     n->object = (Node *) $5;
 6081 tgl@sss.pgh.pa.us        9854                 :             12 :                     n->newname = $8;
 4465 simon@2ndQuadrant.co     9855                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9856                 :             12 :                     $$ = (Node *) n;
                               9857                 :                :                 }
                               9858                 :                :             | ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name
                               9859                 :                :                 {
 6081 tgl@sss.pgh.pa.us        9860                 :              6 :                     RenameStmt *n = makeNode(RenameStmt);
                               9861                 :                : 
                               9862                 :              6 :                     n->renameType = OBJECT_TSTEMPLATE;
 2710 peter_e@gmx.net          9863                 :              6 :                     n->object = (Node *) $5;
 6081 tgl@sss.pgh.pa.us        9864                 :              6 :                     n->newname = $8;
 4465 simon@2ndQuadrant.co     9865                 :              6 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9866                 :              6 :                     $$ = (Node *) n;
                               9867                 :                :                 }
                               9868                 :                :             | ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name
                               9869                 :                :                 {
 6081 tgl@sss.pgh.pa.us        9870                 :             12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9871                 :                : 
                               9872                 :             12 :                     n->renameType = OBJECT_TSCONFIGURATION;
 2710 peter_e@gmx.net          9873                 :             12 :                     n->object = (Node *) $5;
 6081 tgl@sss.pgh.pa.us        9874                 :             12 :                     n->newname = $8;
 4465 simon@2ndQuadrant.co     9875                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9876                 :             12 :                     $$ = (Node *) n;
                               9877                 :                :                 }
                               9878                 :                :             | ALTER TYPE_P any_name RENAME TO name
                               9879                 :                :                 {
 5870 tgl@sss.pgh.pa.us        9880                 :             13 :                     RenameStmt *n = makeNode(RenameStmt);
                               9881                 :                : 
                               9882                 :             13 :                     n->renameType = OBJECT_TYPE;
 2710 peter_e@gmx.net          9883                 :             13 :                     n->object = (Node *) $3;
 5870 tgl@sss.pgh.pa.us        9884                 :             13 :                     n->newname = $6;
 4465 simon@2ndQuadrant.co     9885                 :             13 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9886                 :             13 :                     $$ = (Node *) n;
                               9887                 :                :                 }
                               9888                 :                :             | ALTER TYPE_P any_name RENAME ATTRIBUTE name TO name opt_drop_behavior
                               9889                 :                :                 {
 4949 peter_e@gmx.net          9890                 :             12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9891                 :                : 
                               9892                 :             12 :                     n->renameType = OBJECT_ATTRIBUTE;
 4852 rhaas@postgresql.org     9893                 :             12 :                     n->relationType = OBJECT_TYPE;
 4949 peter_e@gmx.net          9894                 :             12 :                     n->relation = makeRangeVarFromAnyName($3, @3, yyscanner);
                               9895                 :             12 :                     n->subname = $6;
                               9896                 :             12 :                     n->newname = $8;
 4891                          9897                 :             12 :                     n->behavior = $9;
 4465 simon@2ndQuadrant.co     9898                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org     9899                 :             12 :                     $$ = (Node *) n;
                               9900                 :                :                 }
                               9901                 :                :         ;
                               9902                 :                : 
                               9903                 :                : opt_column: COLUMN
                               9904                 :                :             | /*EMPTY*/
                               9905                 :                :         ;
                               9906                 :                : 
 4785 tgl@sss.pgh.pa.us        9907                 :             73 : opt_set_data: SET DATA_P                            { $$ = 1; }
 5654 peter_e@gmx.net          9908                 :            385 :             | /*EMPTY*/                             { $$ = 0; }
                               9909                 :                :         ;
                               9910                 :                : 
                               9911                 :                : /*****************************************************************************
                               9912                 :                :  *
                               9913                 :                :  * ALTER THING name DEPENDS ON EXTENSION name
                               9914                 :                :  *
                               9915                 :                :  *****************************************************************************/
                               9916                 :                : 
                               9917                 :                : AlterObjectDependsStmt:
                               9918                 :                :             ALTER FUNCTION function_with_argtypes opt_no DEPENDS ON EXTENSION name
                               9919                 :                :                 {
 2931 alvherre@alvh.no-ip.     9920                 :              6 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
                               9921                 :                : 
                               9922                 :              6 :                     n->objectType = OBJECT_FUNCTION;
 2710 peter_e@gmx.net          9923                 :              6 :                     n->object = (Node *) $3;
 1455 alvherre@alvh.no-ip.     9924                 :              6 :                     n->extname = makeString($8);
                               9925                 :              6 :                     n->remove = $4;
  702 peter@eisentraut.org     9926                 :              6 :                     $$ = (Node *) n;
                               9927                 :                :                 }
                               9928                 :                :             | ALTER PROCEDURE function_with_argtypes opt_no DEPENDS ON EXTENSION name
                               9929                 :                :                 {
 2327 peter_e@gmx.net          9930                 :UBC           0 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
                               9931                 :                : 
                               9932                 :              0 :                     n->objectType = OBJECT_PROCEDURE;
                               9933                 :              0 :                     n->object = (Node *) $3;
 1455 alvherre@alvh.no-ip.     9934                 :              0 :                     n->extname = makeString($8);
                               9935                 :              0 :                     n->remove = $4;
  702 peter@eisentraut.org     9936                 :              0 :                     $$ = (Node *) n;
                               9937                 :                :                 }
                               9938                 :                :             | ALTER ROUTINE function_with_argtypes opt_no DEPENDS ON EXTENSION name
                               9939                 :                :                 {
 2327 peter_e@gmx.net          9940                 :              0 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
                               9941                 :                : 
                               9942                 :              0 :                     n->objectType = OBJECT_ROUTINE;
                               9943                 :              0 :                     n->object = (Node *) $3;
 1455 alvherre@alvh.no-ip.     9944                 :              0 :                     n->extname = makeString($8);
                               9945                 :              0 :                     n->remove = $4;
  702 peter@eisentraut.org     9946                 :              0 :                     $$ = (Node *) n;
                               9947                 :                :                 }
                               9948                 :                :             | ALTER TRIGGER name ON qualified_name opt_no DEPENDS ON EXTENSION name
                               9949                 :                :                 {
 2931 alvherre@alvh.no-ip.     9950                 :CBC           5 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
                               9951                 :                : 
                               9952                 :              5 :                     n->objectType = OBJECT_TRIGGER;
                               9953                 :              5 :                     n->relation = $5;
 2710 peter_e@gmx.net          9954                 :              5 :                     n->object = (Node *) list_make1(makeString($3));
 1455 alvherre@alvh.no-ip.     9955                 :              5 :                     n->extname = makeString($10);
                               9956                 :              5 :                     n->remove = $6;
  702 peter@eisentraut.org     9957                 :              5 :                     $$ = (Node *) n;
                               9958                 :                :                 }
                               9959                 :                :             | ALTER MATERIALIZED VIEW qualified_name opt_no DEPENDS ON EXTENSION name
                               9960                 :                :                 {
 2931 alvherre@alvh.no-ip.     9961                 :              5 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
                               9962                 :                : 
                               9963                 :              5 :                     n->objectType = OBJECT_MATVIEW;
                               9964                 :              5 :                     n->relation = $4;
 1455                          9965                 :              5 :                     n->extname = makeString($9);
                               9966                 :              5 :                     n->remove = $5;
  702 peter@eisentraut.org     9967                 :              5 :                     $$ = (Node *) n;
                               9968                 :                :                 }
                               9969                 :                :             | ALTER INDEX qualified_name opt_no DEPENDS ON EXTENSION name
                               9970                 :                :                 {
 2931 alvherre@alvh.no-ip.     9971                 :              7 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
                               9972                 :                : 
                               9973                 :              7 :                     n->objectType = OBJECT_INDEX;
                               9974                 :              7 :                     n->relation = $3;
 1455                          9975                 :              7 :                     n->extname = makeString($8);
                               9976                 :              7 :                     n->remove = $4;
  702 peter@eisentraut.org     9977                 :              7 :                     $$ = (Node *) n;
                               9978                 :                :                 }
                               9979                 :                :         ;
                               9980                 :                : 
 1455 alvherre@alvh.no-ip.     9981                 :              4 : opt_no:     NO              { $$ = true; }
                               9982                 :             19 :             | /* EMPTY */   { $$ = false;   }
                               9983                 :                :         ;
                               9984                 :                : 
                               9985                 :                : /*****************************************************************************
                               9986                 :                :  *
                               9987                 :                :  * ALTER THING name SET SCHEMA name
                               9988                 :                :  *
                               9989                 :                :  *****************************************************************************/
                               9990                 :                : 
                               9991                 :                : AlterObjectSchemaStmt:
                               9992                 :                :             ALTER AGGREGATE aggregate_with_argtypes SET SCHEMA name
                               9993                 :                :                 {
 6831 tgl@sss.pgh.pa.us        9994                 :             12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                               9995                 :                : 
                               9996                 :             12 :                     n->objectType = OBJECT_AGGREGATE;
 2710 peter_e@gmx.net          9997                 :             12 :                     n->object = (Node *) $3;
 2768                          9998                 :             12 :                     n->newschema = $6;
 4465 simon@2ndQuadrant.co     9999                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10000                 :             12 :                     $$ = (Node *) n;
                              10001                 :                :                 }
                              10002                 :                :             | ALTER COLLATION any_name SET SCHEMA name
                              10003                 :                :                 {
 4810 peter_e@gmx.net         10004                 :              3 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10005                 :                : 
                              10006                 :              3 :                     n->objectType = OBJECT_COLLATION;
 2710                         10007                 :              3 :                     n->object = (Node *) $3;
 4810                         10008                 :              3 :                     n->newschema = $6;
 4465 simon@2ndQuadrant.co    10009                 :              3 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10010                 :              3 :                     $$ = (Node *) n;
                              10011                 :                :                 }
                              10012                 :                :             | ALTER CONVERSION_P any_name SET SCHEMA name
                              10013                 :                :                 {
 4888 rhaas@postgresql.org    10014                 :             12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10015                 :                : 
                              10016                 :             12 :                     n->objectType = OBJECT_CONVERSION;
 2710 peter_e@gmx.net         10017                 :             12 :                     n->object = (Node *) $3;
 4888 rhaas@postgresql.org    10018                 :             12 :                     n->newschema = $6;
 4465 simon@2ndQuadrant.co    10019                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10020                 :             12 :                     $$ = (Node *) n;
                              10021                 :                :                 }
                              10022                 :                :             | ALTER DOMAIN_P any_name SET SCHEMA name
                              10023                 :                :                 {
 6831 tgl@sss.pgh.pa.us       10024                 :              3 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10025                 :                : 
                              10026                 :              3 :                     n->objectType = OBJECT_DOMAIN;
 2710 peter_e@gmx.net         10027                 :              3 :                     n->object = (Node *) $3;
 6831 tgl@sss.pgh.pa.us       10028                 :              3 :                     n->newschema = $6;
 4465 simon@2ndQuadrant.co    10029                 :              3 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10030                 :              3 :                     $$ = (Node *) n;
                              10031                 :                :                 }
                              10032                 :                :             | ALTER EXTENSION name SET SCHEMA name
                              10033                 :                :                 {
 4814 tgl@sss.pgh.pa.us       10034                 :              5 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10035                 :                : 
                              10036                 :              5 :                     n->objectType = OBJECT_EXTENSION;
 2710 peter_e@gmx.net         10037                 :              5 :                     n->object = (Node *) makeString($3);
 4814 tgl@sss.pgh.pa.us       10038                 :              5 :                     n->newschema = $6;
 4465 simon@2ndQuadrant.co    10039                 :              5 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10040                 :              5 :                     $$ = (Node *) n;
                              10041                 :                :                 }
                              10042                 :                :             | ALTER FUNCTION function_with_argtypes SET SCHEMA name
                              10043                 :                :                 {
 6831 tgl@sss.pgh.pa.us       10044                 :             21 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10045                 :                : 
                              10046                 :             21 :                     n->objectType = OBJECT_FUNCTION;
 2710 peter_e@gmx.net         10047                 :             21 :                     n->object = (Node *) $3;
 6068 tgl@sss.pgh.pa.us       10048                 :             21 :                     n->newschema = $6;
 4465 simon@2ndQuadrant.co    10049                 :             21 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10050                 :             21 :                     $$ = (Node *) n;
                              10051                 :                :                 }
                              10052                 :                :             | ALTER OPERATOR operator_with_argtypes SET SCHEMA name
                              10053                 :                :                 {
 4888 rhaas@postgresql.org    10054                 :              9 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10055                 :                : 
                              10056                 :              9 :                     n->objectType = OBJECT_OPERATOR;
 2710 peter_e@gmx.net         10057                 :              9 :                     n->object = (Node *) $3;
 2664                         10058                 :              9 :                     n->newschema = $6;
 4465 simon@2ndQuadrant.co    10059                 :              9 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10060                 :              9 :                     $$ = (Node *) n;
                              10061                 :                :                 }
                              10062                 :                :             | ALTER OPERATOR CLASS any_name USING name SET SCHEMA name
                              10063                 :                :                 {
 4888 rhaas@postgresql.org    10064                 :             12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10065                 :                : 
                              10066                 :             12 :                     n->objectType = OBJECT_OPCLASS;
 2710 peter_e@gmx.net         10067                 :             12 :                     n->object = (Node *) lcons(makeString($6), $4);
 4888 rhaas@postgresql.org    10068                 :             12 :                     n->newschema = $9;
 4465 simon@2ndQuadrant.co    10069                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10070                 :             12 :                     $$ = (Node *) n;
                              10071                 :                :                 }
                              10072                 :                :             | ALTER OPERATOR FAMILY any_name USING name SET SCHEMA name
                              10073                 :                :                 {
 4888 rhaas@postgresql.org    10074                 :             12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10075                 :                : 
                              10076                 :             12 :                     n->objectType = OBJECT_OPFAMILY;
 2710 peter_e@gmx.net         10077                 :             12 :                     n->object = (Node *) lcons(makeString($6), $4);
 4888 rhaas@postgresql.org    10078                 :             12 :                     n->newschema = $9;
 4465 simon@2ndQuadrant.co    10079                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10080                 :             12 :                     $$ = (Node *) n;
                              10081                 :                :                 }
                              10082                 :                :             | ALTER PROCEDURE function_with_argtypes SET SCHEMA name
                              10083                 :                :                 {
 2327 peter_e@gmx.net         10084                 :UBC           0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10085                 :                : 
                              10086                 :              0 :                     n->objectType = OBJECT_PROCEDURE;
                              10087                 :              0 :                     n->object = (Node *) $3;
                              10088                 :              0 :                     n->newschema = $6;
                              10089                 :              0 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10090                 :              0 :                     $$ = (Node *) n;
                              10091                 :                :                 }
                              10092                 :                :             | ALTER ROUTINE function_with_argtypes SET SCHEMA name
                              10093                 :                :                 {
 2327 peter_e@gmx.net         10094                 :              0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10095                 :                : 
                              10096                 :              0 :                     n->objectType = OBJECT_ROUTINE;
                              10097                 :              0 :                     n->object = (Node *) $3;
                              10098                 :              0 :                     n->newschema = $6;
                              10099                 :              0 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10100                 :              0 :                     $$ = (Node *) n;
                              10101                 :                :                 }
                              10102                 :                :             | ALTER TABLE relation_expr SET SCHEMA name
                              10103                 :                :                 {
 5782 tgl@sss.pgh.pa.us       10104                 :CBC          33 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10105                 :                : 
                              10106                 :             33 :                     n->objectType = OBJECT_TABLE;
                              10107                 :             33 :                     n->relation = $3;
                              10108                 :             33 :                     n->newschema = $6;
 4465 simon@2ndQuadrant.co    10109                 :             33 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10110                 :             33 :                     $$ = (Node *) n;
                              10111                 :                :                 }
                              10112                 :                :             | ALTER TABLE IF_P EXISTS relation_expr SET SCHEMA name
                              10113                 :                :                 {
 4465 simon@2ndQuadrant.co    10114                 :              6 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10115                 :                : 
                              10116                 :              6 :                     n->objectType = OBJECT_TABLE;
                              10117                 :              6 :                     n->relation = $5;
                              10118                 :              6 :                     n->newschema = $8;
                              10119                 :              6 :                     n->missing_ok = true;
  702 peter@eisentraut.org    10120                 :              6 :                     $$ = (Node *) n;
                              10121                 :                :                 }
                              10122                 :                :             | ALTER STATISTICS any_name SET SCHEMA name
                              10123                 :                :                 {
 2578 alvherre@alvh.no-ip.    10124                 :              9 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10125                 :                : 
                              10126                 :              9 :                     n->objectType = OBJECT_STATISTIC_EXT;
                              10127                 :              9 :                     n->object = (Node *) $3;
                              10128                 :              9 :                     n->newschema = $6;
                              10129                 :              9 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10130                 :              9 :                     $$ = (Node *) n;
                              10131                 :                :                 }
                              10132                 :                :             | ALTER TEXT_P SEARCH PARSER any_name SET SCHEMA name
                              10133                 :                :                 {
 4888 rhaas@postgresql.org    10134                 :              9 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10135                 :                : 
                              10136                 :              9 :                     n->objectType = OBJECT_TSPARSER;
 2710 peter_e@gmx.net         10137                 :              9 :                     n->object = (Node *) $5;
 4888 rhaas@postgresql.org    10138                 :              9 :                     n->newschema = $8;
 4465 simon@2ndQuadrant.co    10139                 :              9 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10140                 :              9 :                     $$ = (Node *) n;
                              10141                 :                :                 }
                              10142                 :                :             | ALTER TEXT_P SEARCH DICTIONARY any_name SET SCHEMA name
                              10143                 :                :                 {
 4888 rhaas@postgresql.org    10144                 :             12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10145                 :                : 
                              10146                 :             12 :                     n->objectType = OBJECT_TSDICTIONARY;
 2710 peter_e@gmx.net         10147                 :             12 :                     n->object = (Node *) $5;
 4888 rhaas@postgresql.org    10148                 :             12 :                     n->newschema = $8;
 4465 simon@2ndQuadrant.co    10149                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10150                 :             12 :                     $$ = (Node *) n;
                              10151                 :                :                 }
                              10152                 :                :             | ALTER TEXT_P SEARCH TEMPLATE any_name SET SCHEMA name
                              10153                 :                :                 {
 4888 rhaas@postgresql.org    10154                 :              9 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10155                 :                : 
                              10156                 :              9 :                     n->objectType = OBJECT_TSTEMPLATE;
 2710 peter_e@gmx.net         10157                 :              9 :                     n->object = (Node *) $5;
 4888 rhaas@postgresql.org    10158                 :              9 :                     n->newschema = $8;
 4465 simon@2ndQuadrant.co    10159                 :              9 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10160                 :              9 :                     $$ = (Node *) n;
                              10161                 :                :                 }
                              10162                 :                :             | ALTER TEXT_P SEARCH CONFIGURATION any_name SET SCHEMA name
                              10163                 :                :                 {
 4888 rhaas@postgresql.org    10164                 :             12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10165                 :                : 
                              10166                 :             12 :                     n->objectType = OBJECT_TSCONFIGURATION;
 2710 peter_e@gmx.net         10167                 :             12 :                     n->object = (Node *) $5;
 4888 rhaas@postgresql.org    10168                 :             12 :                     n->newschema = $8;
 4465 simon@2ndQuadrant.co    10169                 :             12 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10170                 :             12 :                     $$ = (Node *) n;
                              10171                 :                :                 }
                              10172                 :                :             | ALTER SEQUENCE qualified_name SET SCHEMA name
                              10173                 :                :                 {
 6831 tgl@sss.pgh.pa.us       10174                 :              4 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10175                 :                : 
                              10176                 :              4 :                     n->objectType = OBJECT_SEQUENCE;
                              10177                 :              4 :                     n->relation = $3;
                              10178                 :              4 :                     n->newschema = $6;
 4465 simon@2ndQuadrant.co    10179                 :              4 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10180                 :              4 :                     $$ = (Node *) n;
                              10181                 :                :                 }
                              10182                 :                :             | ALTER SEQUENCE IF_P EXISTS qualified_name SET SCHEMA name
                              10183                 :                :                 {
 4465 simon@2ndQuadrant.co    10184                 :UBC           0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10185                 :                : 
                              10186                 :              0 :                     n->objectType = OBJECT_SEQUENCE;
                              10187                 :              0 :                     n->relation = $5;
                              10188                 :              0 :                     n->newschema = $8;
                              10189                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org    10190                 :              0 :                     $$ = (Node *) n;
                              10191                 :                :                 }
                              10192                 :                :             | ALTER VIEW qualified_name SET SCHEMA name
                              10193                 :                :                 {
 6831 tgl@sss.pgh.pa.us       10194                 :              0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10195                 :                : 
 5782                         10196                 :              0 :                     n->objectType = OBJECT_VIEW;
 6831                         10197                 :              0 :                     n->relation = $3;
                              10198                 :              0 :                     n->newschema = $6;
 4465 simon@2ndQuadrant.co    10199                 :              0 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10200                 :              0 :                     $$ = (Node *) n;
                              10201                 :                :                 }
                              10202                 :                :             | ALTER VIEW IF_P EXISTS qualified_name SET SCHEMA name
                              10203                 :                :                 {
 4465 simon@2ndQuadrant.co    10204                 :              0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10205                 :                : 
                              10206                 :              0 :                     n->objectType = OBJECT_VIEW;
                              10207                 :              0 :                     n->relation = $5;
                              10208                 :              0 :                     n->newschema = $8;
                              10209                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org    10210                 :              0 :                     $$ = (Node *) n;
                              10211                 :                :                 }
                              10212                 :                :             | ALTER MATERIALIZED VIEW qualified_name SET SCHEMA name
                              10213                 :                :                 {
 4060 kgrittn@postgresql.o    10214                 :CBC           3 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10215                 :                : 
                              10216                 :              3 :                     n->objectType = OBJECT_MATVIEW;
                              10217                 :              3 :                     n->relation = $4;
                              10218                 :              3 :                     n->newschema = $7;
                              10219                 :              3 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10220                 :              3 :                     $$ = (Node *) n;
                              10221                 :                :                 }
                              10222                 :                :             | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name SET SCHEMA name
                              10223                 :                :                 {
 4060 kgrittn@postgresql.o    10224                 :UBC           0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10225                 :                : 
                              10226                 :              0 :                     n->objectType = OBJECT_MATVIEW;
                              10227                 :              0 :                     n->relation = $6;
                              10228                 :              0 :                     n->newschema = $9;
                              10229                 :              0 :                     n->missing_ok = true;
  702 peter@eisentraut.org    10230                 :              0 :                     $$ = (Node *) n;
                              10231                 :                :                 }
                              10232                 :                :             | ALTER FOREIGN TABLE relation_expr SET SCHEMA name
                              10233                 :                :                 {
 4852 rhaas@postgresql.org    10234                 :CBC           3 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10235                 :                : 
                              10236                 :              3 :                     n->objectType = OBJECT_FOREIGN_TABLE;
                              10237                 :              3 :                     n->relation = $4;
                              10238                 :              3 :                     n->newschema = $7;
 4465 simon@2ndQuadrant.co    10239                 :              3 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10240                 :              3 :                     $$ = (Node *) n;
                              10241                 :                :                 }
                              10242                 :                :             | ALTER FOREIGN TABLE IF_P EXISTS relation_expr SET SCHEMA name
                              10243                 :                :                 {
 4465 simon@2ndQuadrant.co    10244                 :              3 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10245                 :                : 
                              10246                 :              3 :                     n->objectType = OBJECT_FOREIGN_TABLE;
                              10247                 :              3 :                     n->relation = $6;
                              10248                 :              3 :                     n->newschema = $9;
                              10249                 :              3 :                     n->missing_ok = true;
  702 peter@eisentraut.org    10250                 :              3 :                     $$ = (Node *) n;
                              10251                 :                :                 }
                              10252                 :                :             | ALTER TYPE_P any_name SET SCHEMA name
                              10253                 :                :                 {
 6831 tgl@sss.pgh.pa.us       10254                 :              6 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                              10255                 :                : 
                              10256                 :              6 :                     n->objectType = OBJECT_TYPE;
 2710 peter_e@gmx.net         10257                 :              6 :                     n->object = (Node *) $3;
 6831 tgl@sss.pgh.pa.us       10258                 :              6 :                     n->newschema = $6;
 4465 simon@2ndQuadrant.co    10259                 :              6 :                     n->missing_ok = false;
  702 peter@eisentraut.org    10260                 :              6 :                     $$ = (Node *) n;
                              10261                 :                :                 }
                              10262                 :                :         ;
                              10263                 :                : 
                              10264                 :                : /*****************************************************************************
                              10265                 :                :  *
                              10266                 :                :  * ALTER OPERATOR name SET define
                              10267                 :                :  *
                              10268                 :                :  *****************************************************************************/
                              10269                 :                : 
                              10270                 :                : AlterOperatorStmt:
                              10271                 :                :             ALTER OPERATOR operator_with_argtypes SET '(' operator_def_list ')'
                              10272                 :                :                 {
 3197 heikki.linnakangas@i    10273                 :            301 :                     AlterOperatorStmt *n = makeNode(AlterOperatorStmt);
                              10274                 :                : 
 2664 peter_e@gmx.net         10275                 :            301 :                     n->opername = $3;
                              10276                 :            301 :                     n->options = $6;
  702 peter@eisentraut.org    10277                 :            301 :                     $$ = (Node *) n;
                              10278                 :                :                 }
                              10279                 :                :         ;
                              10280                 :                : 
 3197 heikki.linnakangas@i    10281                 :            331 : operator_def_list:  operator_def_elem                               { $$ = list_make1($1); }
                              10282                 :            253 :             | operator_def_list ',' operator_def_elem               { $$ = lappend($1, $3); }
                              10283                 :                :         ;
                              10284                 :                : 
                              10285                 :                : operator_def_elem: ColLabel '=' NONE
 2777 peter_e@gmx.net         10286                 :             15 :                         { $$ = makeDefElem($1, NULL, @1); }
                              10287                 :                :                    | ColLabel '=' operator_def_arg
 2532                         10288                 :            555 :                         { $$ = makeDefElem($1, (Node *) $3, @1); }
                              10289                 :                :                    | ColLabel
  177 tgl@sss.pgh.pa.us       10290                 :GNC          14 :                         { $$ = makeDefElem($1, NULL, @1); }
                              10291                 :                :         ;
                              10292                 :                : 
                              10293                 :                : /* must be similar enough to def_arg to avoid reduce/reduce conflicts */
                              10294                 :                : operator_def_arg:
  702 peter@eisentraut.org    10295                 :CBC         516 :             func_type                       { $$ = (Node *) $1; }
  702 peter@eisentraut.org    10296                 :GBC          12 :             | reserved_keyword              { $$ = (Node *) makeString(pstrdup($1)); }
  702 peter@eisentraut.org    10297                 :CBC          27 :             | qual_all_Op                   { $$ = (Node *) $1; }
  702 peter@eisentraut.org    10298                 :UBC           0 :             | NumericOnly                   { $$ = (Node *) $1; }
                              10299                 :              0 :             | Sconst                        { $$ = (Node *) makeString($1); }
                              10300                 :                :         ;
                              10301                 :                : 
                              10302                 :                : /*****************************************************************************
                              10303                 :                :  *
                              10304                 :                :  * ALTER TYPE name SET define
                              10305                 :                :  *
                              10306                 :                :  * We repurpose ALTER OPERATOR's version of "definition" here
                              10307                 :                :  *
                              10308                 :                :  *****************************************************************************/
                              10309                 :                : 
                              10310                 :                : AlterTypeStmt:
                              10311                 :                :             ALTER TYPE_P any_name SET '(' operator_def_list ')'
                              10312                 :                :                 {
 1500 tgl@sss.pgh.pa.us       10313                 :CBC          30 :                     AlterTypeStmt *n = makeNode(AlterTypeStmt);
                              10314                 :                : 
                              10315                 :             30 :                     n->typeName = $3;
                              10316                 :             30 :                     n->options = $6;
  702 peter@eisentraut.org    10317                 :             30 :                     $$ = (Node *) n;
                              10318                 :                :                 }
                              10319                 :                :         ;
                              10320                 :                : 
                              10321                 :                : /*****************************************************************************
                              10322                 :                :  *
                              10323                 :                :  * ALTER THING name OWNER TO newname
                              10324                 :                :  *
                              10325                 :                :  *****************************************************************************/
                              10326                 :                : 
                              10327                 :                : AlterOwnerStmt: ALTER AGGREGATE aggregate_with_argtypes OWNER TO RoleSpec
                              10328                 :                :                 {
 7233 tgl@sss.pgh.pa.us       10329                 :             71 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10330                 :                : 
                              10331                 :             71 :                     n->objectType = OBJECT_AGGREGATE;
 2710 peter_e@gmx.net         10332                 :             71 :                     n->object = (Node *) $3;
 2768                         10333                 :             71 :                     n->newowner = $6;
  702 peter@eisentraut.org    10334                 :             71 :                     $$ = (Node *) n;
                              10335                 :                :                 }
                              10336                 :                :             | ALTER COLLATION any_name OWNER TO RoleSpec
                              10337                 :                :                 {
 4810 peter_e@gmx.net         10338                 :              8 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10339                 :                : 
                              10340                 :              8 :                     n->objectType = OBJECT_COLLATION;
 2710                         10341                 :              8 :                     n->object = (Node *) $3;
 4810                         10342                 :              8 :                     n->newowner = $6;
  702 peter@eisentraut.org    10343                 :              8 :                     $$ = (Node *) n;
                              10344                 :                :                 }
                              10345                 :                :             | ALTER CONVERSION_P any_name OWNER TO RoleSpec
                              10346                 :                :                 {
 7233 tgl@sss.pgh.pa.us       10347                 :             12 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10348                 :                : 
                              10349                 :             12 :                     n->objectType = OBJECT_CONVERSION;
 2710 peter_e@gmx.net         10350                 :             12 :                     n->object = (Node *) $3;
 7233 tgl@sss.pgh.pa.us       10351                 :             12 :                     n->newowner = $6;
  702 peter@eisentraut.org    10352                 :             12 :                     $$ = (Node *) n;
                              10353                 :                :                 }
                              10354                 :                :             | ALTER DATABASE name OWNER TO RoleSpec
                              10355                 :                :                 {
 7233 tgl@sss.pgh.pa.us       10356                 :             22 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10357                 :                : 
                              10358                 :             22 :                     n->objectType = OBJECT_DATABASE;
 2710 peter_e@gmx.net         10359                 :             22 :                     n->object = (Node *) makeString($3);
 7233 tgl@sss.pgh.pa.us       10360                 :             22 :                     n->newowner = $6;
  702 peter@eisentraut.org    10361                 :             22 :                     $$ = (Node *) n;
                              10362                 :                :                 }
                              10363                 :                :             | ALTER DOMAIN_P any_name OWNER TO RoleSpec
                              10364                 :                :                 {
 7233 tgl@sss.pgh.pa.us       10365                 :             19 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10366                 :                : 
                              10367                 :             19 :                     n->objectType = OBJECT_DOMAIN;
 2710 peter_e@gmx.net         10368                 :             19 :                     n->object = (Node *) $3;
 7233 tgl@sss.pgh.pa.us       10369                 :             19 :                     n->newowner = $6;
  702 peter@eisentraut.org    10370                 :             19 :                     $$ = (Node *) n;
                              10371                 :                :                 }
                              10372                 :                :             | ALTER FUNCTION function_with_argtypes OWNER TO RoleSpec
                              10373                 :                :                 {
 7233 tgl@sss.pgh.pa.us       10374                 :            287 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10375                 :                : 
                              10376                 :            287 :                     n->objectType = OBJECT_FUNCTION;
 2710 peter_e@gmx.net         10377                 :            287 :                     n->object = (Node *) $3;
 6068 tgl@sss.pgh.pa.us       10378                 :            287 :                     n->newowner = $6;
  702 peter@eisentraut.org    10379                 :            287 :                     $$ = (Node *) n;
                              10380                 :                :                 }
                              10381                 :                :             | ALTER opt_procedural LANGUAGE name OWNER TO RoleSpec
                              10382                 :                :                 {
 6229 tgl@sss.pgh.pa.us       10383                 :             60 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10384                 :                : 
                              10385                 :             60 :                     n->objectType = OBJECT_LANGUAGE;
 2710 peter_e@gmx.net         10386                 :             60 :                     n->object = (Node *) makeString($4);
 6229 tgl@sss.pgh.pa.us       10387                 :             60 :                     n->newowner = $7;
  702 peter@eisentraut.org    10388                 :             60 :                     $$ = (Node *) n;
                              10389                 :                :                 }
                              10390                 :                :             | ALTER LARGE_P OBJECT_P NumericOnly OWNER TO RoleSpec
                              10391                 :                :                 {
 5238 itagaki.takahiro@gma    10392                 :              6 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10393                 :                : 
                              10394                 :              6 :                     n->objectType = OBJECT_LARGEOBJECT;
 2710 peter_e@gmx.net         10395                 :              6 :                     n->object = (Node *) $4;
 5238 itagaki.takahiro@gma    10396                 :              6 :                     n->newowner = $7;
  702 peter@eisentraut.org    10397                 :              6 :                     $$ = (Node *) n;
                              10398                 :                :                 }
                              10399                 :                :             | ALTER OPERATOR operator_with_argtypes OWNER TO RoleSpec
                              10400                 :                :                 {
 7233 tgl@sss.pgh.pa.us       10401                 :             23 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10402                 :                : 
                              10403                 :             23 :                     n->objectType = OBJECT_OPERATOR;
 2710 peter_e@gmx.net         10404                 :             23 :                     n->object = (Node *) $3;
 2664                         10405                 :             23 :                     n->newowner = $6;
  702 peter@eisentraut.org    10406                 :             23 :                     $$ = (Node *) n;
                              10407                 :                :                 }
                              10408                 :                :             | ALTER OPERATOR CLASS any_name USING name OWNER TO RoleSpec
                              10409                 :                :                 {
 7233 tgl@sss.pgh.pa.us       10410                 :             27 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10411                 :                : 
                              10412                 :             27 :                     n->objectType = OBJECT_OPCLASS;
 2710 peter_e@gmx.net         10413                 :             27 :                     n->object = (Node *) lcons(makeString($6), $4);
 7233 tgl@sss.pgh.pa.us       10414                 :             27 :                     n->newowner = $9;
  702 peter@eisentraut.org    10415                 :             27 :                     $$ = (Node *) n;
                              10416                 :                :                 }
                              10417                 :                :             | ALTER OPERATOR FAMILY any_name USING name OWNER TO RoleSpec
                              10418                 :                :                 {
 6291 tgl@sss.pgh.pa.us       10419                 :             31 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10420                 :                : 
                              10421                 :             31 :                     n->objectType = OBJECT_OPFAMILY;
 2710 peter_e@gmx.net         10422                 :             31 :                     n->object = (Node *) lcons(makeString($6), $4);
 6291 tgl@sss.pgh.pa.us       10423                 :             31 :                     n->newowner = $9;
  702 peter@eisentraut.org    10424                 :             31 :                     $$ = (Node *) n;
                              10425                 :                :                 }
                              10426                 :                :             | ALTER PROCEDURE function_with_argtypes OWNER TO RoleSpec
                              10427                 :                :                 {
 2327 peter_e@gmx.net         10428                 :              9 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10429                 :                : 
                              10430                 :              9 :                     n->objectType = OBJECT_PROCEDURE;
                              10431                 :              9 :                     n->object = (Node *) $3;
                              10432                 :              9 :                     n->newowner = $6;
  702 peter@eisentraut.org    10433                 :              9 :                     $$ = (Node *) n;
                              10434                 :                :                 }
                              10435                 :                :             | ALTER ROUTINE function_with_argtypes OWNER TO RoleSpec
                              10436                 :                :                 {
 2327 peter_e@gmx.net         10437                 :UBC           0 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10438                 :                : 
                              10439                 :              0 :                     n->objectType = OBJECT_ROUTINE;
                              10440                 :              0 :                     n->object = (Node *) $3;
                              10441                 :              0 :                     n->newowner = $6;
  702 peter@eisentraut.org    10442                 :              0 :                     $$ = (Node *) n;
                              10443                 :                :                 }
                              10444                 :                :             | ALTER SCHEMA name OWNER TO RoleSpec
                              10445                 :                :                 {
 7233 tgl@sss.pgh.pa.us       10446                 :CBC          26 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10447                 :                : 
                              10448                 :             26 :                     n->objectType = OBJECT_SCHEMA;
 2710 peter_e@gmx.net         10449                 :             26 :                     n->object = (Node *) makeString($3);
 7233 tgl@sss.pgh.pa.us       10450                 :             26 :                     n->newowner = $6;
  702 peter@eisentraut.org    10451                 :             26 :                     $$ = (Node *) n;
                              10452                 :                :                 }
                              10453                 :                :             | ALTER TYPE_P any_name OWNER TO RoleSpec
                              10454                 :                :                 {
 7233 tgl@sss.pgh.pa.us       10455                 :             40 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10456                 :                : 
                              10457                 :             40 :                     n->objectType = OBJECT_TYPE;
 2710 peter_e@gmx.net         10458                 :             40 :                     n->object = (Node *) $3;
 7233 tgl@sss.pgh.pa.us       10459                 :             40 :                     n->newowner = $6;
  702 peter@eisentraut.org    10460                 :             40 :                     $$ = (Node *) n;
                              10461                 :                :                 }
                              10462                 :                :             | ALTER TABLESPACE name OWNER TO RoleSpec
                              10463                 :                :                 {
 7233 tgl@sss.pgh.pa.us       10464                 :              3 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10465                 :                : 
                              10466                 :              3 :                     n->objectType = OBJECT_TABLESPACE;
 2710 peter_e@gmx.net         10467                 :              3 :                     n->object = (Node *) makeString($3);
 7233 tgl@sss.pgh.pa.us       10468                 :              3 :                     n->newowner = $6;
  702 peter@eisentraut.org    10469                 :              3 :                     $$ = (Node *) n;
                              10470                 :                :                 }
                              10471                 :                :             | ALTER STATISTICS any_name OWNER TO RoleSpec
                              10472                 :                :                 {
 2578 alvherre@alvh.no-ip.    10473                 :             16 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10474                 :                : 
                              10475                 :             16 :                     n->objectType = OBJECT_STATISTIC_EXT;
                              10476                 :             16 :                     n->object = (Node *) $3;
                              10477                 :             16 :                     n->newowner = $6;
  702 peter@eisentraut.org    10478                 :             16 :                     $$ = (Node *) n;
                              10479                 :                :                 }
                              10480                 :                :             | ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO RoleSpec
                              10481                 :                :                 {
 6081 tgl@sss.pgh.pa.us       10482                 :             21 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10483                 :                : 
                              10484                 :             21 :                     n->objectType = OBJECT_TSDICTIONARY;
 2710 peter_e@gmx.net         10485                 :             21 :                     n->object = (Node *) $5;
 6081 tgl@sss.pgh.pa.us       10486                 :             21 :                     n->newowner = $8;
  702 peter@eisentraut.org    10487                 :             21 :                     $$ = (Node *) n;
                              10488                 :                :                 }
                              10489                 :                :             | ALTER TEXT_P SEARCH CONFIGURATION any_name OWNER TO RoleSpec
                              10490                 :                :                 {
 6081 tgl@sss.pgh.pa.us       10491                 :             16 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10492                 :                : 
                              10493                 :             16 :                     n->objectType = OBJECT_TSCONFIGURATION;
 2710 peter_e@gmx.net         10494                 :             16 :                     n->object = (Node *) $5;
 6081 tgl@sss.pgh.pa.us       10495                 :             16 :                     n->newowner = $8;
  702 peter@eisentraut.org    10496                 :             16 :                     $$ = (Node *) n;
                              10497                 :                :                 }
                              10498                 :                :             | ALTER FOREIGN DATA_P WRAPPER name OWNER TO RoleSpec
                              10499                 :                :                 {
 5595 peter_e@gmx.net         10500                 :             10 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10501                 :                : 
                              10502                 :             10 :                     n->objectType = OBJECT_FDW;
 2710                         10503                 :             10 :                     n->object = (Node *) makeString($5);
 5595                         10504                 :             10 :                     n->newowner = $8;
  702 peter@eisentraut.org    10505                 :             10 :                     $$ = (Node *) n;
                              10506                 :                :                 }
                              10507                 :                :             | ALTER SERVER name OWNER TO RoleSpec
                              10508                 :                :                 {
 5595 peter_e@gmx.net         10509                 :             34 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10510                 :                : 
                              10511                 :             34 :                     n->objectType = OBJECT_FOREIGN_SERVER;
 2710                         10512                 :             34 :                     n->object = (Node *) makeString($3);
 5595                         10513                 :             34 :                     n->newowner = $6;
  702 peter@eisentraut.org    10514                 :             34 :                     $$ = (Node *) n;
                              10515                 :                :                 }
                              10516                 :                :             | ALTER EVENT TRIGGER name OWNER TO RoleSpec
                              10517                 :                :                 {
 4288 rhaas@postgresql.org    10518                 :              7 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10519                 :                : 
                              10520                 :              7 :                     n->objectType = OBJECT_EVENT_TRIGGER;
 2710 peter_e@gmx.net         10521                 :              7 :                     n->object = (Node *) makeString($4);
 4288 rhaas@postgresql.org    10522                 :              7 :                     n->newowner = $7;
  702 peter@eisentraut.org    10523                 :              7 :                     $$ = (Node *) n;
                              10524                 :                :                 }
                              10525                 :                :             | ALTER PUBLICATION name OWNER TO RoleSpec
                              10526                 :                :                 {
 2642 peter_e@gmx.net         10527                 :             13 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10528                 :                : 
                              10529                 :             13 :                     n->objectType = OBJECT_PUBLICATION;
 2710                         10530                 :             13 :                     n->object = (Node *) makeString($3);
 2642                         10531                 :             13 :                     n->newowner = $6;
  702 peter@eisentraut.org    10532                 :             13 :                     $$ = (Node *) n;
                              10533                 :                :                 }
                              10534                 :                :             | ALTER SUBSCRIPTION name OWNER TO RoleSpec
                              10535                 :                :                 {
 2642 peter_e@gmx.net         10536                 :              9 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10537                 :                : 
                              10538                 :              9 :                     n->objectType = OBJECT_SUBSCRIPTION;
 2710                         10539                 :              9 :                     n->object = (Node *) makeString($3);
 2642                         10540                 :              9 :                     n->newowner = $6;
  702 peter@eisentraut.org    10541                 :              9 :                     $$ = (Node *) n;
                              10542                 :                :                 }
                              10543                 :                :         ;
                              10544                 :                : 
                              10545                 :                : 
                              10546                 :                : /*****************************************************************************
                              10547                 :                :  *
                              10548                 :                :  * CREATE PUBLICATION name [WITH options]
                              10549                 :                :  *
                              10550                 :                :  * CREATE PUBLICATION FOR ALL TABLES [WITH options]
                              10551                 :                :  *
                              10552                 :                :  * CREATE PUBLICATION FOR pub_obj [, ...] [WITH options]
                              10553                 :                :  *
                              10554                 :                :  * pub_obj is one of:
                              10555                 :                :  *
                              10556                 :                :  *      TABLE table [, ...]
                              10557                 :                :  *      TABLES IN SCHEMA schema [, ...]
                              10558                 :                :  *
                              10559                 :                :  *****************************************************************************/
                              10560                 :                : 
                              10561                 :                : CreatePublicationStmt:
                              10562                 :                :             CREATE PUBLICATION name opt_definition
                              10563                 :                :                 {
 2642 peter_e@gmx.net         10564                 :             54 :                     CreatePublicationStmt *n = makeNode(CreatePublicationStmt);
                              10565                 :                : 
                              10566                 :             54 :                     n->pubname = $3;
  900 akapila@postgresql.o    10567                 :             54 :                     n->options = $4;
  702 peter@eisentraut.org    10568                 :             54 :                     $$ = (Node *) n;
                              10569                 :                :                 }
                              10570                 :                :             | CREATE PUBLICATION name FOR ALL TABLES opt_definition
                              10571                 :                :                 {
  900 akapila@postgresql.o    10572                 :             31 :                     CreatePublicationStmt *n = makeNode(CreatePublicationStmt);
                              10573                 :                : 
                              10574                 :             31 :                     n->pubname = $3;
                              10575                 :             31 :                     n->options = $7;
  738 tomas.vondra@postgre    10576                 :             31 :                     n->for_all_tables = true;
  702 peter@eisentraut.org    10577                 :             31 :                     $$ = (Node *) n;
                              10578                 :                :                 }
                              10579                 :                :             | CREATE PUBLICATION name FOR pub_obj_list opt_definition
                              10580                 :                :                 {
  900 akapila@postgresql.o    10581                 :            276 :                     CreatePublicationStmt *n = makeNode(CreatePublicationStmt);
                              10582                 :                : 
                              10583                 :            276 :                     n->pubname = $3;
                              10584                 :            276 :                     n->options = $6;
  702 peter@eisentraut.org    10585                 :            276 :                     n->pubobjects = (List *) $5;
  900 akapila@postgresql.o    10586                 :            276 :                     preprocess_pubobj_list(n->pubobjects, yyscanner);
  702 peter@eisentraut.org    10587                 :            261 :                     $$ = (Node *) n;
                              10588                 :                :                 }
                              10589                 :                :         ;
                              10590                 :                : 
                              10591                 :                : /*
                              10592                 :                :  * FOR TABLE and FOR TABLES IN SCHEMA specifications
                              10593                 :                :  *
                              10594                 :                :  * This rule parses publication objects with and without keyword prefixes.
                              10595                 :                :  *
                              10596                 :                :  * The actual type of the object without keyword prefix depends on the previous
                              10597                 :                :  * one with keyword prefix. It will be preprocessed in preprocess_pubobj_list().
                              10598                 :                :  *
                              10599                 :                :  * For the object without keyword prefix, we cannot just use relation_expr here,
                              10600                 :                :  * because some extended expressions in relation_expr cannot be used as a
                              10601                 :                :  * schemaname and we cannot differentiate it. So, we extract the rules from
                              10602                 :                :  * relation_expr here.
                              10603                 :                :  */
                              10604                 :                : PublicationObjSpec:
                              10605                 :                :             TABLE relation_expr opt_column_list OptWhereClause
                              10606                 :                :                 {
  900 akapila@postgresql.o    10607                 :            580 :                     $$ = makeNode(PublicationObjSpec);
                              10608                 :            580 :                     $$->pubobjtype = PUBLICATIONOBJ_TABLE;
                              10609                 :            580 :                     $$->pubtable = makeNode(PublicationTable);
                              10610                 :            580 :                     $$->pubtable->relation = $2;
  750 tomas.vondra@postgre    10611                 :            580 :                     $$->pubtable->columns = $3;
                              10612                 :            580 :                     $$->pubtable->whereClause = $4;
                              10613                 :                :                 }
                              10614                 :                :             | TABLES IN_P SCHEMA ColId
                              10615                 :                :                 {
  900 akapila@postgresql.o    10616                 :            166 :                     $$ = makeNode(PublicationObjSpec);
  836 alvherre@alvh.no-ip.    10617                 :            166 :                     $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_SCHEMA;
  570                         10618                 :            166 :                     $$->name = $4;
                              10619                 :            166 :                     $$->location = @4;
                              10620                 :                :                 }
                              10621                 :                :             | TABLES IN_P SCHEMA CURRENT_SCHEMA
                              10622                 :                :                 {
  900 akapila@postgresql.o    10623                 :              9 :                     $$ = makeNode(PublicationObjSpec);
  836 alvherre@alvh.no-ip.    10624                 :              9 :                     $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA;
  570                         10625                 :              9 :                     $$->location = @4;
                              10626                 :                :                 }
                              10627                 :                :             | ColId opt_column_list OptWhereClause
                              10628                 :                :                 {
  900 akapila@postgresql.o    10629                 :             65 :                     $$ = makeNode(PublicationObjSpec);
                              10630                 :             65 :                     $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
                              10631                 :                :                     /*
                              10632                 :                :                      * If either a row filter or column list is specified, create
                              10633                 :                :                      * a PublicationTable object.
                              10634                 :                :                      */
  750 tomas.vondra@postgre    10635   [ +  +  +  + ]:             65 :                     if ($2 || $3)
                              10636                 :                :                     {
                              10637                 :                :                         /*
                              10638                 :                :                          * The OptWhereClause must be stored here but it is
                              10639                 :                :                          * valid only for tables. For non-table objects, an
                              10640                 :                :                          * error will be thrown later via
                              10641                 :                :                          * preprocess_pubobj_list().
                              10642                 :                :                          */
  782 akapila@postgresql.o    10643                 :             21 :                         $$->pubtable = makeNode(PublicationTable);
                              10644                 :             21 :                         $$->pubtable->relation = makeRangeVar(NULL, $1, @1);
  750 tomas.vondra@postgre    10645                 :             21 :                         $$->pubtable->columns = $2;
                              10646                 :             21 :                         $$->pubtable->whereClause = $3;
                              10647                 :                :                     }
                              10648                 :                :                     else
                              10649                 :                :                     {
  782 akapila@postgresql.o    10650                 :             44 :                         $$->name = $1;
                              10651                 :                :                     }
  900                         10652                 :             65 :                     $$->location = @1;
                              10653                 :                :                 }
                              10654                 :                :             | ColId indirection opt_column_list OptWhereClause
                              10655                 :                :                 {
                              10656                 :             16 :                     $$ = makeNode(PublicationObjSpec);
                              10657                 :             16 :                     $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
                              10658                 :             16 :                     $$->pubtable = makeNode(PublicationTable);
                              10659                 :             16 :                     $$->pubtable->relation = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner);
  750 tomas.vondra@postgre    10660                 :             16 :                     $$->pubtable->columns = $3;
                              10661                 :             16 :                     $$->pubtable->whereClause = $4;
  900 akapila@postgresql.o    10662                 :             16 :                     $$->location = @1;
                              10663                 :                :                 }
                              10664                 :                :             /* grammar like tablename * , ONLY tablename, ONLY ( tablename ) */
                              10665                 :                :             | extended_relation_expr opt_column_list OptWhereClause
                              10666                 :                :                 {
                              10667                 :              3 :                     $$ = makeNode(PublicationObjSpec);
                              10668                 :              3 :                     $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
                              10669                 :              3 :                     $$->pubtable = makeNode(PublicationTable);
                              10670                 :              3 :                     $$->pubtable->relation = $1;
  750 tomas.vondra@postgre    10671                 :              3 :                     $$->pubtable->columns = $2;
                              10672                 :              3 :                     $$->pubtable->whereClause = $3;
                              10673                 :                :                 }
                              10674                 :                :             | CURRENT_SCHEMA
                              10675                 :                :                 {
  900 akapila@postgresql.o    10676                 :              9 :                     $$ = makeNode(PublicationObjSpec);
                              10677                 :              9 :                     $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
                              10678                 :              9 :                     $$->location = @1;
                              10679                 :                :                 }
                              10680                 :                :                 ;
                              10681                 :                : 
                              10682                 :                : pub_obj_list:   PublicationObjSpec
  951 alvherre@alvh.no-ip.    10683                 :            736 :                     { $$ = list_make1($1); }
                              10684                 :                :             | pub_obj_list ',' PublicationObjSpec
  900 akapila@postgresql.o    10685                 :            112 :                     { $$ = lappend($1, $3); }
                              10686                 :                :     ;
                              10687                 :                : 
                              10688                 :                : /*****************************************************************************
                              10689                 :                :  *
                              10690                 :                :  * ALTER PUBLICATION name SET ( options )
                              10691                 :                :  *
                              10692                 :                :  * ALTER PUBLICATION name ADD pub_obj [, ...]
                              10693                 :                :  *
                              10694                 :                :  * ALTER PUBLICATION name DROP pub_obj [, ...]
                              10695                 :                :  *
                              10696                 :                :  * ALTER PUBLICATION name SET pub_obj [, ...]
                              10697                 :                :  *
                              10698                 :                :  * pub_obj is one of:
                              10699                 :                :  *
                              10700                 :                :  *      TABLE table_name [, ...]
                              10701                 :                :  *      TABLES IN SCHEMA schema_name [, ...]
                              10702                 :                :  *
                              10703                 :                :  *****************************************************************************/
                              10704                 :                : 
                              10705                 :                : AlterPublicationStmt:
                              10706                 :                :             ALTER PUBLICATION name SET definition
                              10707                 :                :                 {
 2642 peter_e@gmx.net         10708                 :             55 :                     AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
                              10709                 :                : 
                              10710                 :             55 :                     n->pubname = $3;
                              10711                 :             55 :                     n->options = $5;
  702 peter@eisentraut.org    10712                 :             55 :                     $$ = (Node *) n;
                              10713                 :                :                 }
                              10714                 :                :             | ALTER PUBLICATION name ADD_P pub_obj_list
                              10715                 :                :                 {
 2642 peter_e@gmx.net         10716                 :            166 :                     AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
                              10717                 :                : 
                              10718                 :            166 :                     n->pubname = $3;
  900 akapila@postgresql.o    10719                 :            166 :                     n->pubobjects = $5;
                              10720                 :            166 :                     preprocess_pubobj_list(n->pubobjects, yyscanner);
  832 alvherre@alvh.no-ip.    10721                 :            163 :                     n->action = AP_AddObjects;
  702 peter@eisentraut.org    10722                 :            163 :                     $$ = (Node *) n;
                              10723                 :                :                 }
                              10724                 :                :             | ALTER PUBLICATION name SET pub_obj_list
                              10725                 :                :                 {
 2642 peter_e@gmx.net         10726                 :            220 :                     AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
                              10727                 :                : 
                              10728                 :            220 :                     n->pubname = $3;
  900 akapila@postgresql.o    10729                 :            220 :                     n->pubobjects = $5;
                              10730                 :            220 :                     preprocess_pubobj_list(n->pubobjects, yyscanner);
  832 alvherre@alvh.no-ip.    10731                 :            220 :                     n->action = AP_SetObjects;
  702 peter@eisentraut.org    10732                 :            220 :                     $$ = (Node *) n;
                              10733                 :                :                 }
                              10734                 :                :             | ALTER PUBLICATION name DROP pub_obj_list
                              10735                 :                :                 {
 2642 peter_e@gmx.net         10736                 :             74 :                     AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
                              10737                 :                : 
                              10738                 :             74 :                     n->pubname = $3;
  900 akapila@postgresql.o    10739                 :             74 :                     n->pubobjects = $5;
                              10740                 :             74 :                     preprocess_pubobj_list(n->pubobjects, yyscanner);
  832 alvherre@alvh.no-ip.    10741                 :             74 :                     n->action = AP_DropObjects;
  702 peter@eisentraut.org    10742                 :             74 :                     $$ = (Node *) n;
                              10743                 :                :                 }
                              10744                 :                :         ;
                              10745                 :                : 
                              10746                 :                : /*****************************************************************************
                              10747                 :                :  *
                              10748                 :                :  * CREATE SUBSCRIPTION name ...
                              10749                 :                :  *
                              10750                 :                :  *****************************************************************************/
                              10751                 :                : 
                              10752                 :                : CreateSubscriptionStmt:
                              10753                 :                :             CREATE SUBSCRIPTION name CONNECTION Sconst PUBLICATION name_list opt_definition
                              10754                 :                :                 {
 2642 peter_e@gmx.net         10755                 :ECB       (191) :                     CreateSubscriptionStmt *n =
 2642 peter_e@gmx.net         10756                 :CBC         211 :                         makeNode(CreateSubscriptionStmt);
                              10757                 :            211 :                     n->subname = $3;
                              10758                 :            211 :                     n->conninfo = $5;
                              10759                 :            211 :                     n->publication = $7;
                              10760                 :            211 :                     n->options = $8;
  702 peter@eisentraut.org    10761                 :            211 :                     $$ = (Node *) n;
                              10762                 :                :                 }
                              10763                 :                :         ;
                              10764                 :                : 
                              10765                 :                : /*****************************************************************************
                              10766                 :                :  *
                              10767                 :                :  * ALTER SUBSCRIPTION name ...
                              10768                 :                :  *
                              10769                 :                :  *****************************************************************************/
                              10770                 :                : 
                              10771                 :                : AlterSubscriptionStmt:
                              10772                 :                :             ALTER SUBSCRIPTION name SET definition
                              10773                 :                :                 {
 2642 peter_e@gmx.net         10774                 :ECB        (86) :                     AlterSubscriptionStmt *n =
 2642 peter_e@gmx.net         10775                 :CBC          90 :                         makeNode(AlterSubscriptionStmt);
                              10776                 :                : 
 2579                         10777                 :             90 :                     n->kind = ALTER_SUBSCRIPTION_OPTIONS;
 2642                         10778                 :             90 :                     n->subname = $3;
                              10779                 :             90 :                     n->options = $5;
  702 peter@eisentraut.org    10780                 :             90 :                     $$ = (Node *) n;
                              10781                 :                :                 }
                              10782                 :                :             | ALTER SUBSCRIPTION name CONNECTION Sconst
                              10783                 :                :                 {
 2642 peter_e@gmx.net         10784                 :ECB        (11) :                     AlterSubscriptionStmt *n =
 2642 peter_e@gmx.net         10785                 :CBC          13 :                         makeNode(AlterSubscriptionStmt);
                              10786                 :                : 
 2579                         10787                 :             13 :                     n->kind = ALTER_SUBSCRIPTION_CONNECTION;
 2642                         10788                 :             13 :                     n->subname = $3;
 2579                         10789                 :             13 :                     n->conninfo = $5;
  702 peter@eisentraut.org    10790                 :             13 :                     $$ = (Node *) n;
                              10791                 :                :                 }
                              10792                 :                :             | ALTER SUBSCRIPTION name REFRESH PUBLICATION opt_definition
                              10793                 :                :                 {
 2579 peter_e@gmx.net         10794                 :ECB        (27) :                     AlterSubscriptionStmt *n =
 2579 peter_e@gmx.net         10795                 :CBC          27 :                         makeNode(AlterSubscriptionStmt);
                              10796                 :                : 
                              10797                 :             27 :                     n->kind = ALTER_SUBSCRIPTION_REFRESH;
                              10798                 :             27 :                     n->subname = $3;
                              10799                 :             27 :                     n->options = $6;
  702 peter@eisentraut.org    10800                 :             27 :                     $$ = (Node *) n;
                              10801                 :                :                 }
                              10802                 :                :             | ALTER SUBSCRIPTION name ADD_P PUBLICATION name_list opt_definition
                              10803                 :                :                 {
 1104 peter@eisentraut.org    10804                 :ECB        (14) :                     AlterSubscriptionStmt *n =
 1104 peter@eisentraut.org    10805                 :CBC          14 :                         makeNode(AlterSubscriptionStmt);
                              10806                 :                : 
                              10807                 :             14 :                     n->kind = ALTER_SUBSCRIPTION_ADD_PUBLICATION;
                              10808                 :             14 :                     n->subname = $3;
                              10809                 :             14 :                     n->publication = $6;
                              10810                 :             14 :                     n->options = $7;
  702                         10811                 :             14 :                     $$ = (Node *) n;
                              10812                 :                :                 }
                              10813                 :                :             | ALTER SUBSCRIPTION name DROP PUBLICATION name_list opt_definition
                              10814                 :                :                 {
 1104 peter@eisentraut.org    10815                 :ECB        (13) :                     AlterSubscriptionStmt *n =
 1104 peter@eisentraut.org    10816                 :CBC          13 :                         makeNode(AlterSubscriptionStmt);
                              10817                 :                : 
                              10818                 :             13 :                     n->kind = ALTER_SUBSCRIPTION_DROP_PUBLICATION;
                              10819                 :             13 :                     n->subname = $3;
                              10820                 :             13 :                     n->publication = $6;
                              10821                 :             13 :                     n->options = $7;
  702                         10822                 :             13 :                     $$ = (Node *) n;
                              10823                 :                :                 }
                              10824                 :                :             | ALTER SUBSCRIPTION name SET PUBLICATION name_list opt_definition
                              10825                 :                :                 {
 2642 peter_e@gmx.net         10826                 :ECB        (20) :                     AlterSubscriptionStmt *n =
 2642 peter_e@gmx.net         10827                 :CBC          20 :                         makeNode(AlterSubscriptionStmt);
                              10828                 :                : 
 1104 peter@eisentraut.org    10829                 :             20 :                     n->kind = ALTER_SUBSCRIPTION_SET_PUBLICATION;
 2642 peter_e@gmx.net         10830                 :             20 :                     n->subname = $3;
 2579                         10831                 :             20 :                     n->publication = $6;
 2505                         10832                 :             20 :                     n->options = $7;
  702 peter@eisentraut.org    10833                 :             20 :                     $$ = (Node *) n;
                              10834                 :                :                 }
                              10835                 :                :             | ALTER SUBSCRIPTION name ENABLE_P
                              10836                 :                :                 {
 2642 peter_e@gmx.net         10837                 :ECB        (14) :                     AlterSubscriptionStmt *n =
 2642 peter_e@gmx.net         10838                 :CBC          22 :                         makeNode(AlterSubscriptionStmt);
                              10839                 :                : 
 2579                         10840                 :             22 :                     n->kind = ALTER_SUBSCRIPTION_ENABLED;
 2642                         10841                 :             22 :                     n->subname = $3;
                              10842                 :             22 :                     n->options = list_make1(makeDefElem("enabled",
                              10843                 :                :                                             (Node *) makeBoolean(true), @1));
  702 peter@eisentraut.org    10844                 :             22 :                     $$ = (Node *) n;
                              10845                 :                :                 }
                              10846                 :                :             | ALTER SUBSCRIPTION name DISABLE_P
                              10847                 :                :                 {
 2642 peter_e@gmx.net         10848                 :ECB         (9) :                     AlterSubscriptionStmt *n =
 2642 peter_e@gmx.net         10849                 :CBC          13 :                         makeNode(AlterSubscriptionStmt);
                              10850                 :                : 
 2579                         10851                 :             13 :                     n->kind = ALTER_SUBSCRIPTION_ENABLED;
 2642                         10852                 :             13 :                     n->subname = $3;
                              10853                 :             13 :                     n->options = list_make1(makeDefElem("enabled",
                              10854                 :                :                                             (Node *) makeBoolean(false), @1));
  702 peter@eisentraut.org    10855                 :             13 :                     $$ = (Node *) n;
                              10856                 :                :                 }
                              10857                 :                :             | ALTER SUBSCRIPTION name SKIP definition
                              10858                 :                :                 {
  754 akapila@postgresql.o    10859                 :ECB        (12) :                     AlterSubscriptionStmt *n =
  754 akapila@postgresql.o    10860                 :CBC          12 :                         makeNode(AlterSubscriptionStmt);
                              10861                 :                : 
                              10862                 :             12 :                     n->kind = ALTER_SUBSCRIPTION_SKIP;
                              10863                 :             12 :                     n->subname = $3;
                              10864                 :             12 :                     n->options = $5;
  702 peter@eisentraut.org    10865                 :             12 :                     $$ = (Node *) n;
                              10866                 :                :                 }
                              10867                 :                :         ;
                              10868                 :                : 
                              10869                 :                : /*****************************************************************************
                              10870                 :                :  *
                              10871                 :                :  * DROP SUBSCRIPTION [ IF EXISTS ] name
                              10872                 :                :  *
                              10873                 :                :  *****************************************************************************/
                              10874                 :                : 
                              10875                 :                : DropSubscriptionStmt: DROP SUBSCRIPTION name opt_drop_behavior
                              10876                 :                :                 {
 2642 peter_e@gmx.net         10877                 :             93 :                     DropSubscriptionStmt *n = makeNode(DropSubscriptionStmt);
                              10878                 :                : 
                              10879                 :             93 :                     n->subname = $3;
                              10880                 :             93 :                     n->missing_ok = false;
 2532                         10881                 :             93 :                     n->behavior = $4;
 2642                         10882                 :             93 :                     $$ = (Node *) n;
                              10883                 :                :                 }
                              10884                 :                :                 |  DROP SUBSCRIPTION IF_P EXISTS name opt_drop_behavior
                              10885                 :                :                 {
                              10886                 :              3 :                     DropSubscriptionStmt *n = makeNode(DropSubscriptionStmt);
                              10887                 :                : 
                              10888                 :              3 :                     n->subname = $5;
                              10889                 :              3 :                     n->missing_ok = true;
 2532                         10890                 :              3 :                     n->behavior = $6;
 2642                         10891                 :              3 :                     $$ = (Node *) n;
                              10892                 :                :                 }
                              10893                 :                :         ;
                              10894                 :                : 
                              10895                 :                : /*****************************************************************************
                              10896                 :                :  *
                              10897                 :                :  *      QUERY:  Define Rewrite Rule
                              10898                 :                :  *
                              10899                 :                :  *****************************************************************************/
                              10900                 :                : 
                              10901                 :                : RuleStmt:   CREATE opt_or_replace RULE name AS
                              10902                 :                :             ON event TO qualified_name where_clause
                              10903                 :                :             DO opt_instead RuleActionList
                              10904                 :                :                 {
  702 peter@eisentraut.org    10905                 :            515 :                     RuleStmt   *n = makeNode(RuleStmt);
                              10906                 :                : 
 7895 tgl@sss.pgh.pa.us       10907                 :            515 :                     n->replace = $2;
 5274                         10908                 :            515 :                     n->relation = $9;
 7895                         10909                 :            515 :                     n->rulename = $4;
 5274                         10910                 :            515 :                     n->whereClause = $10;
                              10911                 :            515 :                     n->event = $7;
                              10912                 :            515 :                     n->instead = $12;
                              10913                 :            515 :                     n->actions = $13;
  702 peter@eisentraut.org    10914                 :            515 :                     $$ = (Node *) n;
                              10915                 :                :                 }
                              10916                 :                :         ;
                              10917                 :                : 
                              10918                 :                : RuleActionList:
 7972 bruce@momjian.us        10919                 :             70 :             NOTHING                                 { $$ = NIL; }
 7259 neilc@samurai.com       10920                 :            422 :             | RuleActionStmt                        { $$ = list_make1($1); }
 7972 bruce@momjian.us        10921                 :             23 :             | '(' RuleActionMulti ')'               { $$ = $2; }
                              10922                 :                :         ;
                              10923                 :                : 
                              10924                 :                : /* the thrashing around here is to discard "empty" statements... */
                              10925                 :                : RuleActionMulti:
                              10926                 :                :             RuleActionMulti ';' RuleActionStmtOrEmpty
 7403 neilc@samurai.com       10927         [ +  + ]:             31 :                 { if ($3 != NULL)
 8569 bruce@momjian.us        10928                 :             23 :                     $$ = lappend($1, $3);
                              10929                 :                :                   else
 8956 tgl@sss.pgh.pa.us       10930                 :              8 :                     $$ = $1;
                              10931                 :                :                 }
                              10932                 :                :             | RuleActionStmtOrEmpty
 7403 neilc@samurai.com       10933         [ +  - ]:             23 :                 { if ($1 != NULL)
 7259                         10934                 :             23 :                     $$ = list_make1($1);
                              10935                 :                :                   else
 8956 tgl@sss.pgh.pa.us       10936                 :UBC           0 :                     $$ = NIL;
                              10937                 :                :                 }
                              10938                 :                :         ;
                              10939                 :                : 
                              10940                 :                : RuleActionStmt:
                              10941                 :                :             SelectStmt
                              10942                 :                :             | InsertStmt
                              10943                 :                :             | UpdateStmt
                              10944                 :                :             | DeleteStmt
                              10945                 :                :             | NotifyStmt
                              10946                 :                :         ;
                              10947                 :                : 
                              10948                 :                : RuleActionStmtOrEmpty:
 7972 bruce@momjian.us        10949                 :CBC          46 :             RuleActionStmt                          { $$ = $1; }
 7403 neilc@samurai.com       10950                 :              8 :             |   /*EMPTY*/                           { $$ = NULL; }
                              10951                 :                :         ;
                              10952                 :                : 
 7972 bruce@momjian.us        10953                 :              9 : event:      SELECT                                  { $$ = CMD_SELECT; }
                              10954                 :            191 :             | UPDATE                                { $$ = CMD_UPDATE; }
                              10955                 :             79 :             | DELETE_P                              { $$ = CMD_DELETE; }
                              10956                 :            236 :             | INSERT                                { $$ = CMD_INSERT; }
                              10957                 :                :          ;
                              10958                 :                : 
                              10959                 :                : opt_instead:
 2433 peter_e@gmx.net         10960                 :            356 :             INSTEAD                                 { $$ = true; }
                              10961                 :             78 :             | ALSO                                  { $$ = false; }
                              10962                 :             81 :             | /*EMPTY*/                             { $$ = false; }
                              10963                 :                :         ;
                              10964                 :                : 
                              10965                 :                : 
                              10966                 :                : /*****************************************************************************
                              10967                 :                :  *
                              10968                 :                :  *      QUERY:
                              10969                 :                :  *              NOTIFY <identifier> can appear both in rule bodies and
                              10970                 :                :  *              as a query-level command
                              10971                 :                :  *
                              10972                 :                :  *****************************************************************************/
                              10973                 :                : 
                              10974                 :                : NotifyStmt: NOTIFY ColId notify_payload
                              10975                 :                :                 {
 9715 bruce@momjian.us        10976                 :             61 :                     NotifyStmt *n = makeNode(NotifyStmt);
                              10977                 :                : 
 5704 tgl@sss.pgh.pa.us       10978                 :             61 :                     n->conditionname = $2;
 5171                         10979                 :             61 :                     n->payload = $3;
  702 peter@eisentraut.org    10980                 :             61 :                     $$ = (Node *) n;
                              10981                 :                :                 }
                              10982                 :                :         ;
                              10983                 :                : 
                              10984                 :                : notify_payload:
 5171 tgl@sss.pgh.pa.us       10985                 :             31 :             ',' Sconst                          { $$ = $2; }
                              10986                 :             30 :             | /*EMPTY*/                         { $$ = NULL; }
                              10987                 :                :         ;
                              10988                 :                : 
                              10989                 :                : ListenStmt: LISTEN ColId
                              10990                 :                :                 {
 9715 bruce@momjian.us        10991                 :             37 :                     ListenStmt *n = makeNode(ListenStmt);
                              10992                 :                : 
 5704 tgl@sss.pgh.pa.us       10993                 :             37 :                     n->conditionname = $2;
  702 peter@eisentraut.org    10994                 :             37 :                     $$ = (Node *) n;
                              10995                 :                :                 }
                              10996                 :                :         ;
                              10997                 :                : 
                              10998                 :                : UnlistenStmt:
                              10999                 :                :             UNLISTEN ColId
                              11000                 :                :                 {
 9364 scrappy@hub.org         11001                 :              3 :                     UnlistenStmt *n = makeNode(UnlistenStmt);
                              11002                 :                : 
 5704 tgl@sss.pgh.pa.us       11003                 :              3 :                     n->conditionname = $2;
  702 peter@eisentraut.org    11004                 :              3 :                     $$ = (Node *) n;
                              11005                 :                :                 }
                              11006                 :                :             | UNLISTEN '*'
                              11007                 :                :                 {
 9319 lockhart@fourpalms.o    11008                 :             16 :                     UnlistenStmt *n = makeNode(UnlistenStmt);
                              11009                 :                : 
 5704 tgl@sss.pgh.pa.us       11010                 :             16 :                     n->conditionname = NULL;
  702 peter@eisentraut.org    11011                 :             16 :                     $$ = (Node *) n;
                              11012                 :                :                 }
                              11013                 :                :         ;
                              11014                 :                : 
                              11015                 :                : 
                              11016                 :                : /*****************************************************************************
                              11017                 :                :  *
                              11018                 :                :  *      Transactions:
                              11019                 :                :  *
                              11020                 :                :  *      BEGIN / COMMIT / ROLLBACK
                              11021                 :                :  *      (also older versions END / ABORT)
                              11022                 :                :  *
                              11023                 :                :  *****************************************************************************/
                              11024                 :                : 
                              11025                 :                : TransactionStmt:
                              11026                 :                :             ABORT_P opt_transaction opt_transaction_chain
                              11027                 :                :                 {
 9715 bruce@momjian.us        11028                 :            102 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11029                 :                : 
 7734 tgl@sss.pgh.pa.us       11030                 :            102 :                     n->kind = TRANS_STMT_ROLLBACK;
 7924 bruce@momjian.us        11031                 :            102 :                     n->options = NIL;
 1848 peter@eisentraut.org    11032                 :            102 :                     n->chain = $3;
  262 michael@paquier.xyz     11033                 :GNC         102 :                     n->location = -1;
  702 peter@eisentraut.org    11034                 :CBC         102 :                     $$ = (Node *) n;
                              11035                 :                :                 }
                              11036                 :                :             | START TRANSACTION transaction_mode_list_or_empty
                              11037                 :                :                 {
 9715 bruce@momjian.us        11038                 :            791 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11039                 :                : 
 7734 tgl@sss.pgh.pa.us       11040                 :            791 :                     n->kind = TRANS_STMT_START;
 7924 bruce@momjian.us        11041                 :            791 :                     n->options = $3;
  262 michael@paquier.xyz     11042                 :GNC         791 :                     n->location = -1;
  702 peter@eisentraut.org    11043                 :CBC         791 :                     $$ = (Node *) n;
                              11044                 :                :                 }
                              11045                 :                :             | COMMIT opt_transaction opt_transaction_chain
                              11046                 :                :                 {
 8652 lockhart@fourpalms.o    11047                 :           5677 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11048                 :                : 
 7734 tgl@sss.pgh.pa.us       11049                 :           5677 :                     n->kind = TRANS_STMT_COMMIT;
 7924 bruce@momjian.us        11050                 :           5677 :                     n->options = NIL;
 1848 peter@eisentraut.org    11051                 :           5677 :                     n->chain = $3;
  262 michael@paquier.xyz     11052                 :GNC        5677 :                     n->location = -1;
  702 peter@eisentraut.org    11053                 :CBC        5677 :                     $$ = (Node *) n;
                              11054                 :                :                 }
                              11055                 :                :             | ROLLBACK opt_transaction opt_transaction_chain
                              11056                 :                :                 {
 9715 bruce@momjian.us        11057                 :           1163 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11058                 :                : 
 7734 tgl@sss.pgh.pa.us       11059                 :           1163 :                     n->kind = TRANS_STMT_ROLLBACK;
 7924 bruce@momjian.us        11060                 :           1163 :                     n->options = NIL;
 1848 peter@eisentraut.org    11061                 :           1163 :                     n->chain = $3;
  262 michael@paquier.xyz     11062                 :GNC        1163 :                     n->location = -1;
  702 peter@eisentraut.org    11063                 :CBC        1163 :                     $$ = (Node *) n;
                              11064                 :                :                 }
                              11065                 :                :             | SAVEPOINT ColId
                              11066                 :                :                 {
 7201 tgl@sss.pgh.pa.us       11067                 :           1027 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11068                 :                : 
                              11069                 :           1027 :                     n->kind = TRANS_STMT_SAVEPOINT;
 2249 peter_e@gmx.net         11070                 :           1027 :                     n->savepoint_name = $2;
  262 michael@paquier.xyz     11071                 :GNC        1027 :                     n->location = @2;
  702 peter@eisentraut.org    11072                 :CBC        1027 :                     $$ = (Node *) n;
                              11073                 :                :                 }
                              11074                 :                :             | RELEASE SAVEPOINT ColId
                              11075                 :                :                 {
 7185 tgl@sss.pgh.pa.us       11076                 :            104 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11077                 :                : 
                              11078                 :            104 :                     n->kind = TRANS_STMT_RELEASE;
 2249 peter_e@gmx.net         11079                 :            104 :                     n->savepoint_name = $3;
  262 michael@paquier.xyz     11080                 :GNC         104 :                     n->location = @3;
  702 peter@eisentraut.org    11081                 :CBC         104 :                     $$ = (Node *) n;
                              11082                 :                :                 }
                              11083                 :                :             | RELEASE ColId
                              11084                 :                :                 {
 7201 tgl@sss.pgh.pa.us       11085                 :             47 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11086                 :                : 
                              11087                 :             47 :                     n->kind = TRANS_STMT_RELEASE;
 2249 peter_e@gmx.net         11088                 :             47 :                     n->savepoint_name = $2;
  262 michael@paquier.xyz     11089                 :GNC          47 :                     n->location = @2;
  702 peter@eisentraut.org    11090                 :CBC          47 :                     $$ = (Node *) n;
                              11091                 :                :                 }
                              11092                 :                :             | ROLLBACK opt_transaction TO SAVEPOINT ColId
                              11093                 :                :                 {
 7201 tgl@sss.pgh.pa.us       11094                 :            109 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11095                 :                : 
                              11096                 :            109 :                     n->kind = TRANS_STMT_ROLLBACK_TO;
 2249 peter_e@gmx.net         11097                 :            109 :                     n->savepoint_name = $5;
  262 michael@paquier.xyz     11098                 :GNC         109 :                     n->location = @5;
  702 peter@eisentraut.org    11099                 :CBC         109 :                     $$ = (Node *) n;
                              11100                 :                :                 }
                              11101                 :                :             | ROLLBACK opt_transaction TO ColId
                              11102                 :                :                 {
 7185 tgl@sss.pgh.pa.us       11103                 :            255 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11104                 :                : 
                              11105                 :            255 :                     n->kind = TRANS_STMT_ROLLBACK_TO;
 2249 peter_e@gmx.net         11106                 :            255 :                     n->savepoint_name = $4;
  262 michael@paquier.xyz     11107                 :GNC         255 :                     n->location = @4;
  702 peter@eisentraut.org    11108                 :CBC         255 :                     $$ = (Node *) n;
                              11109                 :                :                 }
                              11110                 :                :             | PREPARE TRANSACTION Sconst
                              11111                 :                :                 {
 6876 tgl@sss.pgh.pa.us       11112                 :            421 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11113                 :                : 
                              11114                 :            421 :                     n->kind = TRANS_STMT_PREPARE;
                              11115                 :            421 :                     n->gid = $3;
  246 michael@paquier.xyz     11116                 :GNC         421 :                     n->location = @3;
  702 peter@eisentraut.org    11117                 :CBC         421 :                     $$ = (Node *) n;
                              11118                 :                :                 }
                              11119                 :                :             | COMMIT PREPARED Sconst
                              11120                 :                :                 {
 6876 tgl@sss.pgh.pa.us       11121                 :            337 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11122                 :                : 
                              11123                 :            337 :                     n->kind = TRANS_STMT_COMMIT_PREPARED;
                              11124                 :            337 :                     n->gid = $3;
  246 michael@paquier.xyz     11125                 :GNC         337 :                     n->location = @3;
  702 peter@eisentraut.org    11126                 :CBC         337 :                     $$ = (Node *) n;
                              11127                 :                :                 }
                              11128                 :                :             | ROLLBACK PREPARED Sconst
                              11129                 :                :                 {
 6876 tgl@sss.pgh.pa.us       11130                 :             38 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11131                 :                : 
                              11132                 :             38 :                     n->kind = TRANS_STMT_ROLLBACK_PREPARED;
                              11133                 :             38 :                     n->gid = $3;
  246 michael@paquier.xyz     11134                 :GNC          38 :                     n->location = @3;
  702 peter@eisentraut.org    11135                 :CBC          38 :                     $$ = (Node *) n;
                              11136                 :                :                 }
                              11137                 :                :         ;
                              11138                 :                : 
                              11139                 :                : TransactionStmtLegacy:
                              11140                 :                :             BEGIN_P opt_transaction transaction_mode_list_or_empty
                              11141                 :                :                 {
 1103                         11142                 :           6882 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11143                 :                : 
                              11144                 :           6882 :                     n->kind = TRANS_STMT_BEGIN;
                              11145                 :           6882 :                     n->options = $3;
  262 michael@paquier.xyz     11146                 :GNC        6882 :                     n->location = -1;
  702 peter@eisentraut.org    11147                 :CBC        6882 :                     $$ = (Node *) n;
                              11148                 :                :                 }
                              11149                 :                :             | END_P opt_transaction opt_transaction_chain
                              11150                 :                :                 {
 1103                         11151                 :            180 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              11152                 :                : 
                              11153                 :            180 :                     n->kind = TRANS_STMT_COMMIT;
                              11154                 :            180 :                     n->options = NIL;
                              11155                 :            180 :                     n->chain = $3;
  262 michael@paquier.xyz     11156                 :GNC         180 :                     n->location = -1;
  702 peter@eisentraut.org    11157                 :CBC         180 :                     $$ = (Node *) n;
                              11158                 :                :                 }
                              11159                 :                :         ;
                              11160                 :                : 
                              11161                 :                : opt_transaction:    WORK
                              11162                 :                :             | TRANSACTION
                              11163                 :                :             | /*EMPTY*/
                              11164                 :                :         ;
                              11165                 :                : 
                              11166                 :                : transaction_mode_item:
                              11167                 :                :             ISOLATION LEVEL iso_level
 7185 tgl@sss.pgh.pa.us       11168                 :           3287 :                     { $$ = makeDefElem("transaction_isolation",
 2777 peter_e@gmx.net         11169                 :           3287 :                                        makeStringConst($3, @3), @1); }
                              11170                 :                :             | READ ONLY
 7185 tgl@sss.pgh.pa.us       11171                 :            650 :                     { $$ = makeDefElem("transaction_read_only",
 2433 peter_e@gmx.net         11172                 :            650 :                                        makeIntConst(true, @1), @1); }
                              11173                 :                :             | READ WRITE
 7185 tgl@sss.pgh.pa.us       11174                 :             44 :                     { $$ = makeDefElem("transaction_read_only",
 2433 peter_e@gmx.net         11175                 :             44 :                                        makeIntConst(false, @1), @1); }
                              11176                 :                :             | DEFERRABLE
 4815 heikki.linnakangas@i    11177                 :             22 :                     { $$ = makeDefElem("transaction_deferrable",
                              11178                 :                :                                        makeIntConst(true, @1), @1); }
                              11179                 :                :             | NOT DEFERRABLE
                              11180                 :              5 :                     { $$ = makeDefElem("transaction_deferrable",
 2433 peter_e@gmx.net         11181                 :              5 :                                        makeIntConst(false, @1), @1); }
                              11182                 :                :         ;
                              11183                 :                : 
                              11184                 :                : /* Syntax with commas is SQL-spec, without commas is Postgres historical */
                              11185                 :                : transaction_mode_list:
                              11186                 :                :             transaction_mode_item
 7185 tgl@sss.pgh.pa.us       11187                 :           3392 :                     { $$ = list_make1($1); }
                              11188                 :                :             | transaction_mode_list ',' transaction_mode_item
                              11189                 :            442 :                     { $$ = lappend($1, $3); }
                              11190                 :                :             | transaction_mode_list transaction_mode_item
                              11191                 :            174 :                     { $$ = lappend($1, $2); }
                              11192                 :                :         ;
                              11193                 :                : 
                              11194                 :                : transaction_mode_list_or_empty:
                              11195                 :                :             transaction_mode_list
                              11196                 :                :             | /* EMPTY */
 7765 peter_e@gmx.net         11197                 :           4551 :                     { $$ = NIL; }
                              11198                 :                :         ;
                              11199                 :                : 
                              11200                 :                : opt_transaction_chain:
 1848 peter@eisentraut.org    11201                 :             60 :             AND CHAIN       { $$ = true; }
                              11202                 :              1 :             | AND NO CHAIN  { $$ = false; }
                              11203                 :           7061 :             | /* EMPTY */   { $$ = false; }
                              11204                 :                :         ;
                              11205                 :                : 
                              11206                 :                : 
                              11207                 :                : /*****************************************************************************
                              11208                 :                :  *
                              11209                 :                :  *  QUERY:
                              11210                 :                :  *      CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')'
                              11211                 :                :  *          AS <query> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
                              11212                 :                :  *
                              11213                 :                :  *****************************************************************************/
                              11214                 :                : 
                              11215                 :                : ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list opt_reloptions
                              11216                 :                :                 AS SelectStmt opt_check_option
                              11217                 :                :                 {
  702                         11218                 :           6553 :                     ViewStmt   *n = makeNode(ViewStmt);
                              11219                 :                : 
 7895 tgl@sss.pgh.pa.us       11220                 :           6553 :                     n->view = $4;
 4871 rhaas@postgresql.org    11221                 :           6553 :                     n->view->relpersistence = $2;
 7895 tgl@sss.pgh.pa.us       11222                 :           6553 :                     n->aliases = $5;
 4497 rhaas@postgresql.org    11223                 :           6553 :                     n->query = $8;
 6242 tgl@sss.pgh.pa.us       11224                 :           6553 :                     n->replace = false;
 4497 rhaas@postgresql.org    11225                 :           6553 :                     n->options = $6;
 3923 sfrost@snowman.net      11226                 :           6553 :                     n->withCheckOption = $9;
 7011 neilc@samurai.com       11227                 :           6553 :                     $$ = (Node *) n;
                              11228                 :                :                 }
                              11229                 :                :         | CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list opt_reloptions
                              11230                 :                :                 AS SelectStmt opt_check_option
                              11231                 :                :                 {
  702 peter@eisentraut.org    11232                 :            122 :                     ViewStmt   *n = makeNode(ViewStmt);
                              11233                 :                : 
 7011 neilc@samurai.com       11234                 :            122 :                     n->view = $6;
 4871 rhaas@postgresql.org    11235                 :            122 :                     n->view->relpersistence = $4;
 7011 neilc@samurai.com       11236                 :            122 :                     n->aliases = $7;
 4497 rhaas@postgresql.org    11237                 :            122 :                     n->query = $10;
 6242 tgl@sss.pgh.pa.us       11238                 :            122 :                     n->replace = true;
 4497 rhaas@postgresql.org    11239                 :            122 :                     n->options = $8;
 3923 sfrost@snowman.net      11240                 :            122 :                     n->withCheckOption = $11;
 7011 neilc@samurai.com       11241                 :            122 :                     $$ = (Node *) n;
                              11242                 :                :                 }
                              11243                 :                :         | CREATE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions
                              11244                 :                :                 AS SelectStmt opt_check_option
                              11245                 :                :                 {
  702 peter@eisentraut.org    11246                 :              4 :                     ViewStmt   *n = makeNode(ViewStmt);
                              11247                 :                : 
 4091 peter_e@gmx.net         11248                 :              4 :                     n->view = $5;
                              11249                 :              4 :                     n->view->relpersistence = $2;
                              11250                 :              4 :                     n->aliases = $7;
                              11251                 :              4 :                     n->query = makeRecursiveViewSelect(n->view->relname, n->aliases, $11);
                              11252                 :              4 :                     n->replace = false;
                              11253                 :              4 :                     n->options = $9;
 3923 sfrost@snowman.net      11254                 :              4 :                     n->withCheckOption = $12;
                              11255         [ -  + ]:              4 :                     if (n->withCheckOption != NO_CHECK_OPTION)
 3923 sfrost@snowman.net      11256         [ #  # ]:UBC           0 :                         ereport(ERROR,
                              11257                 :                :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              11258                 :                :                                  errmsg("WITH CHECK OPTION not supported on recursive views"),
                              11259                 :                :                                  parser_errposition(@12)));
 4091 peter_e@gmx.net         11260                 :CBC           4 :                     $$ = (Node *) n;
                              11261                 :                :                 }
                              11262                 :                :         | CREATE OR REPLACE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions
                              11263                 :                :                 AS SelectStmt opt_check_option
                              11264                 :                :                 {
  702 peter@eisentraut.org    11265                 :              3 :                     ViewStmt   *n = makeNode(ViewStmt);
                              11266                 :                : 
 4091 peter_e@gmx.net         11267                 :              3 :                     n->view = $7;
                              11268                 :              3 :                     n->view->relpersistence = $4;
                              11269                 :              3 :                     n->aliases = $9;
                              11270                 :              3 :                     n->query = makeRecursiveViewSelect(n->view->relname, n->aliases, $13);
                              11271                 :              3 :                     n->replace = true;
                              11272                 :              3 :                     n->options = $11;
 3923 sfrost@snowman.net      11273                 :              3 :                     n->withCheckOption = $14;
                              11274         [ -  + ]:              3 :                     if (n->withCheckOption != NO_CHECK_OPTION)
 3923 sfrost@snowman.net      11275         [ #  # ]:UBC           0 :                         ereport(ERROR,
                              11276                 :                :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              11277                 :                :                                  errmsg("WITH CHECK OPTION not supported on recursive views"),
                              11278                 :                :                                  parser_errposition(@14)));
 4091 peter_e@gmx.net         11279                 :CBC           3 :                     $$ = (Node *) n;
                              11280                 :                :                 }
                              11281                 :                :         ;
                              11282                 :                : 
                              11283                 :                : opt_check_option:
 3923 sfrost@snowman.net      11284                 :             45 :         WITH CHECK OPTION               { $$ = CASCADED_CHECK_OPTION; }
                              11285                 :              3 :         | WITH CASCADED CHECK OPTION    { $$ = CASCADED_CHECK_OPTION; }
                              11286                 :             12 :         | WITH LOCAL CHECK OPTION       { $$ = LOCAL_CHECK_OPTION; }
                              11287                 :           6622 :         | /* EMPTY */                   { $$ = NO_CHECK_OPTION; }
                              11288                 :                :         ;
                              11289                 :                : 
                              11290                 :                : /*****************************************************************************
                              11291                 :                :  *
                              11292                 :                :  *      QUERY:
                              11293                 :                :  *              LOAD "filename"
                              11294                 :                :  *
                              11295                 :                :  *****************************************************************************/
                              11296                 :                : 
                              11297                 :                : LoadStmt:   LOAD file_name
                              11298                 :                :                 {
  702 peter@eisentraut.org    11299                 :             29 :                     LoadStmt   *n = makeNode(LoadStmt);
                              11300                 :                : 
 9715 bruce@momjian.us        11301                 :             29 :                     n->filename = $2;
  702 peter@eisentraut.org    11302                 :             29 :                     $$ = (Node *) n;
                              11303                 :                :                 }
                              11304                 :                :         ;
                              11305                 :                : 
                              11306                 :                : 
                              11307                 :                : /*****************************************************************************
                              11308                 :                :  *
                              11309                 :                :  *      CREATE DATABASE
                              11310                 :                :  *
                              11311                 :                :  *****************************************************************************/
                              11312                 :                : 
                              11313                 :                : CreatedbStmt:
                              11314                 :                :             CREATE DATABASE name opt_with createdb_opt_list
                              11315                 :                :                 {
 8572 tgl@sss.pgh.pa.us       11316                 :            319 :                     CreatedbStmt *n = makeNode(CreatedbStmt);
                              11317                 :                : 
 9715 bruce@momjian.us        11318                 :            319 :                     n->dbname = $3;
 7971                         11319                 :            319 :                     n->options = $5;
  702 peter@eisentraut.org    11320                 :            319 :                     $$ = (Node *) n;
                              11321                 :                :                 }
                              11322                 :                :         ;
                              11323                 :                : 
                              11324                 :                : createdb_opt_list:
 3575 tgl@sss.pgh.pa.us       11325                 :            243 :             createdb_opt_items                      { $$ = $1; }
 7971 bruce@momjian.us        11326                 :             88 :             | /* EMPTY */                           { $$ = NIL; }
                              11327                 :                :         ;
                              11328                 :                : 
                              11329                 :                : createdb_opt_items:
 3575 tgl@sss.pgh.pa.us       11330                 :            243 :             createdb_opt_item                       { $$ = list_make1($1); }
                              11331                 :            315 :             | createdb_opt_items createdb_opt_item  { $$ = lappend($1, $2); }
                              11332                 :                :         ;
                              11333                 :                : 
                              11334                 :                : createdb_opt_item:
                              11335                 :                :             createdb_opt_name opt_equal NumericOnly
                              11336                 :                :                 {
  527                         11337                 :             90 :                     $$ = makeDefElem($1, $3, @1);
                              11338                 :                :                 }
                              11339                 :                :             | createdb_opt_name opt_equal opt_boolean_or_string
                              11340                 :                :                 {
  702 peter@eisentraut.org    11341                 :            468 :                     $$ = makeDefElem($1, (Node *) makeString($3), @1);
                              11342                 :                :                 }
                              11343                 :                :             | createdb_opt_name opt_equal DEFAULT
                              11344                 :                :                 {
 2777 peter_e@gmx.net         11345                 :UBC           0 :                     $$ = makeDefElem($1, NULL, @1);
                              11346                 :                :                 }
                              11347                 :                :         ;
                              11348                 :                : 
                              11349                 :                : /*
                              11350                 :                :  * Ideally we'd use ColId here, but that causes shift/reduce conflicts against
                              11351                 :                :  * the ALTER DATABASE SET/RESET syntaxes.  Instead call out specific keywords
                              11352                 :                :  * we need, and allow IDENT so that database option names don't have to be
                              11353                 :                :  * parser keywords unless they are already keywords for other reasons.
                              11354                 :                :  *
                              11355                 :                :  * XXX this coding technique is fragile since if someone makes a formerly
                              11356                 :                :  * non-keyword option name into a keyword and forgets to add it here, the
                              11357                 :                :  * option will silently break.  Best defense is to provide a regression test
                              11358                 :                :  * exercising every such option, at least at the syntax level.
                              11359                 :                :  */
                              11360                 :                : createdb_opt_name:
 3575 tgl@sss.pgh.pa.us       11361                 :CBC         378 :             IDENT                           { $$ = $1; }
                              11362                 :              1 :             | CONNECTION LIMIT              { $$ = pstrdup("connection_limit"); }
                              11363                 :             30 :             | ENCODING                      { $$ = pstrdup($1); }
 3575 tgl@sss.pgh.pa.us       11364                 :UBC           0 :             | LOCATION                      { $$ = pstrdup($1); }
 3575 tgl@sss.pgh.pa.us       11365                 :CBC           1 :             | OWNER                         { $$ = pstrdup($1); }
                              11366                 :              8 :             | TABLESPACE                    { $$ = pstrdup($1); }
                              11367                 :            140 :             | TEMPLATE                      { $$ = pstrdup($1); }
                              11368                 :                :         ;
                              11369                 :                : 
                              11370                 :                : /*
                              11371                 :                :  *  Though the equals sign doesn't match other WITH options, pg_dump uses
                              11372                 :                :  *  equals for backward compatibility, and it doesn't seem worth removing it.
                              11373                 :                :  */
                              11374                 :                : opt_equal:  '='
                              11375                 :                :             | /*EMPTY*/
                              11376                 :                :         ;
                              11377                 :                : 
                              11378                 :                : 
                              11379                 :                : /*****************************************************************************
                              11380                 :                :  *
                              11381                 :                :  *      ALTER DATABASE
                              11382                 :                :  *
                              11383                 :                :  *****************************************************************************/
                              11384                 :                : 
                              11385                 :                : AlterDatabaseStmt:
                              11386                 :                :             ALTER DATABASE name WITH createdb_opt_list
                              11387                 :                :                  {
 6832 tgl@sss.pgh.pa.us       11388                 :UBC           0 :                     AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
                              11389                 :                : 
                              11390                 :              0 :                     n->dbname = $3;
                              11391                 :              0 :                     n->options = $5;
  702 peter@eisentraut.org    11392                 :              0 :                     $$ = (Node *) n;
                              11393                 :                :                  }
                              11394                 :                :             | ALTER DATABASE name createdb_opt_list
                              11395                 :                :                  {
 3575 tgl@sss.pgh.pa.us       11396                 :CBC          12 :                     AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
                              11397                 :                : 
                              11398                 :             12 :                     n->dbname = $3;
                              11399                 :             12 :                     n->options = $4;
  702 peter@eisentraut.org    11400                 :             12 :                     $$ = (Node *) n;
                              11401                 :                :                  }
                              11402                 :                :             | ALTER DATABASE name SET TABLESPACE name
                              11403                 :                :                  {
 5637 tgl@sss.pgh.pa.us       11404                 :              5 :                     AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
                              11405                 :                : 
                              11406                 :              5 :                     n->dbname = $3;
                              11407                 :              5 :                     n->options = list_make1(makeDefElem("tablespace",
                              11408                 :                :                                                         (Node *) makeString($6), @6));
  702 peter@eisentraut.org    11409                 :              5 :                     $$ = (Node *) n;
                              11410                 :                :                  }
                              11411                 :                :             | ALTER DATABASE name REFRESH COLLATION VERSION_P
                              11412                 :                :                  {
  790                         11413                 :              3 :                     AlterDatabaseRefreshCollStmt *n = makeNode(AlterDatabaseRefreshCollStmt);
                              11414                 :                : 
                              11415                 :              3 :                     n->dbname = $3;
  702                         11416                 :              3 :                     $$ = (Node *) n;
                              11417                 :                :                  }
                              11418                 :                :         ;
                              11419                 :                : 
                              11420                 :                : AlterDatabaseSetStmt:
                              11421                 :                :             ALTER DATABASE name SetResetClause
                              11422                 :                :                 {
 8080 peter_e@gmx.net         11423                 :            535 :                     AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
                              11424                 :                : 
                              11425                 :            535 :                     n->dbname = $3;
 6068 tgl@sss.pgh.pa.us       11426                 :            535 :                     n->setstmt = $4;
  702 peter@eisentraut.org    11427                 :            535 :                     $$ = (Node *) n;
                              11428                 :                :                 }
                              11429                 :                :         ;
                              11430                 :                : 
                              11431                 :                : 
                              11432                 :                : /*****************************************************************************
                              11433                 :                :  *
                              11434                 :                :  *      DROP DATABASE [ IF EXISTS ] dbname [ [ WITH ] ( options ) ]
                              11435                 :                :  *
                              11436                 :                :  * This is implicitly CASCADE, no need for drop behavior
                              11437                 :                :  *****************************************************************************/
                              11438                 :                : 
                              11439                 :                : DropdbStmt: DROP DATABASE name
                              11440                 :                :                 {
 8060 tgl@sss.pgh.pa.us       11441                 :             36 :                     DropdbStmt *n = makeNode(DropdbStmt);
                              11442                 :                : 
                              11443                 :             36 :                     n->dbname = $3;
 2433 peter_e@gmx.net         11444                 :             36 :                     n->missing_ok = false;
 1615 akapila@postgresql.o    11445                 :             36 :                     n->options = NULL;
  702 peter@eisentraut.org    11446                 :             36 :                     $$ = (Node *) n;
                              11447                 :                :                 }
                              11448                 :                :             | DROP DATABASE IF_P EXISTS name
                              11449                 :                :                 {
 6718 andrew@dunslane.net     11450                 :              2 :                     DropdbStmt *n = makeNode(DropdbStmt);
                              11451                 :                : 
                              11452                 :              2 :                     n->dbname = $5;
 2433 peter_e@gmx.net         11453                 :              2 :                     n->missing_ok = true;
 1615 akapila@postgresql.o    11454                 :              2 :                     n->options = NULL;
  702 peter@eisentraut.org    11455                 :              2 :                     $$ = (Node *) n;
                              11456                 :                :                 }
                              11457                 :                :             | DROP DATABASE name opt_with '(' drop_option_list ')'
                              11458                 :                :                 {
 1615 akapila@postgresql.o    11459                 :              7 :                     DropdbStmt *n = makeNode(DropdbStmt);
                              11460                 :                : 
                              11461                 :              7 :                     n->dbname = $3;
                              11462                 :              7 :                     n->missing_ok = false;
                              11463                 :              7 :                     n->options = $6;
  702 peter@eisentraut.org    11464                 :              7 :                     $$ = (Node *) n;
                              11465                 :                :                 }
                              11466                 :                :             | DROP DATABASE IF_P EXISTS name opt_with '(' drop_option_list ')'
                              11467                 :                :                 {
 1615 akapila@postgresql.o    11468                 :              6 :                     DropdbStmt *n = makeNode(DropdbStmt);
                              11469                 :                : 
                              11470                 :              6 :                     n->dbname = $5;
                              11471                 :              6 :                     n->missing_ok = true;
                              11472                 :              6 :                     n->options = $8;
  702 peter@eisentraut.org    11473                 :              6 :                     $$ = (Node *) n;
                              11474                 :                :                 }
                              11475                 :                :         ;
                              11476                 :                : 
                              11477                 :                : drop_option_list:
                              11478                 :                :             drop_option
                              11479                 :                :                 {
 1615 akapila@postgresql.o    11480                 :             13 :                     $$ = list_make1((Node *) $1);
                              11481                 :                :                 }
                              11482                 :                :             | drop_option_list ',' drop_option
                              11483                 :                :                 {
 1615 akapila@postgresql.o    11484                 :UBC           0 :                     $$ = lappend($1, (Node *) $3);
                              11485                 :                :                 }
                              11486                 :                :         ;
                              11487                 :                : 
                              11488                 :                : /*
                              11489                 :                :  * Currently only the FORCE option is supported, but the syntax is designed
                              11490                 :                :  * to be extensible so that we can add more options in the future if required.
                              11491                 :                :  */
                              11492                 :                : drop_option:
                              11493                 :                :             FORCE
                              11494                 :                :                 {
 1615 akapila@postgresql.o    11495                 :CBC          13 :                     $$ = makeDefElem("force", NULL, @1);
                              11496                 :                :                 }
                              11497                 :                :         ;
                              11498                 :                : 
                              11499                 :                : /*****************************************************************************
                              11500                 :                :  *
                              11501                 :                :  *      ALTER COLLATION
                              11502                 :                :  *
                              11503                 :                :  *****************************************************************************/
                              11504                 :                : 
                              11505                 :                : AlterCollationStmt: ALTER COLLATION any_name REFRESH VERSION_P
                              11506                 :                :                 {
 1073 tmunro@postgresql.or    11507                 :              3 :                     AlterCollationStmt *n = makeNode(AlterCollationStmt);
                              11508                 :                : 
                              11509                 :              3 :                     n->collname = $3;
  702 peter@eisentraut.org    11510                 :              3 :                     $$ = (Node *) n;
                              11511                 :                :                 }
                              11512                 :                :         ;
                              11513                 :                : 
                              11514                 :                : 
                              11515                 :                : /*****************************************************************************
                              11516                 :                :  *
                              11517                 :                :  *      ALTER SYSTEM
                              11518                 :                :  *
                              11519                 :                :  * This is used to change configuration parameters persistently.
                              11520                 :                :  *****************************************************************************/
                              11521                 :                : 
                              11522                 :                : AlterSystemStmt:
                              11523                 :                :             ALTER SYSTEM_P SET generic_set
                              11524                 :                :                 {
 3770 ishii@postgresql.org    11525                 :             55 :                     AlterSystemStmt *n = makeNode(AlterSystemStmt);
                              11526                 :                : 
                              11527                 :             55 :                     n->setstmt = $4;
  702 peter@eisentraut.org    11528                 :             55 :                     $$ = (Node *) n;
                              11529                 :                :                 }
                              11530                 :                :             | ALTER SYSTEM_P RESET generic_reset
                              11531                 :                :                 {
 3512 fujii@postgresql.org    11532                 :             24 :                     AlterSystemStmt *n = makeNode(AlterSystemStmt);
                              11533                 :                : 
                              11534                 :             24 :                     n->setstmt = $4;
  702 peter@eisentraut.org    11535                 :             24 :                     $$ = (Node *) n;
                              11536                 :                :                 }
                              11537                 :                :         ;
                              11538                 :                : 
                              11539                 :                : 
                              11540                 :                : /*****************************************************************************
                              11541                 :                :  *
                              11542                 :                :  * Manipulate a domain
                              11543                 :                :  *
                              11544                 :                :  *****************************************************************************/
                              11545                 :                : 
                              11546                 :                : CreateDomainStmt:
                              11547                 :                :             CREATE DOMAIN_P any_name opt_as Typename ColQualList
                              11548                 :                :                 {
 8062 bruce@momjian.us        11549                 :            564 :                     CreateDomainStmt *n = makeNode(CreateDomainStmt);
                              11550                 :                : 
                              11551                 :            564 :                     n->domainname = $3;
 5386 peter_e@gmx.net         11552                 :            564 :                     n->typeName = $5;
 4785 tgl@sss.pgh.pa.us       11553                 :            564 :                     SplitColQualList($6, &n->constraints, &n->collClause,
                              11554                 :                :                                      yyscanner);
  702 peter@eisentraut.org    11555                 :            564 :                     $$ = (Node *) n;
                              11556                 :                :                 }
                              11557                 :                :         ;
                              11558                 :                : 
                              11559                 :                : AlterDomainStmt:
                              11560                 :                :             /* ALTER DOMAIN <domain> {SET DEFAULT <expr>|DROP DEFAULT} */
                              11561                 :                :             ALTER DOMAIN_P any_name alter_column_default
                              11562                 :                :                 {
 7800 bruce@momjian.us        11563                 :              7 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11564                 :                : 
                              11565                 :              7 :                     n->subtype = 'T';
 5386 peter_e@gmx.net         11566                 :              7 :                     n->typeName = $3;
 7800 bruce@momjian.us        11567                 :              7 :                     n->def = $4;
  702 peter@eisentraut.org    11568                 :              7 :                     $$ = (Node *) n;
                              11569                 :                :                 }
                              11570                 :                :             /* ALTER DOMAIN <domain> DROP NOT NULL */
                              11571                 :                :             | ALTER DOMAIN_P any_name DROP NOT NULL_P
                              11572                 :                :                 {
 7800 bruce@momjian.us        11573                 :              6 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11574                 :                : 
                              11575                 :              6 :                     n->subtype = 'N';
 5386 peter_e@gmx.net         11576                 :              6 :                     n->typeName = $3;
  702 peter@eisentraut.org    11577                 :              6 :                     $$ = (Node *) n;
                              11578                 :                :                 }
                              11579                 :                :             /* ALTER DOMAIN <domain> SET NOT NULL */
                              11580                 :                :             | ALTER DOMAIN_P any_name SET NOT NULL_P
                              11581                 :                :                 {
 7800 bruce@momjian.us        11582                 :             12 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11583                 :                : 
                              11584                 :             12 :                     n->subtype = 'O';
 5386 peter_e@gmx.net         11585                 :             12 :                     n->typeName = $3;
  702 peter@eisentraut.org    11586                 :             12 :                     $$ = (Node *) n;
                              11587                 :                :                 }
                              11588                 :                :             /* ALTER DOMAIN <domain> ADD CONSTRAINT ... */
                              11589                 :                :             | ALTER DOMAIN_P any_name ADD_P TableConstraint
                              11590                 :                :                 {
 7800 bruce@momjian.us        11591                 :             84 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11592                 :                : 
                              11593                 :             84 :                     n->subtype = 'C';
 5386 peter_e@gmx.net         11594                 :             84 :                     n->typeName = $3;
 7800 bruce@momjian.us        11595                 :             84 :                     n->def = $5;
  702 peter@eisentraut.org    11596                 :             84 :                     $$ = (Node *) n;
                              11597                 :                :                 }
                              11598                 :                :             /* ALTER DOMAIN <domain> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
                              11599                 :                :             | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
                              11600                 :                :                 {
 7800 bruce@momjian.us        11601                 :             24 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11602                 :                : 
                              11603                 :             24 :                     n->subtype = 'X';
 5386 peter_e@gmx.net         11604                 :             24 :                     n->typeName = $3;
 7800 bruce@momjian.us        11605                 :             24 :                     n->name = $6;
                              11606                 :             24 :                     n->behavior = $7;
 4483 peter_e@gmx.net         11607                 :             24 :                     n->missing_ok = false;
  702 peter@eisentraut.org    11608                 :             24 :                     $$ = (Node *) n;
                              11609                 :                :                 }
                              11610                 :                :             /* ALTER DOMAIN <domain> DROP CONSTRAINT IF EXISTS <name> [RESTRICT|CASCADE] */
                              11611                 :                :             | ALTER DOMAIN_P any_name DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
                              11612                 :                :                 {
 4483 peter_e@gmx.net         11613                 :              3 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11614                 :                : 
                              11615                 :              3 :                     n->subtype = 'X';
                              11616                 :              3 :                     n->typeName = $3;
                              11617                 :              3 :                     n->name = $8;
                              11618                 :              3 :                     n->behavior = $9;
                              11619                 :              3 :                     n->missing_ok = true;
  702 peter@eisentraut.org    11620                 :              3 :                     $$ = (Node *) n;
                              11621                 :                :                 }
                              11622                 :                :             /* ALTER DOMAIN <domain> VALIDATE CONSTRAINT <name> */
                              11623                 :                :             | ALTER DOMAIN_P any_name VALIDATE CONSTRAINT name
                              11624                 :                :                 {
 4701 alvherre@alvh.no-ip.    11625                 :              6 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11626                 :                : 
                              11627                 :              6 :                     n->subtype = 'V';
                              11628                 :              6 :                     n->typeName = $3;
                              11629                 :              6 :                     n->name = $6;
  702 peter@eisentraut.org    11630                 :              6 :                     $$ = (Node *) n;
                              11631                 :                :                 }
                              11632                 :                :             ;
                              11633                 :                : 
                              11634                 :                : opt_as:     AS
                              11635                 :                :             | /* EMPTY */
                              11636                 :                :         ;
                              11637                 :                : 
                              11638                 :                : 
                              11639                 :                : /*****************************************************************************
                              11640                 :                :  *
                              11641                 :                :  * Manipulate a text search dictionary or configuration
                              11642                 :                :  *
                              11643                 :                :  *****************************************************************************/
                              11644                 :                : 
                              11645                 :                : AlterTSDictionaryStmt:
                              11646                 :                :             ALTER TEXT_P SEARCH DICTIONARY any_name definition
                              11647                 :                :                 {
 6081 tgl@sss.pgh.pa.us       11648                 :             20 :                     AlterTSDictionaryStmt *n = makeNode(AlterTSDictionaryStmt);
                              11649                 :                : 
                              11650                 :             20 :                     n->dictname = $5;
                              11651                 :             20 :                     n->options = $6;
  702 peter@eisentraut.org    11652                 :             20 :                     $$ = (Node *) n;
                              11653                 :                :                 }
                              11654                 :                :         ;
                              11655                 :                : 
                              11656                 :                : AlterTSConfigurationStmt:
                              11657                 :                :             ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list any_with any_name_list
                              11658                 :                :                 {
 6081 tgl@sss.pgh.pa.us       11659                 :           3191 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
                              11660                 :                : 
 3261 alvherre@alvh.no-ip.    11661                 :           3191 :                     n->kind = ALTER_TSCONFIG_ADD_MAPPING;
 6081 tgl@sss.pgh.pa.us       11662                 :           3191 :                     n->cfgname = $5;
                              11663                 :           3191 :                     n->tokentype = $9;
                              11664                 :           3191 :                     n->dicts = $11;
                              11665                 :           3191 :                     n->override = false;
                              11666                 :           3191 :                     n->replace = false;
  702 peter@eisentraut.org    11667                 :           3191 :                     $$ = (Node *) n;
                              11668                 :                :                 }
                              11669                 :                :             | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list any_with any_name_list
                              11670                 :                :                 {
 6081 tgl@sss.pgh.pa.us       11671                 :             13 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
                              11672                 :                : 
 3261 alvherre@alvh.no-ip.    11673                 :             13 :                     n->kind = ALTER_TSCONFIG_ALTER_MAPPING_FOR_TOKEN;
 6081 tgl@sss.pgh.pa.us       11674                 :             13 :                     n->cfgname = $5;
                              11675                 :             13 :                     n->tokentype = $9;
                              11676                 :             13 :                     n->dicts = $11;
                              11677                 :             13 :                     n->override = true;
                              11678                 :             13 :                     n->replace = false;
  702 peter@eisentraut.org    11679                 :             13 :                     $$ = (Node *) n;
                              11680                 :                :                 }
                              11681                 :                :             | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING REPLACE any_name any_with any_name
                              11682                 :                :                 {
 6081 tgl@sss.pgh.pa.us       11683                 :              9 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
                              11684                 :                : 
 3261 alvherre@alvh.no-ip.    11685                 :              9 :                     n->kind = ALTER_TSCONFIG_REPLACE_DICT;
 6081 tgl@sss.pgh.pa.us       11686                 :              9 :                     n->cfgname = $5;
                              11687                 :              9 :                     n->tokentype = NIL;
                              11688                 :              9 :                     n->dicts = list_make2($9,$11);
                              11689                 :              9 :                     n->override = false;
                              11690                 :              9 :                     n->replace = true;
  702 peter@eisentraut.org    11691                 :              9 :                     $$ = (Node *) n;
                              11692                 :                :                 }
                              11693                 :                :             | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list REPLACE any_name any_with any_name
                              11694                 :                :                 {
 6081 tgl@sss.pgh.pa.us       11695                 :UBC           0 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
                              11696                 :                : 
 3261 alvherre@alvh.no-ip.    11697                 :              0 :                     n->kind = ALTER_TSCONFIG_REPLACE_DICT_FOR_TOKEN;
 6081 tgl@sss.pgh.pa.us       11698                 :              0 :                     n->cfgname = $5;
                              11699                 :              0 :                     n->tokentype = $9;
                              11700                 :              0 :                     n->dicts = list_make2($11,$13);
                              11701                 :              0 :                     n->override = false;
                              11702                 :              0 :                     n->replace = true;
  702 peter@eisentraut.org    11703                 :              0 :                     $$ = (Node *) n;
                              11704                 :                :                 }
                              11705                 :                :             | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING FOR name_list
                              11706                 :                :                 {
 6081 tgl@sss.pgh.pa.us       11707                 :CBC           9 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
                              11708                 :                : 
 3261 alvherre@alvh.no-ip.    11709                 :              9 :                     n->kind = ALTER_TSCONFIG_DROP_MAPPING;
 6081 tgl@sss.pgh.pa.us       11710                 :              9 :                     n->cfgname = $5;
                              11711                 :              9 :                     n->tokentype = $9;
                              11712                 :              9 :                     n->missing_ok = false;
  702 peter@eisentraut.org    11713                 :              9 :                     $$ = (Node *) n;
                              11714                 :                :                 }
                              11715                 :                :             | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING IF_P EXISTS FOR name_list
                              11716                 :                :                 {
 6081 tgl@sss.pgh.pa.us       11717                 :              6 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
                              11718                 :                : 
 3261 alvherre@alvh.no-ip.    11719                 :              6 :                     n->kind = ALTER_TSCONFIG_DROP_MAPPING;
 6081 tgl@sss.pgh.pa.us       11720                 :              6 :                     n->cfgname = $5;
                              11721                 :              6 :                     n->tokentype = $11;
                              11722                 :              6 :                     n->missing_ok = true;
  702 peter@eisentraut.org    11723                 :              6 :                     $$ = (Node *) n;
                              11724                 :                :                 }
                              11725                 :                :         ;
                              11726                 :                : 
                              11727                 :                : /* Use this if TIME or ORDINALITY after WITH should be taken as an identifier */
                              11728                 :                : any_with:   WITH
                              11729                 :                :             | WITH_LA
                              11730                 :                :         ;
                              11731                 :                : 
                              11732                 :                : 
                              11733                 :                : /*****************************************************************************
                              11734                 :                :  *
                              11735                 :                :  * Manipulate a conversion
                              11736                 :                :  *
                              11737                 :                :  *      CREATE [DEFAULT] CONVERSION <conversion_name>
                              11738                 :                :  *      FOR <encoding_name> TO <encoding_name> FROM <func_name>
                              11739                 :                :  *
                              11740                 :                :  *****************************************************************************/
                              11741                 :                : 
                              11742                 :                : CreateConversionStmt:
                              11743                 :                :             CREATE opt_default CONVERSION_P any_name FOR Sconst
                              11744                 :                :             TO Sconst FROM any_name
                              11745                 :                :             {
 4548 peter_e@gmx.net         11746                 :             32 :                 CreateConversionStmt *n = makeNode(CreateConversionStmt);
                              11747                 :                : 
                              11748                 :             32 :                 n->conversion_name = $4;
                              11749                 :             32 :                 n->for_encoding_name = $6;
                              11750                 :             32 :                 n->to_encoding_name = $8;
                              11751                 :             32 :                 n->func_name = $10;
                              11752                 :             32 :                 n->def = $2;
  702 peter@eisentraut.org    11753                 :             32 :                 $$ = (Node *) n;
                              11754                 :                :             }
                              11755                 :                :         ;
                              11756                 :                : 
                              11757                 :                : /*****************************************************************************
                              11758                 :                :  *
                              11759                 :                :  *      QUERY:
                              11760                 :                :  *              CLUSTER (options) [ <qualified_name> [ USING <index_name> ] ]
                              11761                 :                :  *              CLUSTER [VERBOSE] [ <qualified_name> [ USING <index_name> ] ]
                              11762                 :                :  *              CLUSTER [VERBOSE] <index_name> ON <qualified_name> (for pre-8.3)
                              11763                 :                :  *
                              11764                 :                :  *****************************************************************************/
                              11765                 :                : 
                              11766                 :                : ClusterStmt:
                              11767                 :                :             CLUSTER '(' utility_option_list ')' qualified_name cluster_index_specification
                              11768                 :                :                 {
 4548 peter_e@gmx.net         11769                 :UNC           0 :                     ClusterStmt *n = makeNode(ClusterStmt);
                              11770                 :                : 
  270 nathan@postgresql.or    11771                 :              0 :                     n->relation = $5;
                              11772                 :              0 :                     n->indexname = $6;
                              11773                 :              0 :                     n->params = $3;
  702 peter@eisentraut.org    11774                 :              0 :                     $$ = (Node *) n;
                              11775                 :                :                 }
                              11776                 :                :             | CLUSTER '(' utility_option_list ')'
                              11777                 :                :                 {
  270 nathan@postgresql.or    11778                 :              0 :                     ClusterStmt *n = makeNode(ClusterStmt);
                              11779                 :                : 
                              11780                 :              0 :                     n->relation = NULL;
                              11781                 :              0 :                     n->indexname = NULL;
                              11782                 :              0 :                     n->params = $3;
                              11783                 :              0 :                     $$ = (Node *) n;
                              11784                 :                :                 }
                              11785                 :                :             /* unparenthesized VERBOSE kept for pre-14 compatibility */
                              11786                 :                :             | CLUSTER opt_verbose qualified_name cluster_index_specification
                              11787                 :                :                 {
 1228 michael@paquier.xyz     11788                 :CBC          96 :                     ClusterStmt *n = makeNode(ClusterStmt);
                              11789                 :                : 
  270 nathan@postgresql.or    11790                 :             96 :                     n->relation = $3;
                              11791                 :             96 :                     n->indexname = $4;
                              11792                 :             96 :                     n->params = NIL;
                              11793         [ -  + ]:             96 :                     if ($2)
  270 nathan@postgresql.or    11794                 :UBC           0 :                         n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
  702 peter@eisentraut.org    11795                 :CBC          96 :                     $$ = (Node *) n;
                              11796                 :                :                 }
                              11797                 :                :             /* unparenthesized VERBOSE kept for pre-17 compatibility */
                              11798                 :                :             | CLUSTER opt_verbose
                              11799                 :                :                 {
 4548 peter_e@gmx.net         11800                 :             16 :                     ClusterStmt *n = makeNode(ClusterStmt);
                              11801                 :                : 
                              11802                 :             16 :                     n->relation = NULL;
                              11803                 :             16 :                     n->indexname = NULL;
 1228 michael@paquier.xyz     11804                 :             16 :                     n->params = NIL;
 2091                         11805         [ +  + ]:             16 :                     if ($2)
 1228                         11806                 :              8 :                         n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
  702 peter@eisentraut.org    11807                 :             16 :                     $$ = (Node *) n;
                              11808                 :                :                 }
                              11809                 :                :             /* kept for pre-8.3 compatibility */
                              11810                 :                :             | CLUSTER opt_verbose name ON qualified_name
                              11811                 :                :                 {
 4548 peter_e@gmx.net         11812                 :              9 :                     ClusterStmt *n = makeNode(ClusterStmt);
                              11813                 :                : 
                              11814                 :              9 :                     n->relation = $5;
                              11815                 :              9 :                     n->indexname = $3;
 1228 michael@paquier.xyz     11816                 :              9 :                     n->params = NIL;
 2091                         11817         [ -  + ]:              9 :                     if ($2)
 1228 michael@paquier.xyz     11818                 :UBC           0 :                         n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
  702 peter@eisentraut.org    11819                 :CBC           9 :                     $$ = (Node *) n;
                              11820                 :                :                 }
                              11821                 :                :         ;
                              11822                 :                : 
                              11823                 :                : cluster_index_specification:
 1404                         11824                 :             78 :             USING name              { $$ = $2; }
 6216 bruce@momjian.us        11825                 :             18 :             | /*EMPTY*/             { $$ = NULL; }
                              11826                 :                :         ;
                              11827                 :                : 
                              11828                 :                : 
                              11829                 :                : /*****************************************************************************
                              11830                 :                :  *
                              11831                 :                :  *      QUERY:
                              11832                 :                :  *              VACUUM
                              11833                 :                :  *              ANALYZE
                              11834                 :                :  *
                              11835                 :                :  *****************************************************************************/
                              11836                 :                : 
                              11837                 :                : VacuumStmt: VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relation_list
                              11838                 :                :                 {
 9715                         11839                 :            531 :                     VacuumStmt *n = makeNode(VacuumStmt);
                              11840                 :                : 
 1854 rhaas@postgresql.org    11841                 :            531 :                     n->options = NIL;
 5263 tgl@sss.pgh.pa.us       11842         [ +  + ]:            531 :                     if ($2)
 1854 rhaas@postgresql.org    11843                 :             58 :                         n->options = lappend(n->options,
                              11844                 :             58 :                                              makeDefElem("full", NULL, @2));
 3315 alvherre@alvh.no-ip.    11845         [ +  + ]:            531 :                     if ($3)
 1854 rhaas@postgresql.org    11846                 :             70 :                         n->options = lappend(n->options,
                              11847                 :             70 :                                              makeDefElem("freeze", NULL, @3));
 5263 tgl@sss.pgh.pa.us       11848         [ +  + ]:            531 :                     if ($4)
 1854 rhaas@postgresql.org    11849                 :              9 :                         n->options = lappend(n->options,
                              11850                 :              9 :                                              makeDefElem("verbose", NULL, @4));
 2287                         11851         [ +  + ]:            531 :                     if ($5)
 1854                         11852                 :            139 :                         n->options = lappend(n->options,
                              11853                 :            139 :                                              makeDefElem("analyze", NULL, @5));
 2287                         11854                 :            531 :                     n->rels = $6;
 1854                         11855                 :            531 :                     n->is_vacuumcmd = true;
  702 peter@eisentraut.org    11856                 :            531 :                     $$ = (Node *) n;
                              11857                 :                :                 }
                              11858                 :                :             | VACUUM '(' utility_option_list ')' opt_vacuum_relation_list
                              11859                 :                :                 {
 5263 tgl@sss.pgh.pa.us       11860                 :           2477 :                     VacuumStmt *n = makeNode(VacuumStmt);
                              11861                 :                : 
 1854 rhaas@postgresql.org    11862                 :           2477 :                     n->options = $3;
 2385 tgl@sss.pgh.pa.us       11863                 :           2477 :                     n->rels = $5;
 1854 rhaas@postgresql.org    11864                 :           2477 :                     n->is_vacuumcmd = true;
 5263 tgl@sss.pgh.pa.us       11865                 :           2477 :                     $$ = (Node *) n;
                              11866                 :                :                 }
                              11867                 :                :         ;
                              11868                 :                : 
                              11869                 :                : AnalyzeStmt: analyze_keyword opt_verbose opt_vacuum_relation_list
                              11870                 :                :                 {
 8378                         11871                 :           2128 :                     VacuumStmt *n = makeNode(VacuumStmt);
                              11872                 :                : 
 1854 rhaas@postgresql.org    11873                 :           2128 :                     n->options = NIL;
 5263 tgl@sss.pgh.pa.us       11874         [ -  + ]:           2128 :                     if ($2)
 1854 rhaas@postgresql.org    11875                 :UBC           0 :                         n->options = lappend(n->options,
                              11876                 :              0 :                                              makeDefElem("verbose", NULL, @2));
 2385 tgl@sss.pgh.pa.us       11877                 :CBC        2128 :                     n->rels = $3;
 1854 rhaas@postgresql.org    11878                 :           2128 :                     n->is_vacuumcmd = false;
  702 peter@eisentraut.org    11879                 :           2128 :                     $$ = (Node *) n;
                              11880                 :                :                 }
                              11881                 :                :             | analyze_keyword '(' utility_option_list ')' opt_vacuum_relation_list
                              11882                 :                :                 {
 2232 andres@anarazel.de      11883                 :             93 :                     VacuumStmt *n = makeNode(VacuumStmt);
                              11884                 :                : 
 1854 rhaas@postgresql.org    11885                 :             93 :                     n->options = $3;
 2232 andres@anarazel.de      11886                 :             93 :                     n->rels = $5;
 1854 rhaas@postgresql.org    11887                 :             93 :                     n->is_vacuumcmd = false;
 2232 andres@anarazel.de      11888                 :             93 :                     $$ = (Node *) n;
                              11889                 :                :                 }
                              11890                 :                :         ;
                              11891                 :                : 
                              11892                 :                : utility_option_list:
                              11893                 :                :             utility_option_elem
                              11894                 :                :                 {
 1854 rhaas@postgresql.org    11895                 :           8768 :                     $$ = list_make1($1);
                              11896                 :                :                 }
                              11897                 :                :             | utility_option_list ',' utility_option_elem
                              11898                 :                :                 {
                              11899                 :           4068 :                     $$ = lappend($1, $3);
                              11900                 :                :                 }
                              11901                 :                :         ;
                              11902                 :                : 
                              11903                 :                : analyze_keyword:
                              11904                 :                :             ANALYZE
                              11905                 :                :             | ANALYSE /* British */
                              11906                 :                :         ;
                              11907                 :                : 
                              11908                 :                : utility_option_elem:
                              11909                 :                :             utility_option_name utility_option_arg
                              11910                 :                :                 {
 1843                         11911                 :          12836 :                     $$ = makeDefElem($1, $2, @1);
                              11912                 :                :                 }
                              11913                 :                :         ;
                              11914                 :                : 
                              11915                 :                : utility_option_name:
 1854                         11916                 :          11709 :             NonReservedWord                         { $$ = $1; }
                              11917                 :           1056 :             | analyze_keyword                       { $$ = "analyze"; }
  382 alvherre@alvh.no-ip.    11918                 :             74 :             | FORMAT_LA                             { $$ = "format"; }
                              11919                 :                :         ;
                              11920                 :                : 
                              11921                 :                : utility_option_arg:
 1843 rhaas@postgresql.org    11922                 :           7290 :             opt_boolean_or_string                   { $$ = (Node *) makeString($1); }
 1250 peter@eisentraut.org    11923                 :            184 :             | NumericOnly                           { $$ = (Node *) $1; }
                              11924                 :           5362 :             | /* EMPTY */                           { $$ = NULL; }
                              11925                 :                :         ;
                              11926                 :                : 
                              11927                 :                : opt_analyze:
 2287 rhaas@postgresql.org    11928                 :            139 :             analyze_keyword                         { $$ = true; }
                              11929                 :            392 :             | /*EMPTY*/                             { $$ = false; }
                              11930                 :                :         ;
                              11931                 :                : 
                              11932                 :                : opt_verbose:
 2433 peter_e@gmx.net         11933                 :             17 :             VERBOSE                                 { $$ = true; }
                              11934                 :           3909 :             | /*EMPTY*/                             { $$ = false; }
                              11935                 :                :         ;
                              11936                 :                : 
                              11937                 :             58 : opt_full:   FULL                                    { $$ = true; }
                              11938                 :            473 :             | /*EMPTY*/                             { $$ = false; }
                              11939                 :                :         ;
                              11940                 :                : 
                              11941                 :             70 : opt_freeze: FREEZE                                  { $$ = true; }
                              11942                 :            461 :             | /*EMPTY*/                             { $$ = false; }
                              11943                 :                :         ;
                              11944                 :                : 
                              11945                 :                : opt_name_list:
 7972 bruce@momjian.us        11946                 :           1229 :             '(' name_list ')'                       { $$ = $2; }
                              11947                 :           6183 :             | /*EMPTY*/                             { $$ = NIL; }
                              11948                 :                :         ;
                              11949                 :                : 
                              11950                 :                : vacuum_relation:
                              11951                 :                :             qualified_name opt_name_list
                              11952                 :                :                 {
 2385 tgl@sss.pgh.pa.us       11953                 :           5158 :                     $$ = (Node *) makeVacuumRelation($1, InvalidOid, $2);
                              11954                 :                :                 }
                              11955                 :                :         ;
                              11956                 :                : 
                              11957                 :                : vacuum_relation_list:
                              11958                 :                :             vacuum_relation
                              11959                 :           5084 :                     { $$ = list_make1($1); }
                              11960                 :                :             | vacuum_relation_list ',' vacuum_relation
                              11961                 :             74 :                     { $$ = lappend($1, $3); }
                              11962                 :                :         ;
                              11963                 :                : 
                              11964                 :                : opt_vacuum_relation_list:
                              11965                 :           5084 :             vacuum_relation_list                    { $$ = $1; }
                              11966                 :            145 :             | /*EMPTY*/                             { $$ = NIL; }
                              11967                 :                :         ;
                              11968                 :                : 
                              11969                 :                : 
                              11970                 :                : /*****************************************************************************
                              11971                 :                :  *
                              11972                 :                :  *      QUERY:
                              11973                 :                :  *              EXPLAIN [ANALYZE] [VERBOSE] query
                              11974                 :                :  *              EXPLAIN ( options ) query
                              11975                 :                :  *
                              11976                 :                :  *****************************************************************************/
                              11977                 :                : 
                              11978                 :                : ExplainStmt:
                              11979                 :                :         EXPLAIN ExplainableStmt
                              11980                 :                :                 {
 5376                         11981                 :           3817 :                     ExplainStmt *n = makeNode(ExplainStmt);
                              11982                 :                : 
                              11983                 :           3817 :                     n->query = $2;
                              11984                 :           3817 :                     n->options = NIL;
                              11985                 :           3817 :                     $$ = (Node *) n;
                              11986                 :                :                 }
                              11987                 :                :         | EXPLAIN analyze_keyword opt_verbose ExplainableStmt
                              11988                 :                :                 {
 8244                         11989                 :           1146 :                     ExplainStmt *n = makeNode(ExplainStmt);
                              11990                 :                : 
 6242                         11991                 :           1146 :                     n->query = $4;
 2777 peter_e@gmx.net         11992                 :           1146 :                     n->options = list_make1(makeDefElem("analyze", NULL, @2));
 5376 tgl@sss.pgh.pa.us       11993         [ -  + ]:           1146 :                     if ($3)
 5376 tgl@sss.pgh.pa.us       11994                 :UBC           0 :                         n->options = lappend(n->options,
 2777 peter_e@gmx.net         11995                 :              0 :                                              makeDefElem("verbose", NULL, @3));
 5376 tgl@sss.pgh.pa.us       11996                 :CBC        1146 :                     $$ = (Node *) n;
                              11997                 :                :                 }
                              11998                 :                :         | EXPLAIN VERBOSE ExplainableStmt
                              11999                 :                :                 {
 5376 tgl@sss.pgh.pa.us       12000                 :UBC           0 :                     ExplainStmt *n = makeNode(ExplainStmt);
                              12001                 :                : 
                              12002                 :              0 :                     n->query = $3;
 2777 peter_e@gmx.net         12003                 :              0 :                     n->options = list_make1(makeDefElem("verbose", NULL, @2));
 5376 tgl@sss.pgh.pa.us       12004                 :              0 :                     $$ = (Node *) n;
                              12005                 :                :                 }
                              12006                 :                :         | EXPLAIN '(' utility_option_list ')' ExplainableStmt
                              12007                 :                :                 {
 5376 tgl@sss.pgh.pa.us       12008                 :CBC        6120 :                     ExplainStmt *n = makeNode(ExplainStmt);
                              12009                 :                : 
                              12010                 :           6120 :                     n->query = $5;
                              12011                 :           6120 :                     n->options = $3;
                              12012                 :           6120 :                     $$ = (Node *) n;
                              12013                 :                :                 }
                              12014                 :                :         ;
                              12015                 :                : 
                              12016                 :                : ExplainableStmt:
                              12017                 :                :             SelectStmt
                              12018                 :                :             | InsertStmt
                              12019                 :                :             | UpdateStmt
                              12020                 :                :             | DeleteStmt
                              12021                 :                :             | MergeStmt
                              12022                 :                :             | DeclareCursorStmt
                              12023                 :                :             | CreateAsStmt
                              12024                 :                :             | CreateMatViewStmt
                              12025                 :                :             | RefreshMatViewStmt
                              12026                 :                :             | ExecuteStmt                   /* by default all are $$=$1 */
                              12027                 :                :         ;
                              12028                 :                : 
                              12029                 :                : /*****************************************************************************
                              12030                 :                :  *
                              12031                 :                :  *      QUERY:
                              12032                 :                :  *              PREPARE <plan_name> [(args, ...)] AS <query>
                              12033                 :                :  *
                              12034                 :                :  *****************************************************************************/
                              12035                 :                : 
                              12036                 :                : PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt
                              12037                 :                :                 {
 7901                         12038                 :            862 :                     PrepareStmt *n = makeNode(PrepareStmt);
                              12039                 :                : 
                              12040                 :            862 :                     n->name = $2;
                              12041                 :            862 :                     n->argtypes = $3;
 6242                         12042                 :            862 :                     n->query = $5;
 7901                         12043                 :            862 :                     $$ = (Node *) n;
                              12044                 :                :                 }
                              12045                 :                :         ;
                              12046                 :                : 
 6291                         12047                 :            727 : prep_type_clause: '(' type_list ')'         { $$ = $2; }
 7901                         12048                 :            138 :                 | /* EMPTY */               { $$ = NIL; }
                              12049                 :                :         ;
                              12050                 :                : 
                              12051                 :                : PreparableStmt:
                              12052                 :                :             SelectStmt
                              12053                 :                :             | InsertStmt
                              12054                 :                :             | UpdateStmt
                              12055                 :                :             | DeleteStmt
                              12056                 :                :             | MergeStmt                     /* by default all are $$=$1 */
                              12057                 :                :         ;
                              12058                 :                : 
                              12059                 :                : /*****************************************************************************
                              12060                 :                :  *
                              12061                 :                :  * EXECUTE <plan_name> [(params, ...)]
                              12062                 :                :  * CREATE TABLE <name> AS EXECUTE <plan_name> [(params, ...)]
                              12063                 :                :  *
                              12064                 :                :  *****************************************************************************/
                              12065                 :                : 
                              12066                 :                : ExecuteStmt: EXECUTE name execute_param_clause
                              12067                 :                :                 {
                              12068                 :           5925 :                     ExecuteStmt *n = makeNode(ExecuteStmt);
                              12069                 :                : 
                              12070                 :           5925 :                     n->name = $2;
                              12071                 :           5925 :                     n->params = $3;
 7593 peter_e@gmx.net         12072                 :           5925 :                     $$ = (Node *) n;
                              12073                 :                :                 }
                              12074                 :                :             | CREATE OptTemp TABLE create_as_target AS
                              12075                 :                :                 EXECUTE name execute_param_clause opt_with_data
                              12076                 :                :                 {
 4409 tgl@sss.pgh.pa.us       12077                 :             36 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
 7593 peter_e@gmx.net         12078                 :             36 :                     ExecuteStmt *n = makeNode(ExecuteStmt);
                              12079                 :                : 
 6263 tgl@sss.pgh.pa.us       12080                 :             36 :                     n->name = $7;
                              12081                 :             36 :                     n->params = $8;
 4409                         12082                 :             36 :                     ctas->query = (Node *) n;
                              12083                 :             36 :                     ctas->into = $4;
 1373 michael@paquier.xyz     12084                 :             36 :                     ctas->objtype = OBJECT_TABLE;
 4409 tgl@sss.pgh.pa.us       12085                 :             36 :                     ctas->is_select_into = false;
 1885 michael@paquier.xyz     12086                 :             36 :                     ctas->if_not_exists = false;
                              12087                 :                :                     /* cram additional flags into the IntoClause */
 4525 tgl@sss.pgh.pa.us       12088                 :             36 :                     $4->rel->relpersistence = $2;
                              12089                 :             36 :                     $4->skipData = !($9);
 4409                         12090                 :             36 :                     $$ = (Node *) ctas;
                              12091                 :                :                 }
                              12092                 :                :             | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS
                              12093                 :                :                 EXECUTE name execute_param_clause opt_with_data
                              12094                 :                :                 {
 1885 michael@paquier.xyz     12095                 :              6 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
                              12096                 :              6 :                     ExecuteStmt *n = makeNode(ExecuteStmt);
                              12097                 :                : 
                              12098                 :              6 :                     n->name = $10;
                              12099                 :              6 :                     n->params = $11;
                              12100                 :              6 :                     ctas->query = (Node *) n;
                              12101                 :              6 :                     ctas->into = $7;
 1373                         12102                 :              6 :                     ctas->objtype = OBJECT_TABLE;
 1885                         12103                 :              6 :                     ctas->is_select_into = false;
                              12104                 :              6 :                     ctas->if_not_exists = true;
                              12105                 :                :                     /* cram additional flags into the IntoClause */
                              12106                 :              6 :                     $7->rel->relpersistence = $2;
                              12107                 :              6 :                     $7->skipData = !($12);
                              12108                 :              6 :                     $$ = (Node *) ctas;
                              12109                 :                :                 }
                              12110                 :                :         ;
                              12111                 :                : 
 7834 tgl@sss.pgh.pa.us       12112                 :           5428 : execute_param_clause: '(' expr_list ')'             { $$ = $2; }
 7901                         12113                 :            539 :                     | /* EMPTY */                   { $$ = NIL; }
                              12114                 :                :                     ;
                              12115                 :                : 
                              12116                 :                : /*****************************************************************************
                              12117                 :                :  *
                              12118                 :                :  *      QUERY:
                              12119                 :                :  *              DEALLOCATE [PREPARE] <plan_name>
                              12120                 :                :  *
                              12121                 :                :  *****************************************************************************/
                              12122                 :                : 
                              12123                 :                : DeallocateStmt: DEALLOCATE name
                              12124                 :                :                     {
                              12125                 :           1124 :                         DeallocateStmt *n = makeNode(DeallocateStmt);
                              12126                 :                : 
                              12127                 :           1124 :                         n->name = $2;
  231 michael@paquier.xyz     12128                 :GNC        1124 :                         n->isall = false;
                              12129                 :           1124 :                         n->location = @2;
 7901 tgl@sss.pgh.pa.us       12130                 :CBC        1124 :                         $$ = (Node *) n;
                              12131                 :                :                     }
                              12132                 :                :                 | DEALLOCATE PREPARE name
                              12133                 :                :                     {
                              12134                 :             10 :                         DeallocateStmt *n = makeNode(DeallocateStmt);
                              12135                 :                : 
                              12136                 :             10 :                         n->name = $3;
  231 michael@paquier.xyz     12137                 :GNC          10 :                         n->isall = false;
                              12138                 :             10 :                         n->location = @3;
 7901 tgl@sss.pgh.pa.us       12139                 :CBC          10 :                         $$ = (Node *) n;
                              12140                 :                :                     }
                              12141                 :                :                 | DEALLOCATE ALL
                              12142                 :                :                     {
 6212 neilc@samurai.com       12143                 :             24 :                         DeallocateStmt *n = makeNode(DeallocateStmt);
                              12144                 :                : 
                              12145                 :             24 :                         n->name = NULL;
  231 michael@paquier.xyz     12146                 :GNC          24 :                         n->isall = true;
                              12147                 :             24 :                         n->location = -1;
 6212 neilc@samurai.com       12148                 :CBC          24 :                         $$ = (Node *) n;
                              12149                 :                :                     }
                              12150                 :                :                 | DEALLOCATE PREPARE ALL
                              12151                 :                :                     {
 6212 neilc@samurai.com       12152                 :GBC           1 :                         DeallocateStmt *n = makeNode(DeallocateStmt);
                              12153                 :                : 
                              12154                 :              1 :                         n->name = NULL;
  231 michael@paquier.xyz     12155                 :GNC           1 :                         n->isall = true;
                              12156                 :              1 :                         n->location = -1;
 6212 neilc@samurai.com       12157                 :GBC           1 :                         $$ = (Node *) n;
                              12158                 :                :                     }
                              12159                 :                :         ;
                              12160                 :                : 
                              12161                 :                : /*****************************************************************************
                              12162                 :                :  *
                              12163                 :                :  *      QUERY:
                              12164                 :                :  *              INSERT STATEMENTS
                              12165                 :                :  *
                              12166                 :                :  *****************************************************************************/
                              12167                 :                : 
                              12168                 :                : InsertStmt:
                              12169                 :                :             opt_with_clause INSERT INTO insert_target insert_rest
                              12170                 :                :             opt_on_conflict returning_clause
                              12171                 :                :                 {
 4930 tgl@sss.pgh.pa.us       12172                 :CBC       35039 :                     $5->relation = $4;
 3264 andres@anarazel.de      12173                 :          35039 :                     $5->onConflictClause = $6;
                              12174                 :          35039 :                     $5->returningList = $7;
 4930 tgl@sss.pgh.pa.us       12175                 :          35039 :                     $5->withClause = $1;
                              12176                 :          35039 :                     $$ = (Node *) $5;
                              12177                 :                :                 }
                              12178                 :                :         ;
                              12179                 :                : 
                              12180                 :                : /*
                              12181                 :                :  * Can't easily make AS optional here, because VALUES in insert_rest would
                              12182                 :                :  * have a shift/reduce conflict with VALUES as an optional alias.  We could
                              12183                 :                :  * easily allow unreserved_keywords as optional aliases, but that'd be an odd
                              12184                 :                :  * divergence from other places.  So just require AS for now.
                              12185                 :                :  */
                              12186                 :                : insert_target:
                              12187                 :                :             qualified_name
                              12188                 :                :                 {
 3264 andres@anarazel.de      12189                 :          34976 :                     $$ = $1;
                              12190                 :                :                 }
                              12191                 :                :             | qualified_name AS ColId
                              12192                 :                :                 {
                              12193                 :             63 :                     $1->alias = makeAlias($3, NIL);
                              12194                 :             63 :                     $$ = $1;
                              12195                 :                :                 }
                              12196                 :                :         ;
                              12197                 :                : 
                              12198                 :                : insert_rest:
                              12199                 :                :             SelectStmt
                              12200                 :                :                 {
 9592 bruce@momjian.us        12201                 :          23516 :                     $$ = makeNode(InsertStmt);
 9035 tgl@sss.pgh.pa.us       12202                 :          23516 :                     $$->cols = NIL;
 8592                         12203                 :          23516 :                     $$->selectStmt = $1;
                              12204                 :                :                 }
                              12205                 :                :             | OVERRIDING override_kind VALUE_P SelectStmt
                              12206                 :                :                 {
 2565 peter_e@gmx.net         12207                 :             48 :                     $$ = makeNode(InsertStmt);
                              12208                 :             48 :                     $$->cols = NIL;
                              12209                 :             48 :                     $$->override = $2;
                              12210                 :             48 :                     $$->selectStmt = $4;
                              12211                 :                :                 }
                              12212                 :                :             | '(' insert_column_list ')' SelectStmt
                              12213                 :                :                 {
 9218 bruce@momjian.us        12214                 :           6091 :                     $$ = makeNode(InsertStmt);
                              12215                 :           6091 :                     $$->cols = $2;
 6465 mail@joeconway.com      12216                 :           6091 :                     $$->selectStmt = $4;
                              12217                 :                :                 }
                              12218                 :                :             | '(' insert_column_list ')' OVERRIDING override_kind VALUE_P SelectStmt
                              12219                 :                :                 {
 2565 peter_e@gmx.net         12220                 :UBC           0 :                     $$ = makeNode(InsertStmt);
                              12221                 :              0 :                     $$->cols = $2;
                              12222                 :              0 :                     $$->override = $5;
                              12223                 :              0 :                     $$->selectStmt = $7;
                              12224                 :                :                 }
                              12225                 :                :             | DEFAULT VALUES
                              12226                 :                :                 {
 9218 bruce@momjian.us        12227                 :CBC        5384 :                     $$ = makeNode(InsertStmt);
 6465 mail@joeconway.com      12228                 :           5384 :                     $$->cols = NIL;
                              12229                 :           5384 :                     $$->selectStmt = NULL;
                              12230                 :                :                 }
                              12231                 :                :         ;
                              12232                 :                : 
                              12233                 :                : override_kind:
 2565 peter_e@gmx.net         12234                 :             33 :             USER        { $$ = OVERRIDING_USER_VALUE; }
                              12235                 :             30 :             | SYSTEM_P  { $$ = OVERRIDING_SYSTEM_VALUE; }
                              12236                 :                :         ;
                              12237                 :                : 
                              12238                 :                : insert_column_list:
                              12239                 :                :             insert_column_item
 7249 tgl@sss.pgh.pa.us       12240                 :           6232 :                     { $$ = list_make1($1); }
                              12241                 :                :             | insert_column_list ',' insert_column_item
 7971 bruce@momjian.us        12242                 :           6957 :                     { $$ = lappend($1, $3); }
                              12243                 :                :         ;
                              12244                 :                : 
                              12245                 :                : insert_column_item:
                              12246                 :                :             ColId opt_indirection
                              12247                 :                :                 {
 7249 tgl@sss.pgh.pa.us       12248                 :          13189 :                     $$ = makeNode(ResTarget);
                              12249                 :          13189 :                     $$->name = $1;
 5389                         12250                 :          13189 :                     $$->indirection = check_indirection($2, yyscanner);
 7249                         12251                 :          13189 :                     $$->val = NULL;
 6597                         12252                 :          13189 :                     $$->location = @1;
                              12253                 :                :                 }
                              12254                 :                :         ;
                              12255                 :                : 
                              12256                 :                : opt_on_conflict:
                              12257                 :                :             ON CONFLICT opt_conf_expr DO UPDATE SET set_clause_list where_clause
                              12258                 :                :                 {
 3264 andres@anarazel.de      12259                 :            575 :                     $$ = makeNode(OnConflictClause);
                              12260                 :            575 :                     $$->action = ONCONFLICT_UPDATE;
                              12261                 :            575 :                     $$->infer = $3;
                              12262                 :            575 :                     $$->targetList = $7;
                              12263                 :            575 :                     $$->whereClause = $8;
                              12264                 :            575 :                     $$->location = @1;
                              12265                 :                :                 }
                              12266                 :                :             |
                              12267                 :                :             ON CONFLICT opt_conf_expr DO NOTHING
                              12268                 :                :                 {
                              12269                 :            161 :                     $$ = makeNode(OnConflictClause);
                              12270                 :            161 :                     $$->action = ONCONFLICT_NOTHING;
                              12271                 :            161 :                     $$->infer = $3;
                              12272                 :            161 :                     $$->targetList = NIL;
                              12273                 :            161 :                     $$->whereClause = NULL;
                              12274                 :            161 :                     $$->location = @1;
                              12275                 :                :                 }
                              12276                 :                :             | /*EMPTY*/
                              12277                 :                :                 {
                              12278                 :          34303 :                     $$ = NULL;
                              12279                 :                :                 }
                              12280                 :                :         ;
                              12281                 :                : 
                              12282                 :                : opt_conf_expr:
                              12283                 :                :             '(' index_params ')' where_clause
                              12284                 :                :                 {
                              12285                 :            631 :                     $$ = makeNode(InferClause);
                              12286                 :            631 :                     $$->indexElems = $2;
                              12287                 :            631 :                     $$->whereClause = $4;
                              12288                 :            631 :                     $$->conname = NULL;
                              12289                 :            631 :                     $$->location = @1;
                              12290                 :                :                 }
                              12291                 :                :             |
                              12292                 :                :             ON CONSTRAINT name
                              12293                 :                :                 {
                              12294                 :             24 :                     $$ = makeNode(InferClause);
                              12295                 :             24 :                     $$->indexElems = NIL;
                              12296                 :             24 :                     $$->whereClause = NULL;
                              12297                 :             24 :                     $$->conname = $3;
                              12298                 :             24 :                     $$->location = @1;
                              12299                 :                :                 }
                              12300                 :                :             | /*EMPTY*/
                              12301                 :                :                 {
                              12302                 :             81 :                     $$ = NULL;
                              12303                 :                :                 }
                              12304                 :                :         ;
                              12305                 :                : 
                              12306                 :                : returning_clause:
 6455 tgl@sss.pgh.pa.us       12307                 :           1347 :             RETURNING target_list       { $$ = $2; }
                              12308                 :          43629 :             | /* EMPTY */               { $$ = NIL; }
                              12309                 :                :         ;
                              12310                 :                : 
                              12311                 :                : 
                              12312                 :                : /*****************************************************************************
                              12313                 :                :  *
                              12314                 :                :  *      QUERY:
                              12315                 :                :  *              DELETE STATEMENTS
                              12316                 :                :  *
                              12317                 :                :  *****************************************************************************/
                              12318                 :                : 
                              12319                 :                : DeleteStmt: opt_with_clause DELETE_P FROM relation_expr_opt_alias
                              12320                 :                :             using_clause where_or_current_clause returning_clause
                              12321                 :                :                 {
 9715 bruce@momjian.us        12322                 :           2254 :                     DeleteStmt *n = makeNode(DeleteStmt);
                              12323                 :                : 
 4930 tgl@sss.pgh.pa.us       12324                 :           2254 :                     n->relation = $4;
                              12325                 :           2254 :                     n->usingClause = $5;
                              12326                 :           2254 :                     n->whereClause = $6;
                              12327                 :           2254 :                     n->returningList = $7;
                              12328                 :           2254 :                     n->withClause = $1;
  702 peter@eisentraut.org    12329                 :           2254 :                     $$ = (Node *) n;
                              12330                 :                :                 }
                              12331                 :                :         ;
                              12332                 :                : 
                              12333                 :                : using_clause:
 4548 peter_e@gmx.net         12334                 :             54 :                 USING from_list                     { $$ = $2; }
 6947 neilc@samurai.com       12335                 :           2200 :             | /*EMPTY*/                             { $$ = NIL; }
                              12336                 :                :         ;
                              12337                 :                : 
                              12338                 :                : 
                              12339                 :                : /*****************************************************************************
                              12340                 :                :  *
                              12341                 :                :  *      QUERY:
                              12342                 :                :  *              LOCK TABLE
                              12343                 :                :  *
                              12344                 :                :  *****************************************************************************/
                              12345                 :                : 
                              12346                 :                : LockStmt:   LOCK_P opt_table relation_expr_list opt_lock opt_nowait
                              12347                 :                :                 {
  702 peter@eisentraut.org    12348                 :            574 :                     LockStmt   *n = makeNode(LockStmt);
                              12349                 :                : 
 8060 tgl@sss.pgh.pa.us       12350                 :            574 :                     n->relations = $3;
 9099 bruce@momjian.us        12351                 :            574 :                     n->mode = $4;
 7339 ishii@postgresql.org    12352                 :            574 :                     n->nowait = $5;
  702 peter@eisentraut.org    12353                 :            574 :                     $$ = (Node *) n;
                              12354                 :                :                 }
                              12355                 :                :         ;
                              12356                 :                : 
 4548 peter_e@gmx.net         12357                 :            527 : opt_lock:   IN_P lock_type MODE             { $$ = $2; }
 7971 bruce@momjian.us        12358                 :             47 :             | /*EMPTY*/                     { $$ = AccessExclusiveLock; }
                              12359                 :                :         ;
                              12360                 :                : 
                              12361                 :            282 : lock_type:  ACCESS SHARE                    { $$ = AccessShareLock; }
                              12362                 :              7 :             | ROW SHARE                     { $$ = RowShareLock; }
                              12363                 :             44 :             | ROW EXCLUSIVE                 { $$ = RowExclusiveLock; }
                              12364                 :             33 :             | SHARE UPDATE EXCLUSIVE        { $$ = ShareUpdateExclusiveLock; }
                              12365                 :             40 :             | SHARE                         { $$ = ShareLock; }
                              12366                 :              7 :             | SHARE ROW EXCLUSIVE           { $$ = ShareRowExclusiveLock; }
                              12367                 :             51 :             | EXCLUSIVE                     { $$ = ExclusiveLock; }
                              12368                 :             63 :             | ACCESS EXCLUSIVE              { $$ = AccessExclusiveLock; }
                              12369                 :                :         ;
                              12370                 :                : 
 2433 peter_e@gmx.net         12371                 :            173 : opt_nowait: NOWAIT                          { $$ = true; }
                              12372                 :            416 :             | /*EMPTY*/                     { $$ = false; }
                              12373                 :                :         ;
                              12374                 :                : 
                              12375                 :                : opt_nowait_or_skip:
 3477 alvherre@alvh.no-ip.    12376                 :             25 :             NOWAIT                          { $$ = LockWaitError; }
                              12377                 :             95 :             | SKIP LOCKED                   { $$ = LockWaitSkip; }
                              12378                 :           2459 :             | /*EMPTY*/                     { $$ = LockWaitBlock; }
                              12379                 :                :         ;
                              12380                 :                : 
                              12381                 :                : 
                              12382                 :                : /*****************************************************************************
                              12383                 :                :  *
                              12384                 :                :  *      QUERY:
                              12385                 :                :  *              UpdateStmt (UPDATE)
                              12386                 :                :  *
                              12387                 :                :  *****************************************************************************/
                              12388                 :                : 
                              12389                 :                : UpdateStmt: opt_with_clause UPDATE relation_expr_opt_alias
                              12390                 :                :             SET set_clause_list
                              12391                 :                :             from_clause
                              12392                 :                :             where_or_current_clause
                              12393                 :                :             returning_clause
                              12394                 :                :                 {
 6434 bruce@momjian.us        12395                 :           6720 :                     UpdateStmt *n = makeNode(UpdateStmt);
                              12396                 :                : 
 4930 tgl@sss.pgh.pa.us       12397                 :           6720 :                     n->relation = $3;
                              12398                 :           6720 :                     n->targetList = $5;
                              12399                 :           6720 :                     n->fromClause = $6;
                              12400                 :           6720 :                     n->whereClause = $7;
                              12401                 :           6720 :                     n->returningList = $8;
                              12402                 :           6720 :                     n->withClause = $1;
  702 peter@eisentraut.org    12403                 :           6720 :                     $$ = (Node *) n;
                              12404                 :                :                 }
                              12405                 :                :         ;
                              12406                 :                : 
                              12407                 :                : set_clause_list:
 6433 tgl@sss.pgh.pa.us       12408                 :           8046 :             set_clause                          { $$ = $1; }
                              12409                 :           1852 :             | set_clause_list ',' set_clause    { $$ = list_concat($1,$3); }
                              12410                 :                :         ;
                              12411                 :                : 
                              12412                 :                : set_clause:
                              12413                 :                :             set_target '=' a_expr
                              12414                 :                :                 {
 2700                         12415                 :           9807 :                     $1->val = (Node *) $3;
                              12416                 :           9807 :                     $$ = list_make1($1);
                              12417                 :                :                 }
                              12418                 :                :             | '(' set_target_list ')' '=' a_expr
                              12419                 :                :                 {
  702 peter@eisentraut.org    12420                 :             91 :                     int         ncolumns = list_length($2);
                              12421                 :             91 :                     int         i = 1;
                              12422                 :                :                     ListCell   *col_cell;
                              12423                 :                : 
                              12424                 :                :                     /* Create a MultiAssignRef source for each target */
 3588 tgl@sss.pgh.pa.us       12425   [ +  -  +  +  :            281 :                     foreach(col_cell, $2)
                                              +  + ]
                              12426                 :                :                     {
  702 peter@eisentraut.org    12427                 :            190 :                         ResTarget  *res_col = (ResTarget *) lfirst(col_cell);
 3588 tgl@sss.pgh.pa.us       12428                 :            190 :                         MultiAssignRef *r = makeNode(MultiAssignRef);
                              12429                 :                : 
 2700                         12430                 :            190 :                         r->source = (Node *) $5;
 3588                         12431                 :            190 :                         r->colno = i;
                              12432                 :            190 :                         r->ncolumns = ncolumns;
                              12433                 :            190 :                         res_col->val = (Node *) r;
                              12434                 :            190 :                         i++;
                              12435                 :                :                     }
                              12436                 :                : 
 6433                         12437                 :             91 :                     $$ = $2;
                              12438                 :                :                 }
                              12439                 :                :         ;
                              12440                 :                : 
                              12441                 :                : set_target:
                              12442                 :                :             ColId opt_indirection
                              12443                 :                :                 {
                              12444                 :          10000 :                     $$ = makeNode(ResTarget);
                              12445                 :          10000 :                     $$->name = $1;
 5389                         12446                 :          10000 :                     $$->indirection = check_indirection($2, yyscanner);
 6433                         12447                 :          10000 :                     $$->val = NULL;  /* upper production sets this */
                              12448                 :          10000 :                     $$->location = @1;
                              12449                 :                :                 }
                              12450                 :                :         ;
                              12451                 :                : 
                              12452                 :                : set_target_list:
                              12453                 :             94 :             set_target                              { $$ = list_make1($1); }
                              12454                 :             99 :             | set_target_list ',' set_target        { $$ = lappend($1,$3); }
                              12455                 :                :         ;
                              12456                 :                : 
                              12457                 :                : 
                              12458                 :                : /*****************************************************************************
                              12459                 :                :  *
                              12460                 :                :  *      QUERY:
                              12461                 :                :  *              MERGE
                              12462                 :                :  *
                              12463                 :                :  *****************************************************************************/
                              12464                 :                : 
                              12465                 :                : MergeStmt:
                              12466                 :                :             opt_with_clause MERGE INTO relation_expr_opt_alias
                              12467                 :                :             USING table_ref
                              12468                 :                :             ON a_expr
                              12469                 :                :             merge_when_list
                              12470                 :                :             returning_clause
                              12471                 :                :                 {
  702 peter@eisentraut.org    12472                 :            963 :                     MergeStmt  *m = makeNode(MergeStmt);
                              12473                 :                : 
  748 alvherre@alvh.no-ip.    12474                 :            963 :                     m->withClause = $1;
                              12475                 :            963 :                     m->relation = $4;
                              12476                 :            963 :                     m->sourceRelation = $6;
                              12477                 :            963 :                     m->joinCondition = $8;
                              12478                 :            963 :                     m->mergeWhenClauses = $9;
   28 dean.a.rasheed@gmail    12479                 :GNC         963 :                     m->returningList = $10;
                              12480                 :                : 
  702 peter@eisentraut.org    12481                 :CBC         963 :                     $$ = (Node *) m;
                              12482                 :                :                 }
                              12483                 :                :         ;
                              12484                 :                : 
                              12485                 :                : merge_when_list:
  748 alvherre@alvh.no-ip.    12486                 :            963 :             merge_when_clause                       { $$ = list_make1($1); }
                              12487                 :            559 :             | merge_when_list merge_when_clause     { $$ = lappend($1,$2); }
                              12488                 :                :         ;
                              12489                 :                : 
                              12490                 :                : /*
                              12491                 :                :  * A WHEN clause may be WHEN MATCHED, WHEN NOT MATCHED BY SOURCE, or WHEN NOT
                              12492                 :                :  * MATCHED [BY TARGET]. The first two cases match target tuples, and support
                              12493                 :                :  * UPDATE/DELETE/DO NOTHING actions. The third case does not match target
                              12494                 :                :  * tuples, and only supports INSERT/DO NOTHING actions.
                              12495                 :                :  */
                              12496                 :                : merge_when_clause:
                              12497                 :                :             merge_when_tgt_matched opt_merge_when_condition THEN merge_update
                              12498                 :                :                 {
   15 dean.a.rasheed@gmail    12499                 :GNC         751 :                     $4->matchKind = $1;
                              12500                 :            751 :                     $4->condition = $2;
                              12501                 :                : 
                              12502                 :            751 :                     $$ = (Node *) $4;
                              12503                 :                :                 }
                              12504                 :                :             | merge_when_tgt_matched opt_merge_when_condition THEN merge_delete
                              12505                 :                :                 {
                              12506                 :            235 :                     $4->matchKind = $1;
                              12507                 :            235 :                     $4->condition = $2;
                              12508                 :                : 
                              12509                 :            235 :                     $$ = (Node *) $4;
                              12510                 :                :                 }
                              12511                 :                :             | merge_when_tgt_not_matched opt_merge_when_condition THEN merge_insert
                              12512                 :                :                 {
                              12513                 :            506 :                     $4->matchKind = $1;
                              12514                 :            506 :                     $4->condition = $2;
                              12515                 :                : 
                              12516                 :            506 :                     $$ = (Node *) $4;
                              12517                 :                :                 }
                              12518                 :                :             | merge_when_tgt_matched opt_merge_when_condition THEN DO NOTHING
                              12519                 :                :                 {
  748 alvherre@alvh.no-ip.    12520                 :CBC          23 :                     MergeWhenClause *m = makeNode(MergeWhenClause);
                              12521                 :                : 
   15 dean.a.rasheed@gmail    12522                 :GNC          23 :                     m->matchKind = $1;
  748 alvherre@alvh.no-ip.    12523                 :CBC          23 :                     m->commandType = CMD_NOTHING;
   15 dean.a.rasheed@gmail    12524                 :GNC          23 :                     m->condition = $2;
                              12525                 :                : 
  702 peter@eisentraut.org    12526                 :CBC          23 :                     $$ = (Node *) m;
                              12527                 :                :                 }
                              12528                 :                :             | merge_when_tgt_not_matched opt_merge_when_condition THEN DO NOTHING
                              12529                 :                :                 {
  748 alvherre@alvh.no-ip.    12530                 :              7 :                     MergeWhenClause *m = makeNode(MergeWhenClause);
                              12531                 :                : 
   15 dean.a.rasheed@gmail    12532                 :GNC           7 :                     m->matchKind = $1;
  748 alvherre@alvh.no-ip.    12533                 :CBC           7 :                     m->commandType = CMD_NOTHING;
   15 dean.a.rasheed@gmail    12534                 :GNC           7 :                     m->condition = $2;
                              12535                 :                : 
  702 peter@eisentraut.org    12536                 :CBC           7 :                     $$ = (Node *) m;
                              12537                 :                :                 }
                              12538                 :                :         ;
                              12539                 :                : 
                              12540                 :                : merge_when_tgt_matched:
   15 dean.a.rasheed@gmail    12541                 :GNC         934 :             WHEN MATCHED                    { $$ = MERGE_WHEN_MATCHED; }
                              12542                 :             84 :             | WHEN NOT MATCHED BY SOURCE    { $$ = MERGE_WHEN_NOT_MATCHED_BY_SOURCE; }
                              12543                 :                :         ;
                              12544                 :                : 
                              12545                 :                : merge_when_tgt_not_matched:
                              12546                 :            516 :             WHEN NOT MATCHED                { $$ = MERGE_WHEN_NOT_MATCHED_BY_TARGET; }
                              12547                 :              9 :             | WHEN NOT MATCHED BY TARGET    { $$ = MERGE_WHEN_NOT_MATCHED_BY_TARGET; }
                              12548                 :                :         ;
                              12549                 :                : 
                              12550                 :                : opt_merge_when_condition:
  748 alvherre@alvh.no-ip.    12551                 :CBC         401 :             AND a_expr              { $$ = $2; }
                              12552                 :           1142 :             |                       { $$ = NULL; }
                              12553                 :                :         ;
                              12554                 :                : 
                              12555                 :                : merge_update:
                              12556                 :                :             UPDATE SET set_clause_list
                              12557                 :                :                 {
                              12558                 :            751 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
                              12559                 :            751 :                     n->commandType = CMD_UPDATE;
                              12560                 :            751 :                     n->override = OVERRIDING_NOT_SET;
                              12561                 :            751 :                     n->targetList = $3;
                              12562                 :            751 :                     n->values = NIL;
                              12563                 :                : 
                              12564                 :            751 :                     $$ = n;
                              12565                 :                :                 }
                              12566                 :                :         ;
                              12567                 :                : 
                              12568                 :                : merge_delete:
                              12569                 :                :             DELETE_P
                              12570                 :                :                 {
                              12571                 :            235 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
                              12572                 :            235 :                     n->commandType = CMD_DELETE;
                              12573                 :            235 :                     n->override = OVERRIDING_NOT_SET;
                              12574                 :            235 :                     n->targetList = NIL;
                              12575                 :            235 :                     n->values = NIL;
                              12576                 :                : 
                              12577                 :            235 :                     $$ = n;
                              12578                 :                :                 }
                              12579                 :                :         ;
                              12580                 :                : 
                              12581                 :                : merge_insert:
                              12582                 :                :             INSERT merge_values_clause
                              12583                 :                :                 {
                              12584                 :            347 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
                              12585                 :            347 :                     n->commandType = CMD_INSERT;
                              12586                 :            347 :                     n->override = OVERRIDING_NOT_SET;
                              12587                 :            347 :                     n->targetList = NIL;
                              12588                 :            347 :                     n->values = $2;
                              12589                 :            347 :                     $$ = n;
                              12590                 :                :                 }
                              12591                 :                :             | INSERT OVERRIDING override_kind VALUE_P merge_values_clause
                              12592                 :                :                 {
  748 alvherre@alvh.no-ip.    12593                 :UBC           0 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
                              12594                 :              0 :                     n->commandType = CMD_INSERT;
                              12595                 :              0 :                     n->override = $3;
                              12596                 :              0 :                     n->targetList = NIL;
                              12597                 :              0 :                     n->values = $5;
                              12598                 :              0 :                     $$ = n;
                              12599                 :                :                 }
                              12600                 :                :             | INSERT '(' insert_column_list ')' merge_values_clause
                              12601                 :                :                 {
  748 alvherre@alvh.no-ip.    12602                 :CBC         126 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
                              12603                 :            126 :                     n->commandType = CMD_INSERT;
                              12604                 :            126 :                     n->override = OVERRIDING_NOT_SET;
                              12605                 :            126 :                     n->targetList = $3;
                              12606                 :            126 :                     n->values = $5;
                              12607                 :            126 :                     $$ = n;
                              12608                 :                :                 }
                              12609                 :                :             | INSERT '(' insert_column_list ')' OVERRIDING override_kind VALUE_P merge_values_clause
                              12610                 :                :                 {
                              12611                 :             15 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
                              12612                 :             15 :                     n->commandType = CMD_INSERT;
                              12613                 :             15 :                     n->override = $6;
                              12614                 :             15 :                     n->targetList = $3;
                              12615                 :             15 :                     n->values = $8;
                              12616                 :             15 :                     $$ = n;
                              12617                 :                :                 }
                              12618                 :                :             | INSERT DEFAULT VALUES
                              12619                 :                :                 {
                              12620                 :             18 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
                              12621                 :             18 :                     n->commandType = CMD_INSERT;
                              12622                 :             18 :                     n->override = OVERRIDING_NOT_SET;
                              12623                 :             18 :                     n->targetList = NIL;
                              12624                 :             18 :                     n->values = NIL;
                              12625                 :             18 :                     $$ = n;
                              12626                 :                :                 }
                              12627                 :                :         ;
                              12628                 :                : 
                              12629                 :                : merge_values_clause:
                              12630                 :                :             VALUES '(' expr_list ')'
                              12631                 :                :                 {
                              12632                 :            488 :                     $$ = $3;
                              12633                 :                :                 }
                              12634                 :                :         ;
                              12635                 :                : 
                              12636                 :                : /*****************************************************************************
                              12637                 :                :  *
                              12638                 :                :  *      QUERY:
                              12639                 :                :  *              CURSOR STATEMENTS
                              12640                 :                :  *
                              12641                 :                :  *****************************************************************************/
                              12642                 :                : DeclareCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR SelectStmt
                              12643                 :                :                 {
 7706 tgl@sss.pgh.pa.us       12644                 :           1323 :                     DeclareCursorStmt *n = makeNode(DeclareCursorStmt);
                              12645                 :                : 
 9715 bruce@momjian.us        12646                 :           1323 :                     n->portalname = $2;
                              12647                 :                :                     /* currently we always set FAST_PLAN option */
 6208 tgl@sss.pgh.pa.us       12648                 :           1323 :                     n->options = $3 | $5 | CURSOR_OPT_FAST_PLAN;
 7689 bruce@momjian.us        12649                 :           1323 :                     n->query = $7;
  702 peter@eisentraut.org    12650                 :           1323 :                     $$ = (Node *) n;
                              12651                 :                :                 }
                              12652                 :                :         ;
                              12653                 :                : 
 5268 alvherre@alvh.no-ip.    12654                 :           5173 : cursor_name:    name                        { $$ = $1; }
                              12655                 :                :         ;
                              12656                 :                : 
 7706 tgl@sss.pgh.pa.us       12657                 :           1323 : cursor_options: /*EMPTY*/                   { $$ = 0; }
 7689 bruce@momjian.us        12658                 :             12 :             | cursor_options NO SCROLL      { $$ = $1 | CURSOR_OPT_NO_SCROLL; }
 7706 tgl@sss.pgh.pa.us       12659                 :            120 :             | cursor_options SCROLL         { $$ = $1 | CURSOR_OPT_SCROLL; }
 7689 bruce@momjian.us        12660                 :              5 :             | cursor_options BINARY         { $$ = $1 | CURSOR_OPT_BINARY; }
 1103 peter@eisentraut.org    12661                 :UBC           0 :             | cursor_options ASENSITIVE     { $$ = $1 | CURSOR_OPT_ASENSITIVE; }
 7706 tgl@sss.pgh.pa.us       12662                 :CBC           3 :             | cursor_options INSENSITIVE    { $$ = $1 | CURSOR_OPT_INSENSITIVE; }
                              12663                 :                :         ;
                              12664                 :                : 
 6208                         12665                 :           1274 : opt_hold: /* EMPTY */                       { $$ = 0; }
                              12666                 :             46 :             | WITH HOLD                     { $$ = CURSOR_OPT_HOLD; }
                              12667                 :              3 :             | WITHOUT HOLD                  { $$ = 0; }
                              12668                 :                :         ;
                              12669                 :                : 
                              12670                 :                : /*****************************************************************************
                              12671                 :                :  *
                              12672                 :                :  *      QUERY:
                              12673                 :                :  *              SELECT STATEMENTS
                              12674                 :                :  *
                              12675                 :                :  *****************************************************************************/
                              12676                 :                : 
                              12677                 :                : /* A complete SELECT statement looks like this.
                              12678                 :                :  *
                              12679                 :                :  * The rule returns either a single SelectStmt node or a tree of them,
                              12680                 :                :  * representing a set-operation tree.
                              12681                 :                :  *
                              12682                 :                :  * There is an ambiguity when a sub-SELECT is within an a_expr and there
                              12683                 :                :  * are excess parentheses: do the parentheses belong to the sub-SELECT or
                              12684                 :                :  * to the surrounding a_expr?  We don't really care, but bison wants to know.
                              12685                 :                :  * To resolve the ambiguity, we are careful to define the grammar so that
                              12686                 :                :  * the decision is staved off as long as possible: as long as we can keep
                              12687                 :                :  * absorbing parentheses into the sub-SELECT, we will do so, and only when
                              12688                 :                :  * it's no longer possible to do that will we decide that parens belong to
                              12689                 :                :  * the expression.  For example, in "SELECT (((SELECT 2)) + 3)" the extra
                              12690                 :                :  * parentheses are treated as part of the sub-select.  The necessity of doing
                              12691                 :                :  * it that way is shown by "SELECT (((SELECT 2)) UNION SELECT 2)".    Had we
                              12692                 :                :  * parsed "((SELECT 2))" as an a_expr, it'd be too late to go back to the
                              12693                 :                :  * SELECT viewpoint when we see the UNION.
                              12694                 :                :  *
                              12695                 :                :  * This approach is implemented by defining a nonterminal select_with_parens,
                              12696                 :                :  * which represents a SELECT with at least one outer layer of parentheses,
                              12697                 :                :  * and being careful to use select_with_parens, never '(' SelectStmt ')',
                              12698                 :                :  * in the expression grammar.  We will then have shift-reduce conflicts
                              12699                 :                :  * which we can resolve in favor of always treating '(' <select> ')' as
                              12700                 :                :  * a select_with_parens.  To resolve the conflicts, the productions that
                              12701                 :                :  * conflict with the select_with_parens productions are manually given
                              12702                 :                :  * precedences lower than the precedence of ')', thereby ensuring that we
                              12703                 :                :  * shift ')' (and then reduce to select_with_parens) rather than trying to
                              12704                 :                :  * reduce the inner <select> nonterminal to something else.  We use UMINUS
                              12705                 :                :  * precedence for this, which is a fairly arbitrary choice.
                              12706                 :                :  *
                              12707                 :                :  * To be able to define select_with_parens itself without ambiguity, we need
                              12708                 :                :  * a nonterminal select_no_parens that represents a SELECT structure with no
                              12709                 :                :  * outermost parentheses.  This is a little bit tedious, but it works.
                              12710                 :                :  *
                              12711                 :                :  * In non-expression contexts, we use SelectStmt which can represent a SELECT
                              12712                 :                :  * with or without outer parentheses.
                              12713                 :                :  */
                              12714                 :                : 
                              12715                 :                : SelectStmt: select_no_parens            %prec UMINUS
                              12716                 :                :             | select_with_parens        %prec UMINUS
                              12717                 :                :         ;
                              12718                 :                : 
                              12719                 :                : select_with_parens:
 7972 bruce@momjian.us        12720                 :          26496 :             '(' select_no_parens ')'                { $$ = $2; }
                              12721                 :             75 :             | '(' select_with_parens ')'            { $$ = $2; }
                              12722                 :                :         ;
                              12723                 :                : 
                              12724                 :                : /*
                              12725                 :                :  * This rule parses the equivalent of the standard's <query expression>.
                              12726                 :                :  * The duplicative productions are annoying, but hard to get rid of without
                              12727                 :                :  * creating shift/reduce conflicts.
                              12728                 :                :  *
                              12729                 :                :  *  The locking clause (FOR UPDATE etc) may be before or after LIMIT/OFFSET.
                              12730                 :                :  *  In <=7.2.X, LIMIT/OFFSET had to be after FOR UPDATE
                              12731                 :                :  *  We now support both orderings, but prefer LIMIT/OFFSET before the locking
                              12732                 :                :  * clause.
                              12733                 :                :  *  2002-08-28 bjm
                              12734                 :                :  */
                              12735                 :                : select_no_parens:
                              12736                 :         202510 :             simple_select                       { $$ = $1; }
                              12737                 :                :             | select_clause sort_clause
                              12738                 :                :                 {
 6559 tgl@sss.pgh.pa.us       12739                 :          27264 :                     insertSelectOptions((SelectStmt *) $1, $2, NIL,
                              12740                 :                :                                         NULL, NULL,
                              12741                 :                :                                         yyscanner);
 7972 bruce@momjian.us        12742                 :          27264 :                     $$ = $1;
                              12743                 :                :                 }
                              12744                 :                :             | select_clause opt_sort_clause for_locking_clause opt_select_limit
                              12745                 :                :                 {
 7900                         12746                 :           2357 :                     insertSelectOptions((SelectStmt *) $1, $2, $3,
 1468 alvherre@alvh.no-ip.    12747                 :           2357 :                                         $4,
                              12748                 :                :                                         NULL,
                              12749                 :                :                                         yyscanner);
 7972 bruce@momjian.us        12750                 :           2357 :                     $$ = $1;
                              12751                 :                :                 }
                              12752                 :                :             | select_clause opt_sort_clause select_limit opt_for_locking_clause
                              12753                 :                :                 {
 7900                         12754                 :           2300 :                     insertSelectOptions((SelectStmt *) $1, $2, $4,
 1468 alvherre@alvh.no-ip.    12755                 :           2300 :                                         $3,
                              12756                 :                :                                         NULL,
                              12757                 :                :                                         yyscanner);
 7972 bruce@momjian.us        12758                 :           2294 :                     $$ = $1;
                              12759                 :                :                 }
                              12760                 :                :             | with_clause select_clause
                              12761                 :                :                 {
 5671 tgl@sss.pgh.pa.us       12762                 :            933 :                     insertSelectOptions((SelectStmt *) $2, NULL, NIL,
                              12763                 :                :                                         NULL,
 5389                         12764                 :            933 :                                         $1,
                              12765                 :                :                                         yyscanner);
 5671                         12766                 :            933 :                     $$ = $2;
                              12767                 :                :                 }
                              12768                 :                :             | with_clause select_clause sort_clause
                              12769                 :                :                 {
                              12770                 :            244 :                     insertSelectOptions((SelectStmt *) $2, $3, NIL,
                              12771                 :                :                                         NULL,
 5389                         12772                 :            244 :                                         $1,
                              12773                 :                :                                         yyscanner);
 5671                         12774                 :            244 :                     $$ = $2;
                              12775                 :                :                 }
                              12776                 :                :             | with_clause select_clause opt_sort_clause for_locking_clause opt_select_limit
                              12777                 :                :                 {
                              12778                 :              3 :                     insertSelectOptions((SelectStmt *) $2, $3, $4,
 1468 alvherre@alvh.no-ip.    12779                 :              3 :                                         $5,
 5389 tgl@sss.pgh.pa.us       12780                 :              3 :                                         $1,
                              12781                 :                :                                         yyscanner);
 5671                         12782                 :              3 :                     $$ = $2;
                              12783                 :                :                 }
                              12784                 :                :             | with_clause select_clause opt_sort_clause select_limit opt_for_locking_clause
                              12785                 :                :                 {
                              12786                 :             32 :                     insertSelectOptions((SelectStmt *) $2, $3, $5,
 1468 alvherre@alvh.no-ip.    12787                 :             32 :                                         $4,
 5389 tgl@sss.pgh.pa.us       12788                 :             32 :                                         $1,
                              12789                 :                :                                         yyscanner);
 5671                         12790                 :             32 :                     $$ = $2;
                              12791                 :                :                 }
                              12792                 :                :         ;
                              12793                 :                : 
                              12794                 :                : select_clause:
 7972 bruce@momjian.us        12795                 :          46847 :             simple_select                           { $$ = $1; }
                              12796                 :            236 :             | select_with_parens                    { $$ = $1; }
                              12797                 :                :         ;
                              12798                 :                : 
                              12799                 :                : /*
                              12800                 :                :  * This rule parses SELECT statements that can appear within set operations,
                              12801                 :                :  * including UNION, INTERSECT and EXCEPT.  '(' and ')' can be used to specify
                              12802                 :                :  * the ordering of the set operations.  Without '(' and ')' we want the
                              12803                 :                :  * operations to be ordered per the precedence specs at the head of this file.
                              12804                 :                :  *
                              12805                 :                :  * As with select_no_parens, simple_select cannot have outer parentheses,
                              12806                 :                :  * but can have parenthesized subclauses.
                              12807                 :                :  *
                              12808                 :                :  * It might appear that we could fold the first two alternatives into one
                              12809                 :                :  * by using opt_distinct_clause.  However, that causes a shift/reduce conflict
                              12810                 :                :  * against INSERT ... SELECT ... ON CONFLICT.  We avoid the ambiguity by
                              12811                 :                :  * requiring SELECT DISTINCT [ON] to be followed by a non-empty target_list.
                              12812                 :                :  *
                              12813                 :                :  * Note that sort clauses cannot be included at this level --- SQL requires
                              12814                 :                :  *      SELECT foo UNION SELECT bar ORDER BY baz
                              12815                 :                :  * to be parsed as
                              12816                 :                :  *      (SELECT foo UNION SELECT bar) ORDER BY baz
                              12817                 :                :  * not
                              12818                 :                :  *      SELECT foo UNION (SELECT bar ORDER BY baz)
                              12819                 :                :  * Likewise for WITH, FOR UPDATE and LIMIT.  Therefore, those clauses are
                              12820                 :                :  * described as part of the select_no_parens production, not simple_select.
                              12821                 :                :  * This does not limit functionality, because you can reintroduce these
                              12822                 :                :  * clauses inside parentheses.
                              12823                 :                :  *
                              12824                 :                :  * NOTE: only the leftmost component SelectStmt should have INTO.
                              12825                 :                :  * However, this is not checked by the grammar; parse analysis must check it.
                              12826                 :                :  */
                              12827                 :                : simple_select:
                              12828                 :                :             SELECT opt_all_clause opt_target_list
                              12829                 :                :             into_clause from_clause where_clause
                              12830                 :                :             group_clause having_clause window_clause
                              12831                 :                :                 {
 3264 andres@anarazel.de      12832                 :         211676 :                     SelectStmt *n = makeNode(SelectStmt);
                              12833                 :                : 
                              12834                 :         211676 :                     n->targetList = $3;
                              12835                 :         211676 :                     n->intoClause = $4;
                              12836                 :         211676 :                     n->fromClause = $5;
                              12837                 :         211676 :                     n->whereClause = $6;
 1123 tomas.vondra@postgre    12838                 :         211676 :                     n->groupClause = ($7)->list;
                              12839                 :         211676 :                     n->groupDistinct = ($7)->distinct;
 3264 andres@anarazel.de      12840                 :         211676 :                     n->havingClause = $8;
                              12841                 :         211676 :                     n->windowClause = $9;
  702 peter@eisentraut.org    12842                 :         211676 :                     $$ = (Node *) n;
                              12843                 :                :                 }
                              12844                 :                :             | SELECT distinct_clause target_list
                              12845                 :                :             into_clause from_clause where_clause
                              12846                 :                :             group_clause having_clause window_clause
                              12847                 :                :                 {
 9592 bruce@momjian.us        12848                 :           1506 :                     SelectStmt *n = makeNode(SelectStmt);
                              12849                 :                : 
 8844 tgl@sss.pgh.pa.us       12850                 :           1506 :                     n->distinctClause = $2;
 9715 bruce@momjian.us        12851                 :           1506 :                     n->targetList = $3;
 6197 tgl@sss.pgh.pa.us       12852                 :           1506 :                     n->intoClause = $4;
 9715 bruce@momjian.us        12853                 :           1506 :                     n->fromClause = $5;
                              12854                 :           1506 :                     n->whereClause = $6;
 1123 tomas.vondra@postgre    12855                 :           1506 :                     n->groupClause = ($7)->list;
                              12856                 :           1506 :                     n->groupDistinct = ($7)->distinct;
 9715 bruce@momjian.us        12857                 :           1506 :                     n->havingClause = $8;
 5586 tgl@sss.pgh.pa.us       12858                 :           1506 :                     n->windowClause = $9;
  702 peter@eisentraut.org    12859                 :           1506 :                     $$ = (Node *) n;
                              12860                 :                :                 }
 6465 mail@joeconway.com      12861                 :          29080 :             | values_clause                         { $$ = $1; }
                              12862                 :                :             | TABLE relation_expr
                              12863                 :                :                 {
                              12864                 :                :                     /* same as SELECT * FROM relation_expr */
  702 peter@eisentraut.org    12865                 :            123 :                     ColumnRef  *cr = makeNode(ColumnRef);
                              12866                 :            123 :                     ResTarget  *rt = makeNode(ResTarget);
 5624 peter_e@gmx.net         12867                 :            123 :                     SelectStmt *n = makeNode(SelectStmt);
                              12868                 :                : 
                              12869                 :            123 :                     cr->fields = list_make1(makeNode(A_Star));
                              12870                 :            123 :                     cr->location = -1;
                              12871                 :                : 
                              12872                 :            123 :                     rt->name = NULL;
                              12873                 :            123 :                     rt->indirection = NIL;
  702 peter@eisentraut.org    12874                 :            123 :                     rt->val = (Node *) cr;
 5624 peter_e@gmx.net         12875                 :            123 :                     rt->location = -1;
                              12876                 :                : 
                              12877                 :            123 :                     n->targetList = list_make1(rt);
                              12878                 :            123 :                     n->fromClause = list_make1($2);
  702 peter@eisentraut.org    12879                 :            123 :                     $$ = (Node *) n;
                              12880                 :                :                 }
                              12881                 :                :             | select_clause UNION set_quantifier select_clause
                              12882                 :                :                 {
 1123 tomas.vondra@postgre    12883                 :           6632 :                     $$ = makeSetOp(SETOP_UNION, $3 == SET_QUANTIFIER_ALL, $1, $4);
                              12884                 :                :                 }
                              12885                 :                :             | select_clause INTERSECT set_quantifier select_clause
                              12886                 :                :                 {
                              12887                 :            120 :                     $$ = makeSetOp(SETOP_INTERSECT, $3 == SET_QUANTIFIER_ALL, $1, $4);
                              12888                 :                :                 }
                              12889                 :                :             | select_clause EXCEPT set_quantifier select_clause
                              12890                 :                :                 {
                              12891                 :            220 :                     $$ = makeSetOp(SETOP_EXCEPT, $3 == SET_QUANTIFIER_ALL, $1, $4);
                              12892                 :                :                 }
                              12893                 :                :         ;
                              12894                 :                : 
                              12895                 :                : /*
                              12896                 :                :  * SQL standard WITH clause looks like:
                              12897                 :                :  *
                              12898                 :                :  * WITH [ RECURSIVE ] <query name> [ (<column>,...) ]
                              12899                 :                :  *      AS (query) [ SEARCH or CYCLE clause ]
                              12900                 :                :  *
                              12901                 :                :  * Recognizing WITH_LA here allows a CTE to be named TIME or ORDINALITY.
                              12902                 :                :  */
                              12903                 :                : with_clause:
                              12904                 :                :         WITH cte_list
                              12905                 :                :             {
 5671 tgl@sss.pgh.pa.us       12906                 :            858 :                 $$ = makeNode(WithClause);
                              12907                 :            858 :                 $$->ctes = $2;
                              12908                 :            858 :                 $$->recursive = false;
                              12909                 :            858 :                 $$->location = @1;
                              12910                 :                :             }
                              12911                 :                :         | WITH_LA cte_list
                              12912                 :                :             {
 3337                         12913                 :              3 :                 $$ = makeNode(WithClause);
                              12914                 :              3 :                 $$->ctes = $2;
                              12915                 :              3 :                 $$->recursive = false;
                              12916                 :              3 :                 $$->location = @1;
                              12917                 :                :             }
                              12918                 :                :         | WITH RECURSIVE cte_list
                              12919                 :                :             {
 5671                         12920                 :            550 :                 $$ = makeNode(WithClause);
                              12921                 :            550 :                 $$->ctes = $3;
                              12922                 :            550 :                 $$->recursive = true;
                              12923                 :            550 :                 $$->location = @1;
                              12924                 :                :             }
                              12925                 :                :         ;
                              12926                 :                : 
                              12927                 :                : cte_list:
                              12928                 :           1411 :         common_table_expr                       { $$ = list_make1($1); }
                              12929                 :            548 :         | cte_list ',' common_table_expr        { $$ = lappend($1, $3); }
                              12930                 :                :         ;
                              12931                 :                : 
                              12932                 :                : common_table_expr:  name opt_name_list AS opt_materialized '(' PreparableStmt ')' opt_search_clause opt_cycle_clause
                              12933                 :                :             {
                              12934                 :           1959 :                 CommonTableExpr *n = makeNode(CommonTableExpr);
                              12935                 :                : 
                              12936                 :           1959 :                 n->ctename = $1;
                              12937                 :           1959 :                 n->aliascolnames = $2;
 1884                         12938                 :           1959 :                 n->ctematerialized = $4;
                              12939                 :           1959 :                 n->ctequery = $6;
 1168 peter@eisentraut.org    12940                 :           1959 :                 n->search_clause = castNode(CTESearchClause, $8);
                              12941                 :           1959 :                 n->cycle_clause = castNode(CTECycleClause, $9);
 5671 tgl@sss.pgh.pa.us       12942                 :           1959 :                 n->location = @1;
                              12943                 :           1959 :                 $$ = (Node *) n;
                              12944                 :                :             }
                              12945                 :                :         ;
                              12946                 :                : 
                              12947                 :                : opt_materialized:
 1884                         12948                 :             83 :         MATERIALIZED                            { $$ = CTEMaterializeAlways; }
                              12949                 :             24 :         | NOT MATERIALIZED                      { $$ = CTEMaterializeNever; }
                              12950                 :           1852 :         | /*EMPTY*/                             { $$ = CTEMaterializeDefault; }
                              12951                 :                :         ;
                              12952                 :                : 
                              12953                 :                : opt_search_clause:
                              12954                 :                :         SEARCH DEPTH FIRST_P BY columnList SET ColId
                              12955                 :                :             {
 1168 peter@eisentraut.org    12956                 :             45 :                 CTESearchClause *n = makeNode(CTESearchClause);
                              12957                 :                : 
                              12958                 :             45 :                 n->search_col_list = $5;
                              12959                 :             45 :                 n->search_breadth_first = false;
                              12960                 :             45 :                 n->search_seq_column = $7;
                              12961                 :             45 :                 n->location = @1;
                              12962                 :             45 :                 $$ = (Node *) n;
                              12963                 :                :             }
                              12964                 :                :         | SEARCH BREADTH FIRST_P BY columnList SET ColId
                              12965                 :                :             {
                              12966                 :             18 :                 CTESearchClause *n = makeNode(CTESearchClause);
                              12967                 :                : 
                              12968                 :             18 :                 n->search_col_list = $5;
                              12969                 :             18 :                 n->search_breadth_first = true;
                              12970                 :             18 :                 n->search_seq_column = $7;
                              12971                 :             18 :                 n->location = @1;
                              12972                 :             18 :                 $$ = (Node *) n;
                              12973                 :                :             }
                              12974                 :                :         | /*EMPTY*/
                              12975                 :                :             {
                              12976                 :           1896 :                 $$ = NULL;
                              12977                 :                :             }
                              12978                 :                :         ;
                              12979                 :                : 
                              12980                 :                : opt_cycle_clause:
                              12981                 :                :         CYCLE columnList SET ColId TO AexprConst DEFAULT AexprConst USING ColId
                              12982                 :                :             {
                              12983                 :             33 :                 CTECycleClause *n = makeNode(CTECycleClause);
                              12984                 :                : 
                              12985                 :             33 :                 n->cycle_col_list = $2;
                              12986                 :             33 :                 n->cycle_mark_column = $4;
                              12987                 :             33 :                 n->cycle_mark_value = $6;
                              12988                 :             33 :                 n->cycle_mark_default = $8;
                              12989                 :             33 :                 n->cycle_path_column = $10;
                              12990                 :             33 :                 n->location = @1;
                              12991                 :             33 :                 $$ = (Node *) n;
                              12992                 :                :             }
                              12993                 :                :         | CYCLE columnList SET ColId USING ColId
                              12994                 :                :             {
 1142                         12995                 :             30 :                 CTECycleClause *n = makeNode(CTECycleClause);
                              12996                 :                : 
                              12997                 :             30 :                 n->cycle_col_list = $2;
                              12998                 :             30 :                 n->cycle_mark_column = $4;
                              12999                 :             30 :                 n->cycle_mark_value = makeBoolAConst(true, -1);
                              13000                 :             30 :                 n->cycle_mark_default = makeBoolAConst(false, -1);
                              13001                 :             30 :                 n->cycle_path_column = $6;
                              13002                 :             30 :                 n->location = @1;
                              13003                 :             30 :                 $$ = (Node *) n;
                              13004                 :                :             }
                              13005                 :                :         | /*EMPTY*/
                              13006                 :                :             {
 1168                         13007                 :           1896 :                 $$ = NULL;
                              13008                 :                :             }
                              13009                 :                :         ;
                              13010                 :                : 
                              13011                 :                : opt_with_clause:
 4930 tgl@sss.pgh.pa.us       13012                 :            199 :         with_clause                             { $$ = $1; }
                              13013                 :          44830 :         | /*EMPTY*/                             { $$ = NULL; }
                              13014                 :                :         ;
                              13015                 :                : 
                              13016                 :                : into_clause:
                              13017                 :                :             INTO OptTempTableName
                              13018                 :                :                 {
 6263                         13019                 :             65 :                     $$ = makeNode(IntoClause);
                              13020                 :             65 :                     $$->rel = $2;
                              13021                 :             65 :                     $$->colNames = NIL;
                              13022                 :             65 :                     $$->options = NIL;
                              13023                 :             65 :                     $$->onCommit = ONCOMMIT_NOOP;
                              13024                 :             65 :                     $$->tableSpaceName = NULL;
 4020                         13025                 :             65 :                     $$->viewQuery = NULL;
 4525                         13026                 :             65 :                     $$->skipData = false;
                              13027                 :                :                 }
                              13028                 :                :             | /*EMPTY*/
 6263                         13029                 :         213126 :                 { $$ = NULL; }
                              13030                 :                :         ;
                              13031                 :                : 
                              13032                 :                : /*
                              13033                 :                :  * Redundancy here is needed to avoid shift/reduce conflicts,
                              13034                 :                :  * since TEMP is not a reserved word.  See also OptTemp.
                              13035                 :                :  */
                              13036                 :                : OptTempTableName:
                              13037                 :                :             TEMPORARY opt_table qualified_name
                              13038                 :                :                 {
 8060 tgl@sss.pgh.pa.us       13039                 :UBC           0 :                     $$ = $3;
 4871 rhaas@postgresql.org    13040                 :              0 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
                              13041                 :                :                 }
                              13042                 :                :             | TEMP opt_table qualified_name
                              13043                 :                :                 {
 8060 tgl@sss.pgh.pa.us       13044                 :CBC           3 :                     $$ = $3;
 4871 rhaas@postgresql.org    13045                 :              3 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
                              13046                 :                :                 }
                              13047                 :                :             | LOCAL TEMPORARY opt_table qualified_name
                              13048                 :                :                 {
 8060 tgl@sss.pgh.pa.us       13049                 :UBC           0 :                     $$ = $4;
 4871 rhaas@postgresql.org    13050                 :              0 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
                              13051                 :                :                 }
                              13052                 :                :             | LOCAL TEMP opt_table qualified_name
                              13053                 :                :                 {
 8060 tgl@sss.pgh.pa.us       13054                 :              0 :                     $$ = $4;
 4871 rhaas@postgresql.org    13055                 :              0 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
                              13056                 :                :                 }
                              13057                 :                :             | GLOBAL TEMPORARY opt_table qualified_name
                              13058                 :                :                 {
 4323 tgl@sss.pgh.pa.us       13059         [ #  # ]:              0 :                     ereport(WARNING,
                              13060                 :                :                             (errmsg("GLOBAL is deprecated in temporary table creation"),
                              13061                 :                :                              parser_errposition(@1)));
 8060                         13062                 :              0 :                     $$ = $4;
 4871 rhaas@postgresql.org    13063                 :              0 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
                              13064                 :                :                 }
                              13065                 :                :             | GLOBAL TEMP opt_table qualified_name
                              13066                 :                :                 {
 4323 tgl@sss.pgh.pa.us       13067         [ #  # ]:              0 :                     ereport(WARNING,
                              13068                 :                :                             (errmsg("GLOBAL is deprecated in temporary table creation"),
                              13069                 :                :                              parser_errposition(@1)));
 8060                         13070                 :              0 :                     $$ = $4;
 4871 rhaas@postgresql.org    13071                 :              0 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
                              13072                 :                :                 }
                              13073                 :                :             | UNLOGGED opt_table qualified_name
                              13074                 :                :                 {
 4855                         13075                 :              0 :                     $$ = $3;
                              13076                 :              0 :                     $$->relpersistence = RELPERSISTENCE_UNLOGGED;
                              13077                 :                :                 }
                              13078                 :                :             | TABLE qualified_name
                              13079                 :                :                 {
 8060 tgl@sss.pgh.pa.us       13080                 :CBC          15 :                     $$ = $2;
 4871 rhaas@postgresql.org    13081                 :             15 :                     $$->relpersistence = RELPERSISTENCE_PERMANENT;
                              13082                 :                :                 }
                              13083                 :                :             | qualified_name
                              13084                 :                :                 {
 8060 tgl@sss.pgh.pa.us       13085                 :             47 :                     $$ = $1;
 4871 rhaas@postgresql.org    13086                 :             47 :                     $$->relpersistence = RELPERSISTENCE_PERMANENT;
                              13087                 :                :                 }
                              13088                 :                :         ;
                              13089                 :                : 
                              13090                 :                : opt_table:  TABLE
                              13091                 :                :             | /*EMPTY*/
                              13092                 :                :         ;
                              13093                 :                : 
                              13094                 :                : set_quantifier:
 1123 tomas.vondra@postgre    13095                 :           3226 :             ALL                                     { $$ = SET_QUANTIFIER_ALL; }
                              13096                 :             16 :             | DISTINCT                              { $$ = SET_QUANTIFIER_DISTINCT; }
                              13097                 :           5831 :             | /*EMPTY*/                             { $$ = SET_QUANTIFIER_DEFAULT; }
                              13098                 :                :         ;
                              13099                 :                : 
                              13100                 :                : /* We use (NIL) as a placeholder to indicate that all target expressions
                              13101                 :                :  * should be placed in the DISTINCT list during parsetree analysis.
                              13102                 :                :  */
                              13103                 :                : distinct_clause:
 7259 neilc@samurai.com       13104                 :           1418 :             DISTINCT                                { $$ = list_make1(NIL); }
 7972 bruce@momjian.us        13105                 :             91 :             | DISTINCT ON '(' expr_list ')'         { $$ = $4; }
                              13106                 :                :         ;
                              13107                 :                : 
                              13108                 :                : opt_all_clause:
                              13109                 :                :             ALL
                              13110                 :                :             | /*EMPTY*/
                              13111                 :                :         ;
                              13112                 :                : 
                              13113                 :                : opt_distinct_clause:
 1178 tgl@sss.pgh.pa.us       13114                 :UBC           0 :             distinct_clause                         { $$ = $1; }
 1178 tgl@sss.pgh.pa.us       13115                 :CBC       20482 :             | opt_all_clause                        { $$ = NIL; }
                              13116                 :                :         ;
                              13117                 :                : 
                              13118                 :                : opt_sort_clause:
                              13119                 :           3264 :             sort_clause                             { $$ = $1; }
 7900 bruce@momjian.us        13120                 :         166689 :             | /*EMPTY*/                             { $$ = NIL; }
                              13121                 :                :         ;
                              13122                 :                : 
                              13123                 :                : sort_clause:
 7972                         13124                 :          30946 :             ORDER BY sortby_list                    { $$ = $3; }
                              13125                 :                :         ;
                              13126                 :                : 
                              13127                 :                : sortby_list:
 7259 neilc@samurai.com       13128                 :          30955 :             sortby                                  { $$ = list_make1($1); }
 7972 bruce@momjian.us        13129                 :          12193 :             | sortby_list ',' sortby                { $$ = lappend($1, $3); }
                              13130                 :                :         ;
                              13131                 :                : 
                              13132                 :                : sortby:     a_expr USING qual_all_Op opt_nulls_order
                              13133                 :                :                 {
 7546 tgl@sss.pgh.pa.us       13134                 :            110 :                     $$ = makeNode(SortBy);
 9384 scrappy@hub.org         13135                 :            110 :                     $$->node = $1;
 6305 tgl@sss.pgh.pa.us       13136                 :            110 :                     $$->sortby_dir = SORTBY_USING;
                              13137                 :            110 :                     $$->sortby_nulls = $4;
 7546                         13138                 :            110 :                     $$->useOp = $3;
 5704                         13139                 :            110 :                     $$->location = @3;
                              13140                 :                :                 }
                              13141                 :                :             | a_expr opt_asc_desc opt_nulls_order
                              13142                 :                :                 {
 7546                         13143                 :          43038 :                     $$ = makeNode(SortBy);
                              13144                 :          43038 :                     $$->node = $1;
 6238 meskes@postgresql.or    13145                 :          43038 :                     $$->sortby_dir = $2;
 6305 tgl@sss.pgh.pa.us       13146                 :          43038 :                     $$->sortby_nulls = $3;
 7546                         13147                 :          43038 :                     $$->useOp = NIL;
 5704                         13148                 :          43038 :                     $$->location = -1;       /* no operator */
                              13149                 :                :                 }
                              13150                 :                :         ;
                              13151                 :                : 
                              13152                 :                : 
                              13153                 :                : select_limit:
                              13154                 :                :             limit_clause offset_clause
                              13155                 :                :                 {
 1468 alvherre@alvh.no-ip.    13156                 :             84 :                     $$ = $1;
                              13157                 :             84 :                     ($$)->limitOffset = $2;
                              13158                 :                :                 }
                              13159                 :                :             | offset_clause limit_clause
                              13160                 :                :                 {
                              13161                 :            107 :                     $$ = $2;
                              13162                 :            107 :                     ($$)->limitOffset = $1;
                              13163                 :                :                 }
                              13164                 :                :             | limit_clause
                              13165                 :                :                 {
                              13166                 :           2037 :                     $$ = $1;
                              13167                 :                :                 }
                              13168                 :                :             | offset_clause
                              13169                 :                :                 {
                              13170                 :            199 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
                              13171                 :                : 
                              13172                 :            199 :                     n->limitOffset = $1;
                              13173                 :            199 :                     n->limitCount = NULL;
                              13174                 :            199 :                     n->limitOption = LIMIT_OPTION_COUNT;
                              13175                 :            199 :                     $$ = n;
                              13176                 :                :                 }
                              13177                 :                :         ;
                              13178                 :                : 
                              13179                 :                : opt_select_limit:
 5353 tgl@sss.pgh.pa.us       13180                 :             95 :             select_limit                        { $$ = $1; }
 1468 alvherre@alvh.no-ip.    13181                 :          22747 :             | /* EMPTY */                       { $$ = NULL; }
                              13182                 :                :         ;
                              13183                 :                : 
                              13184                 :                : limit_clause:
                              13185                 :                :             LIMIT select_limit_value
                              13186                 :                :                 {
                              13187                 :           2188 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
                              13188                 :                : 
                              13189                 :           2188 :                     n->limitOffset = NULL;
                              13190                 :           2188 :                     n->limitCount = $2;
                              13191                 :           2188 :                     n->limitOption = LIMIT_OPTION_COUNT;
                              13192                 :           2188 :                     $$ = n;
                              13193                 :                :                 }
                              13194                 :                :             | LIMIT select_limit_value ',' select_offset_value
                              13195                 :                :                 {
                              13196                 :                :                     /* Disabled because it was too confusing, bjm 2002-02-18 */
 7575 tgl@sss.pgh.pa.us       13197         [ #  # ]:UBC           0 :                     ereport(ERROR,
                              13198                 :                :                             (errcode(ERRCODE_SYNTAX_ERROR),
                              13199                 :                :                              errmsg("LIMIT #,# syntax is not supported"),
                              13200                 :                :                              errhint("Use separate LIMIT and OFFSET clauses."),
                              13201                 :                :                              parser_errposition(@1)));
                              13202                 :                :                 }
                              13203                 :                :             /* SQL:2008 syntax */
                              13204                 :                :             /* to avoid shift/reduce conflicts, handle the optional value with
                              13205                 :                :              * a separate production rather than an opt_ expression.  The fact
                              13206                 :                :              * that ONLY is fully reserved means that this way, we defer any
                              13207                 :                :              * decision about what rule reduces ROW or ROWS to the point where
                              13208                 :                :              * we can see the ONLY token in the lookahead slot.
                              13209                 :                :              */
                              13210                 :                :             | FETCH first_or_next select_fetch_first_value row_or_rows ONLY
                              13211                 :                :                 {
 1468 alvherre@alvh.no-ip.    13212                 :CBC          10 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
                              13213                 :                : 
                              13214                 :             10 :                     n->limitOffset = NULL;
                              13215                 :             10 :                     n->limitCount = $3;
                              13216                 :             10 :                     n->limitOption = LIMIT_OPTION_COUNT;
                              13217                 :             10 :                     $$ = n;
                              13218                 :                :                 }
                              13219                 :                :             | FETCH first_or_next select_fetch_first_value row_or_rows WITH TIES
                              13220                 :                :                 {
                              13221                 :             27 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
                              13222                 :                : 
                              13223                 :             27 :                     n->limitOffset = NULL;
                              13224                 :             27 :                     n->limitCount = $3;
                              13225                 :             27 :                     n->limitOption = LIMIT_OPTION_WITH_TIES;
                              13226                 :             27 :                     $$ = n;
                              13227                 :                :                 }
                              13228                 :                :             | FETCH first_or_next row_or_rows ONLY
                              13229                 :                :                 {
 1468 alvherre@alvh.no-ip.    13230                 :UBC           0 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
                              13231                 :                : 
                              13232                 :              0 :                     n->limitOffset = NULL;
                              13233                 :              0 :                     n->limitCount = makeIntConst(1, -1);
                              13234                 :              0 :                     n->limitOption = LIMIT_OPTION_COUNT;
                              13235                 :              0 :                     $$ = n;
                              13236                 :                :                 }
                              13237                 :                :             | FETCH first_or_next row_or_rows WITH TIES
                              13238                 :                :                 {
 1427 alvherre@alvh.no-ip.    13239                 :CBC           3 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
                              13240                 :                : 
                              13241                 :              3 :                     n->limitOffset = NULL;
                              13242                 :              3 :                     n->limitCount = makeIntConst(1, -1);
                              13243                 :              3 :                     n->limitOption = LIMIT_OPTION_WITH_TIES;
                              13244                 :              3 :                     $$ = n;
                              13245                 :                :                 }
                              13246                 :                :         ;
                              13247                 :                : 
                              13248                 :                : offset_clause:
                              13249                 :                :             OFFSET select_offset_value
 5353 tgl@sss.pgh.pa.us       13250                 :            390 :                 { $$ = $2; }
                              13251                 :                :             /* SQL:2008 syntax */
                              13252                 :                :             | OFFSET select_fetch_first_value row_or_rows
 5353 tgl@sss.pgh.pa.us       13253                 :UBC           0 :                 { $$ = $2; }
                              13254                 :                :         ;
                              13255                 :                : 
                              13256                 :                : select_limit_value:
 7591 tgl@sss.pgh.pa.us       13257                 :CBC        2187 :             a_expr                                  { $$ = $1; }
                              13258                 :                :             | ALL
                              13259                 :                :                 {
                              13260                 :                :                     /* LIMIT ALL is represented as a NULL constant */
 5708                         13261                 :              1 :                     $$ = makeNullAConst(@1);
                              13262                 :                :                 }
                              13263                 :                :         ;
                              13264                 :                : 
                              13265                 :                : select_offset_value:
 5353                         13266                 :            390 :             a_expr                                  { $$ = $1; }
                              13267                 :                :         ;
                              13268                 :                : 
                              13269                 :                : /*
                              13270                 :                :  * Allowing full expressions without parentheses causes various parsing
                              13271                 :                :  * problems with the trailing ROW/ROWS key words.  SQL spec only calls for
                              13272                 :                :  * <simple value specification>, which is either a literal or a parameter (but
                              13273                 :                :  * an <SQL parameter reference> could be an identifier, bringing up conflicts
                              13274                 :                :  * with ROW/ROWS). We solve this by leveraging the presence of ONLY (see above)
                              13275                 :                :  * to determine whether the expression is missing rather than trying to make it
                              13276                 :                :  * optional in this rule.
                              13277                 :                :  *
                              13278                 :                :  * c_expr covers almost all the spec-required cases (and more), but it doesn't
                              13279                 :                :  * cover signed numeric literals, which are allowed by the spec. So we include
                              13280                 :                :  * those here explicitly. We need FCONST as well as ICONST because values that
                              13281                 :                :  * don't fit in the platform's "long", but do fit in bigint, should still be
                              13282                 :                :  * accepted here. (This is possible in 64-bit Windows as well as all 32-bit
                              13283                 :                :  * builds.)
                              13284                 :                :  */
                              13285                 :                : select_fetch_first_value:
 2155 rhodiumtoad@postgres    13286                 :             37 :             c_expr                                  { $$ = $1; }
                              13287                 :                :             | '+' I_or_F_const
 2155 rhodiumtoad@postgres    13288                 :UBC           0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
                              13289                 :                :             | '-' I_or_F_const
                              13290                 :              0 :                 { $$ = doNegate($2, @1); }
                              13291                 :                :         ;
                              13292                 :                : 
                              13293                 :                : I_or_F_const:
                              13294                 :              0 :             Iconst                                  { $$ = makeIntConst($1,@1); }
                              13295                 :              0 :             | FCONST                                { $$ = makeFloatConst($1,@1); }
                              13296                 :                :         ;
                              13297                 :                : 
                              13298                 :                : /* noise words */
 5353 tgl@sss.pgh.pa.us       13299                 :CBC          16 : row_or_rows: ROW                                    { $$ = 0; }
                              13300                 :             24 :             | ROWS                                  { $$ = 0; }
                              13301                 :                :         ;
                              13302                 :                : 
                              13303                 :             40 : first_or_next: FIRST_P                              { $$ = 0; }
 5353 tgl@sss.pgh.pa.us       13304                 :UBC           0 :             | NEXT                                  { $$ = 0; }
                              13305                 :                :         ;
                              13306                 :                : 
                              13307                 :                : 
                              13308                 :                : /*
                              13309                 :                :  * This syntax for group_clause tries to follow the spec quite closely.
                              13310                 :                :  * However, the spec allows only column references, not expressions,
                              13311                 :                :  * which introduces an ambiguity between implicit row constructors
                              13312                 :                :  * (a,b) and lists of column references.
                              13313                 :                :  *
                              13314                 :                :  * We handle this by using the a_expr production for what the spec calls
                              13315                 :                :  * <ordinary grouping set>, which in the spec represents either one column
                              13316                 :                :  * reference or a parenthesized list of column references. Then, we check the
                              13317                 :                :  * top node of the a_expr to see if it's an implicit RowExpr, and if so, just
                              13318                 :                :  * grab and use the list, discarding the node. (this is done in parse analysis,
                              13319                 :                :  * not here)
                              13320                 :                :  *
                              13321                 :                :  * (we abuse the row_format field of RowExpr to distinguish implicit and
                              13322                 :                :  * explicit row constructors; it's debatable if anyone sanely wants to use them
                              13323                 :                :  * in a group clause, but if they have a reason to, we make it possible.)
                              13324                 :                :  *
                              13325                 :                :  * Each item in the group_clause list is either an expression tree or a
                              13326                 :                :  * GroupingSet node of some type.
                              13327                 :                :  */
                              13328                 :                : group_clause:
                              13329                 :                :             GROUP_P BY set_quantifier group_by_list
                              13330                 :                :                 {
 1123 tomas.vondra@postgre    13331                 :CBC        2095 :                     GroupClause *n = (GroupClause *) palloc(sizeof(GroupClause));
                              13332                 :                : 
                              13333                 :           2095 :                     n->distinct = $3 == SET_QUANTIFIER_DISTINCT;
                              13334                 :           2095 :                     n->list = $4;
                              13335                 :           2095 :                     $$ = n;
                              13336                 :                :                 }
                              13337                 :                :             | /*EMPTY*/
                              13338                 :                :                 {
                              13339                 :         231569 :                     GroupClause *n = (GroupClause *) palloc(sizeof(GroupClause));
                              13340                 :                : 
                              13341                 :         231569 :                     n->distinct = false;
                              13342                 :         231569 :                     n->list = NIL;
                              13343                 :         231569 :                     $$ = n;
                              13344                 :                :                 }
                              13345                 :                :         ;
                              13346                 :                : 
                              13347                 :                : group_by_list:
 3256 andres@anarazel.de      13348                 :           2340 :             group_by_item                           { $$ = list_make1($1); }
                              13349                 :           1361 :             | group_by_list ',' group_by_item       { $$ = lappend($1,$3); }
                              13350                 :                :         ;
                              13351                 :                : 
                              13352                 :                : group_by_item:
                              13353                 :           3128 :             a_expr                                  { $$ = $1; }
                              13354                 :            111 :             | empty_grouping_set                    { $$ = $1; }
                              13355                 :             92 :             | cube_clause                           { $$ = $1; }
                              13356                 :            125 :             | rollup_clause                         { $$ = $1; }
                              13357                 :            245 :             | grouping_sets_clause                  { $$ = $1; }
                              13358                 :                :         ;
                              13359                 :                : 
                              13360                 :                : empty_grouping_set:
                              13361                 :                :             '(' ')'
                              13362                 :                :                 {
                              13363                 :            111 :                     $$ = (Node *) makeGroupingSet(GROUPING_SET_EMPTY, NIL, @1);
                              13364                 :                :                 }
                              13365                 :                :         ;
                              13366                 :                : 
                              13367                 :                : /*
                              13368                 :                :  * These hacks rely on setting precedence of CUBE and ROLLUP below that of '(',
                              13369                 :                :  * so that they shift in these rules rather than reducing the conflicting
                              13370                 :                :  * unreserved_keyword rule.
                              13371                 :                :  */
                              13372                 :                : 
                              13373                 :                : rollup_clause:
                              13374                 :                :             ROLLUP '(' expr_list ')'
                              13375                 :                :                 {
                              13376                 :            125 :                     $$ = (Node *) makeGroupingSet(GROUPING_SET_ROLLUP, $3, @1);
                              13377                 :                :                 }
                              13378                 :                :         ;
                              13379                 :                : 
                              13380                 :                : cube_clause:
                              13381                 :                :             CUBE '(' expr_list ')'
                              13382                 :                :                 {
                              13383                 :             92 :                     $$ = (Node *) makeGroupingSet(GROUPING_SET_CUBE, $3, @1);
                              13384                 :                :                 }
                              13385                 :                :         ;
                              13386                 :                : 
                              13387                 :                : grouping_sets_clause:
                              13388                 :                :             GROUPING SETS '(' group_by_list ')'
                              13389                 :                :                 {
                              13390                 :            245 :                     $$ = (Node *) makeGroupingSet(GROUPING_SET_SETS, $4, @1);
                              13391                 :                :                 }
                              13392                 :                :         ;
                              13393                 :                : 
                              13394                 :                : having_clause:
 7972 bruce@momjian.us        13395                 :            387 :             HAVING a_expr                           { $$ = $2; }
                              13396                 :         233277 :             | /*EMPTY*/                             { $$ = NULL; }
                              13397                 :                :         ;
                              13398                 :                : 
                              13399                 :                : for_locking_clause:
 6559 tgl@sss.pgh.pa.us       13400                 :           2530 :             for_locking_items                       { $$ = $1; }
 6559 tgl@sss.pgh.pa.us       13401                 :UBC           0 :             | FOR READ ONLY                         { $$ = NIL; }
                              13402                 :                :         ;
                              13403                 :                : 
                              13404                 :                : opt_for_locking_clause:
 6559 tgl@sss.pgh.pa.us       13405                 :CBC         170 :             for_locking_clause                      { $$ = $1; }
                              13406                 :          22644 :             | /* EMPTY */                           { $$ = NIL; }
                              13407                 :                :         ;
                              13408                 :                : 
                              13409                 :                : for_locking_items:
                              13410                 :           2530 :             for_locking_item                        { $$ = list_make1($1); }
                              13411                 :             49 :             | for_locking_items for_locking_item    { $$ = lappend($1, $2); }
                              13412                 :                :         ;
                              13413                 :                : 
                              13414                 :                : for_locking_item:
                              13415                 :                :             for_locking_strength locked_rels_list opt_nowait_or_skip
                              13416                 :                :                 {
 6831                         13417                 :           2579 :                     LockingClause *n = makeNode(LockingClause);
                              13418                 :                : 
 4099 alvherre@alvh.no-ip.    13419                 :           2579 :                     n->lockedRels = $2;
                              13420                 :           2579 :                     n->strength = $1;
 3477                         13421                 :           2579 :                     n->waitPolicy = $3;
 6831 tgl@sss.pgh.pa.us       13422                 :           2579 :                     $$ = (Node *) n;
                              13423                 :                :                 }
                              13424                 :                :         ;
                              13425                 :                : 
                              13426                 :                : for_locking_strength:
 1250 peter@eisentraut.org    13427                 :            728 :             FOR UPDATE                          { $$ = LCS_FORUPDATE; }
                              13428                 :             33 :             | FOR NO KEY UPDATE                 { $$ = LCS_FORNOKEYUPDATE; }
                              13429                 :            107 :             | FOR SHARE                         { $$ = LCS_FORSHARE; }
                              13430                 :           1711 :             | FOR KEY SHARE                     { $$ = LCS_FORKEYSHARE; }
                              13431                 :                :         ;
                              13432                 :                : 
                              13433                 :                : locked_rels_list:
 5704 tgl@sss.pgh.pa.us       13434                 :           1714 :             OF qualified_name_list                  { $$ = $2; }
 6831                         13435                 :            865 :             | /* EMPTY */                           { $$ = NIL; }
                              13436                 :                :         ;
                              13437                 :                : 
                              13438                 :                : 
                              13439                 :                : /*
                              13440                 :                :  * We should allow ROW '(' expr_list ')' too, but that seems to require
                              13441                 :                :  * making VALUES a fully reserved word, which will probably break more apps
                              13442                 :                :  * than allowing the noise-word is worth.
                              13443                 :                :  */
                              13444                 :                : values_clause:
                              13445                 :                :             VALUES '(' expr_list ')'
                              13446                 :                :                 {
 6465 mail@joeconway.com      13447                 :          29080 :                     SelectStmt *n = makeNode(SelectStmt);
                              13448                 :                : 
 2700 tgl@sss.pgh.pa.us       13449                 :          29080 :                     n->valuesLists = list_make1($3);
 6465 mail@joeconway.com      13450                 :          29080 :                     $$ = (Node *) n;
                              13451                 :                :                 }
                              13452                 :                :             | values_clause ',' '(' expr_list ')'
                              13453                 :                :                 {
                              13454                 :          12168 :                     SelectStmt *n = (SelectStmt *) $1;
                              13455                 :                : 
 2700 tgl@sss.pgh.pa.us       13456                 :          12168 :                     n->valuesLists = lappend(n->valuesLists, $4);
 6465 mail@joeconway.com      13457                 :          12168 :                     $$ = (Node *) n;
                              13458                 :                :                 }
                              13459                 :                :         ;
                              13460                 :                : 
                              13461                 :                : 
                              13462                 :                : /*****************************************************************************
                              13463                 :                :  *
                              13464                 :                :  *  clauses common to all Optimizable Stmts:
                              13465                 :                :  *      from_clause     - allow list of both JOIN expressions and table names
                              13466                 :                :  *      where_clause    - qualifications for joins or restrictions
                              13467                 :                :  *
                              13468                 :                :  *****************************************************************************/
                              13469                 :                : 
                              13470                 :                : from_clause:
 7972 bruce@momjian.us        13471                 :         136669 :             FROM from_list                          { $$ = $2; }
                              13472                 :         103715 :             | /*EMPTY*/                             { $$ = NIL; }
                              13473                 :                :         ;
                              13474                 :                : 
                              13475                 :                : from_list:
 7259 neilc@samurai.com       13476                 :         137003 :             table_ref                               { $$ = list_make1($1); }
 7971 bruce@momjian.us        13477                 :          26713 :             | from_list ',' table_ref               { $$ = lappend($1, $3); }
                              13478                 :                :         ;
                              13479                 :                : 
                              13480                 :                : /*
                              13481                 :                :  * table_ref is where an alias clause can be attached.
                              13482                 :                :  */
                              13483                 :                : table_ref:  relation_expr opt_alias_clause
                              13484                 :                :                 {
 8060 tgl@sss.pgh.pa.us       13485                 :         173328 :                     $1->alias = $2;
 8615                         13486                 :         173328 :                     $$ = (Node *) $1;
                              13487                 :                :                 }
                              13488                 :                :             | relation_expr opt_alias_clause tablesample_clause
                              13489                 :                :                 {
 3186                         13490                 :            127 :                     RangeTableSample *n = (RangeTableSample *) $3;
                              13491                 :                : 
                              13492                 :            127 :                     $1->alias = $2;
                              13493                 :                :                     /* relation_expr goes inside the RangeTableSample node */
                              13494                 :            127 :                     n->relation = (Node *) $1;
                              13495                 :            127 :                     $$ = (Node *) n;
                              13496                 :                :                 }
                              13497                 :                :             | func_table func_alias_clause
                              13498                 :                :                 {
 3797                         13499                 :          20365 :                     RangeFunction *n = (RangeFunction *) $1;
                              13500                 :                : 
 4268                         13501                 :          20365 :                     n->alias = linitial($2);
                              13502                 :          20365 :                     n->coldeflist = lsecond($2);
 7924 bruce@momjian.us        13503                 :          20365 :                     $$ = (Node *) n;
                              13504                 :                :                 }
                              13505                 :                :             | LATERAL_P func_table func_alias_clause
                              13506                 :                :                 {
 3797 tgl@sss.pgh.pa.us       13507                 :            497 :                     RangeFunction *n = (RangeFunction *) $2;
                              13508                 :                : 
 4268                         13509                 :            497 :                     n->lateral = true;
                              13510                 :            497 :                     n->alias = linitial($3);
                              13511                 :            497 :                     n->coldeflist = lsecond($3);
 8008                         13512                 :            497 :                     $$ = (Node *) n;
                              13513                 :                :                 }
                              13514                 :                :             | xmltable opt_alias_clause
                              13515                 :                :                 {
 2594 alvherre@alvh.no-ip.    13516                 :             40 :                     RangeTableFunc *n = (RangeTableFunc *) $1;
                              13517                 :                : 
                              13518                 :             40 :                     n->alias = $2;
                              13519                 :             40 :                     $$ = (Node *) n;
                              13520                 :                :                 }
                              13521                 :                :             | LATERAL_P xmltable opt_alias_clause
                              13522                 :                :                 {
                              13523                 :             70 :                     RangeTableFunc *n = (RangeTableFunc *) $2;
                              13524                 :                : 
                              13525                 :             70 :                     n->lateral = true;
                              13526                 :             70 :                     n->alias = $3;
                              13527                 :             70 :                     $$ = (Node *) n;
                              13528                 :                :                 }
                              13529                 :                :             | select_with_parens opt_alias_clause
                              13530                 :                :                 {
 4268 tgl@sss.pgh.pa.us       13531                 :           6249 :                     RangeSubselect *n = makeNode(RangeSubselect);
                              13532                 :                : 
                              13533                 :           6249 :                     n->lateral = false;
                              13534                 :           6249 :                     n->subquery = $1;
                              13535                 :           6249 :                     n->alias = $2;
                              13536                 :           6249 :                     $$ = (Node *) n;
                              13537                 :                :                 }
                              13538                 :                :             | LATERAL_P select_with_parens opt_alias_clause
                              13539                 :                :                 {
 8615                         13540                 :            696 :                     RangeSubselect *n = makeNode(RangeSubselect);
                              13541                 :                : 
 4268                         13542                 :            696 :                     n->lateral = true;
                              13543                 :            696 :                     n->subquery = $2;
                              13544                 :            696 :                     n->alias = $3;
 8615                         13545                 :            696 :                     $$ = (Node *) n;
                              13546                 :                :                 }
                              13547                 :                :             | joined_table
                              13548                 :                :                 {
                              13549                 :          36779 :                     $$ = (Node *) $1;
                              13550                 :                :                 }
                              13551                 :                :             | '(' joined_table ')' alias_clause
                              13552                 :                :                 {
                              13553                 :             87 :                     $2->alias = $4;
                              13554                 :             87 :                     $$ = (Node *) $2;
                              13555                 :                :                 }
                              13556                 :                :             | json_table opt_alias_clause
                              13557                 :                :                 {
   10 amitlan@postgresql.o    13558                 :GNC         194 :                     JsonTable  *jt = castNode(JsonTable, $1);
                              13559                 :                : 
                              13560                 :            194 :                     jt->alias = $2;
                              13561                 :            194 :                     $$ = (Node *) jt;
                              13562                 :                :                 }
                              13563                 :                :             | LATERAL_P json_table opt_alias_clause
                              13564                 :                :                 {
   10 amitlan@postgresql.o    13565                 :UNC           0 :                     JsonTable  *jt = castNode(JsonTable, $2);
                              13566                 :                : 
                              13567                 :              0 :                     jt->alias = $3;
                              13568                 :              0 :                     jt->lateral = true;
                              13569                 :              0 :                     $$ = (Node *) jt;
                              13570                 :                :                 }
                              13571                 :                :         ;
                              13572                 :                : 
                              13573                 :                : 
                              13574                 :                : /*
                              13575                 :                :  * It may seem silly to separate joined_table from table_ref, but there is
                              13576                 :                :  * method in SQL's madness: if you don't do it this way you get reduce-
                              13577                 :                :  * reduce conflicts, because it's not clear to the parser generator whether
                              13578                 :                :  * to expect alias_clause after ')' or not.  For the same reason we must
                              13579                 :                :  * treat 'JOIN' and 'join_type JOIN' separately, rather than allowing
                              13580                 :                :  * join_type to expand to empty; if we try it, the parser generator can't
                              13581                 :                :  * figure out when to reduce an empty join_type right after table_ref.
                              13582                 :                :  *
                              13583                 :                :  * Note that a CROSS JOIN is the same as an unqualified
                              13584                 :                :  * INNER JOIN, and an INNER JOIN/ON has the same shape
                              13585                 :                :  * but a qualification expression to limit membership.
                              13586                 :                :  * A NATURAL JOIN implicitly matches column names between
                              13587                 :                :  * tables and the shape is determined by which columns are
                              13588                 :                :  * in common. We'll collect columns during the later transformations.
                              13589                 :                :  */
                              13590                 :                : 
                              13591                 :                : joined_table:
                              13592                 :                :             '(' joined_table ')'
                              13593                 :                :                 {
 8615 tgl@sss.pgh.pa.us       13594                 :CBC        1689 :                     $$ = $2;
                              13595                 :                :                 }
                              13596                 :                :             | table_ref CROSS JOIN table_ref
                              13597                 :                :                 {
                              13598                 :                :                     /* CROSS JOIN is same as unqualified inner join */
  702 peter@eisentraut.org    13599                 :            149 :                     JoinExpr   *n = makeNode(JoinExpr);
                              13600                 :                : 
 8615 tgl@sss.pgh.pa.us       13601                 :            149 :                     n->jointype = JOIN_INNER;
 2433 peter_e@gmx.net         13602                 :            149 :                     n->isNatural = false;
 8615 tgl@sss.pgh.pa.us       13603                 :            149 :                     n->larg = $1;
                              13604                 :            149 :                     n->rarg = $4;
 5386 peter_e@gmx.net         13605                 :            149 :                     n->usingClause = NIL;
 1110 peter@eisentraut.org    13606                 :            149 :                     n->join_using_alias = NULL;
 8615 tgl@sss.pgh.pa.us       13607                 :            149 :                     n->quals = NULL;
 8825 lockhart@fourpalms.o    13608                 :            149 :                     $$ = n;
                              13609                 :                :                 }
                              13610                 :                :             | table_ref join_type JOIN table_ref join_qual
                              13611                 :                :                 {
  702 peter@eisentraut.org    13612                 :          22250 :                     JoinExpr   *n = makeNode(JoinExpr);
                              13613                 :                : 
 8615 tgl@sss.pgh.pa.us       13614                 :          22250 :                     n->jointype = $2;
 2433 peter_e@gmx.net         13615                 :          22250 :                     n->isNatural = false;
 8615 tgl@sss.pgh.pa.us       13616                 :          22250 :                     n->larg = $1;
                              13617                 :          22250 :                     n->rarg = $4;
                              13618   [ +  -  +  + ]:          22250 :                     if ($5 != NULL && IsA($5, List))
                              13619                 :                :                     {
                              13620                 :                :                          /* USING clause */
 1110 peter@eisentraut.org    13621                 :            243 :                         n->usingClause = linitial_node(List, castNode(List, $5));
                              13622                 :            243 :                         n->join_using_alias = lsecond_node(Alias, castNode(List, $5));
                              13623                 :                :                     }
                              13624                 :                :                     else
                              13625                 :                :                     {
                              13626                 :                :                         /* ON clause */
                              13627                 :          22007 :                         n->quals = $5;
                              13628                 :                :                     }
 8825 lockhart@fourpalms.o    13629                 :          22250 :                     $$ = n;
                              13630                 :                :                 }
                              13631                 :                :             | table_ref JOIN table_ref join_qual
                              13632                 :                :                 {
                              13633                 :                :                     /* letting join_type reduce to empty doesn't work */
  702 peter@eisentraut.org    13634                 :          14338 :                     JoinExpr   *n = makeNode(JoinExpr);
                              13635                 :                : 
 8615 tgl@sss.pgh.pa.us       13636                 :          14338 :                     n->jointype = JOIN_INNER;
 2433 peter_e@gmx.net         13637                 :          14338 :                     n->isNatural = false;
 8615 tgl@sss.pgh.pa.us       13638                 :          14338 :                     n->larg = $1;
                              13639                 :          14338 :                     n->rarg = $3;
                              13640   [ +  -  +  + ]:          14338 :                     if ($4 != NULL && IsA($4, List))
                              13641                 :                :                     {
                              13642                 :                :                         /* USING clause */
 1110 peter@eisentraut.org    13643                 :            354 :                         n->usingClause = linitial_node(List, castNode(List, $4));
                              13644                 :            354 :                         n->join_using_alias = lsecond_node(Alias, castNode(List, $4));
                              13645                 :                :                     }
                              13646                 :                :                     else
                              13647                 :                :                     {
                              13648                 :                :                         /* ON clause */
                              13649                 :          13984 :                         n->quals = $4;
                              13650                 :                :                     }
 8615 tgl@sss.pgh.pa.us       13651                 :          14338 :                     $$ = n;
                              13652                 :                :                 }
                              13653                 :                :             | table_ref NATURAL join_type JOIN table_ref
                              13654                 :                :                 {
  702 peter@eisentraut.org    13655                 :             39 :                     JoinExpr   *n = makeNode(JoinExpr);
                              13656                 :                : 
 8615 tgl@sss.pgh.pa.us       13657                 :             39 :                     n->jointype = $3;
 2433 peter_e@gmx.net         13658                 :             39 :                     n->isNatural = true;
 8615 tgl@sss.pgh.pa.us       13659                 :             39 :                     n->larg = $1;
                              13660                 :             39 :                     n->rarg = $5;
 5386 peter_e@gmx.net         13661                 :             39 :                     n->usingClause = NIL; /* figure out which columns later... */
 1110 peter@eisentraut.org    13662                 :             39 :                     n->join_using_alias = NULL;
 8615 tgl@sss.pgh.pa.us       13663                 :             39 :                     n->quals = NULL; /* fill later */
                              13664                 :             39 :                     $$ = n;
                              13665                 :                :                 }
                              13666                 :                :             | table_ref NATURAL JOIN table_ref
                              13667                 :                :                 {
                              13668                 :                :                     /* letting join_type reduce to empty doesn't work */
  702 peter@eisentraut.org    13669                 :             90 :                     JoinExpr   *n = makeNode(JoinExpr);
                              13670                 :                : 
 8615 tgl@sss.pgh.pa.us       13671                 :             90 :                     n->jointype = JOIN_INNER;
 2433 peter_e@gmx.net         13672                 :             90 :                     n->isNatural = true;
 8615 tgl@sss.pgh.pa.us       13673                 :             90 :                     n->larg = $1;
                              13674                 :             90 :                     n->rarg = $4;
 5386 peter_e@gmx.net         13675                 :             90 :                     n->usingClause = NIL; /* figure out which columns later... */
 1110 peter@eisentraut.org    13676                 :             90 :                     n->join_using_alias = NULL;
 8615 tgl@sss.pgh.pa.us       13677                 :             90 :                     n->quals = NULL; /* fill later */
 8825 lockhart@fourpalms.o    13678                 :             90 :                     $$ = n;
                              13679                 :                :                 }
                              13680                 :                :         ;
                              13681                 :                : 
                              13682                 :                : alias_clause:
                              13683                 :                :             AS ColId '(' name_list ')'
                              13684                 :                :                 {
 8060 tgl@sss.pgh.pa.us       13685                 :           2723 :                     $$ = makeNode(Alias);
                              13686                 :           2723 :                     $$->aliasname = $2;
                              13687                 :           2723 :                     $$->colnames = $4;
                              13688                 :                :                 }
                              13689                 :                :             | AS ColId
                              13690                 :                :                 {
                              13691                 :           5786 :                     $$ = makeNode(Alias);
                              13692                 :           5786 :                     $$->aliasname = $2;
                              13693                 :                :                 }
                              13694                 :                :             | ColId '(' name_list ')'
                              13695                 :                :                 {
                              13696                 :           2707 :                     $$ = makeNode(Alias);
                              13697                 :           2707 :                     $$->aliasname = $1;
                              13698                 :           2707 :                     $$->colnames = $3;
                              13699                 :                :                 }
                              13700                 :                :             | ColId
                              13701                 :                :                 {
                              13702                 :         114772 :                     $$ = makeNode(Alias);
                              13703                 :         114772 :                     $$->aliasname = $1;
                              13704                 :                :                 }
                              13705                 :                :         ;
                              13706                 :                : 
 4268                         13707                 :         111878 : opt_alias_clause: alias_clause                      { $$ = $1; }
                              13708                 :          68826 :             | /*EMPTY*/                             { $$ = NULL; }
                              13709                 :                :         ;
                              13710                 :                : 
                              13711                 :                : /*
                              13712                 :                :  * The alias clause after JOIN ... USING only accepts the AS ColId spelling,
                              13713                 :                :  * per SQL standard.  (The grammar could parse the other variants, but they
                              13714                 :                :  * don't seem to be useful, and it might lead to parser problems in the
                              13715                 :                :  * future.)
                              13716                 :                :  */
                              13717                 :                : opt_alias_clause_for_join_using:
                              13718                 :                :             AS ColId
                              13719                 :                :                 {
 1110 peter@eisentraut.org    13720                 :             42 :                     $$ = makeNode(Alias);
                              13721                 :             42 :                     $$->aliasname = $2;
                              13722                 :                :                     /* the column name list will be inserted later */
                              13723                 :                :                 }
                              13724                 :            555 :             | /*EMPTY*/                             { $$ = NULL; }
                              13725                 :                :         ;
                              13726                 :                : 
                              13727                 :                : /*
                              13728                 :                :  * func_alias_clause can include both an Alias and a coldeflist, so we make it
                              13729                 :                :  * return a 2-element list that gets disassembled by calling production.
                              13730                 :                :  */
                              13731                 :                : func_alias_clause:
                              13732                 :                :             alias_clause
                              13733                 :                :                 {
 4268 tgl@sss.pgh.pa.us       13734                 :          14023 :                     $$ = list_make2($1, NIL);
                              13735                 :                :                 }
                              13736                 :                :             | AS '(' TableFuncElementList ')'
                              13737                 :                :                 {
                              13738                 :             52 :                     $$ = list_make2(NULL, $3);
                              13739                 :                :                 }
                              13740                 :                :             | AS ColId '(' TableFuncElementList ')'
                              13741                 :                :                 {
  702 peter@eisentraut.org    13742                 :            298 :                     Alias      *a = makeNode(Alias);
                              13743                 :                : 
 4268 tgl@sss.pgh.pa.us       13744                 :            298 :                     a->aliasname = $2;
                              13745                 :            298 :                     $$ = list_make2(a, $4);
                              13746                 :                :                 }
                              13747                 :                :             | ColId '(' TableFuncElementList ')'
                              13748                 :                :                 {
  702 peter@eisentraut.org    13749                 :             25 :                     Alias      *a = makeNode(Alias);
                              13750                 :                : 
 4268 tgl@sss.pgh.pa.us       13751                 :             25 :                     a->aliasname = $1;
                              13752                 :             25 :                     $$ = list_make2(a, $3);
                              13753                 :                :                 }
                              13754                 :                :             | /*EMPTY*/
                              13755                 :                :                 {
                              13756                 :           6464 :                     $$ = list_make2(NULL, NIL);
                              13757                 :                :                 }
                              13758                 :                :         ;
                              13759                 :                : 
 1249 peter@eisentraut.org    13760                 :            509 : join_type:  FULL opt_outer                          { $$ = JOIN_FULL; }
                              13761                 :          19714 :             | LEFT opt_outer                        { $$ = JOIN_LEFT; }
                              13762                 :            172 :             | RIGHT opt_outer                       { $$ = JOIN_RIGHT; }
 7972 bruce@momjian.us        13763                 :           1894 :             | INNER_P                               { $$ = JOIN_INNER; }
                              13764                 :                :         ;
                              13765                 :                : 
                              13766                 :                : /* OUTER is just noise... */
                              13767                 :                : opt_outer: OUTER_P
                              13768                 :                :             | /*EMPTY*/
                              13769                 :                :         ;
                              13770                 :                : 
                              13771                 :                : /* JOIN qualification clauses
                              13772                 :                :  * Possibilities are:
                              13773                 :                :  *  USING ( column list ) [ AS alias ]
                              13774                 :                :  *                        allows only unqualified column names,
                              13775                 :                :  *                        which must match between tables.
                              13776                 :                :  *  ON expr allows more general qualifications.
                              13777                 :                :  *
                              13778                 :                :  * We return USING as a two-element List (the first item being a sub-List
                              13779                 :                :  * of the common column names, and the second either an Alias item or NULL).
                              13780                 :                :  * An ON-expr will not be a List, so it can be told apart that way.
                              13781                 :                :  */
                              13782                 :                : 
                              13783                 :                : join_qual: USING '(' name_list ')' opt_alias_clause_for_join_using
                              13784                 :                :                 {
 1110 peter@eisentraut.org    13785                 :            597 :                     $$ = (Node *) list_make2($3, $5);
                              13786                 :                :                 }
                              13787                 :                :             | ON a_expr
                              13788                 :                :                 {
                              13789                 :          35991 :                     $$ = $2;
                              13790                 :                :                 }
                              13791                 :                :         ;
                              13792                 :                : 
                              13793                 :                : 
                              13794                 :                : relation_expr:
                              13795                 :                :             qualified_name
                              13796                 :                :                 {
                              13797                 :                :                     /* inheritance query, implicitly */
 8060 tgl@sss.pgh.pa.us       13798                 :         203105 :                     $$ = $1;
 2669                         13799                 :         203105 :                     $$->inh = true;
 8060                         13800                 :         203105 :                     $$->alias = NULL;
                              13801                 :                :                 }
                              13802                 :                :             | extended_relation_expr
                              13803                 :                :                 {
  900 akapila@postgresql.o    13804                 :           3520 :                     $$ = $1;
                              13805                 :                :                 }
                              13806                 :                :         ;
                              13807                 :                : 
                              13808                 :                : extended_relation_expr:
                              13809                 :                :             qualified_name '*'
                              13810                 :                :                 {
                              13811                 :                :                     /* inheritance query, explicitly */
 8060 tgl@sss.pgh.pa.us       13812                 :            102 :                     $$ = $1;
 2669                         13813                 :            102 :                     $$->inh = true;
 8060                         13814                 :            102 :                     $$->alias = NULL;
                              13815                 :                :                 }
                              13816                 :                :             | ONLY qualified_name
                              13817                 :                :                 {
                              13818                 :                :                     /* no inheritance */
                              13819                 :           3421 :                     $$ = $2;
 2669                         13820                 :           3421 :                     $$->inh = false;
 8060                         13821                 :           3421 :                     $$->alias = NULL;
                              13822                 :                :                 }
                              13823                 :                :             | ONLY '(' qualified_name ')'
                              13824                 :                :                 {
                              13825                 :                :                     /* no inheritance, SQL99-style syntax */
 7924 lockhart@fourpalms.o    13826                 :UBC           0 :                     $$ = $3;
 2669 tgl@sss.pgh.pa.us       13827                 :              0 :                     $$->inh = false;
 7924 lockhart@fourpalms.o    13828                 :              0 :                     $$->alias = NULL;
                              13829                 :                :                 }
                              13830                 :                :         ;
                              13831                 :                : 
                              13832                 :                : 
                              13833                 :                : relation_expr_list:
 5571 peter_e@gmx.net         13834                 :CBC        1309 :             relation_expr                           { $$ = list_make1($1); }
                              13835                 :           4852 :             | relation_expr_list ',' relation_expr  { $$ = lappend($1, $3); }
                              13836                 :                :         ;
                              13837                 :                : 
                              13838                 :                : 
                              13839                 :                : /*
                              13840                 :                :  * Given "UPDATE foo set set ...", we have to decide without looking any
                              13841                 :                :  * further ahead whether the first "set" is an alias or the UPDATE's SET
                              13842                 :                :  * keyword.  Since "set" is allowed as a column name both interpretations
                              13843                 :                :  * are feasible.  We resolve the shift/reduce conflict by giving the first
                              13844                 :                :  * relation_expr_opt_alias production a higher precedence than the SET token
                              13845                 :                :  * has, causing the parser to prefer to reduce, in effect assuming that the
                              13846                 :                :  * SET is not an alias.
                              13847                 :                :  */
                              13848                 :                : relation_expr_opt_alias: relation_expr                  %prec UMINUS
                              13849                 :                :                 {
 6657 neilc@samurai.com       13850                 :           8877 :                     $$ = $1;
                              13851                 :                :                 }
                              13852                 :                :             | relation_expr ColId
                              13853                 :                :                 {
  702 peter@eisentraut.org    13854                 :           1048 :                     Alias      *alias = makeNode(Alias);
                              13855                 :                : 
 6657 tgl@sss.pgh.pa.us       13856                 :           1048 :                     alias->aliasname = $2;
                              13857                 :           1048 :                     $1->alias = alias;
                              13858                 :           1048 :                     $$ = $1;
                              13859                 :                :                 }
                              13860                 :                :             | relation_expr AS ColId
                              13861                 :                :                 {
  702 peter@eisentraut.org    13862                 :             39 :                     Alias      *alias = makeNode(Alias);
                              13863                 :                : 
 6657 neilc@samurai.com       13864                 :             39 :                     alias->aliasname = $3;
                              13865                 :             39 :                     $1->alias = alias;
                              13866                 :             39 :                     $$ = $1;
                              13867                 :                :                 }
                              13868                 :                :         ;
                              13869                 :                : 
                              13870                 :                : /*
                              13871                 :                :  * TABLESAMPLE decoration in a FROM item
                              13872                 :                :  */
                              13873                 :                : tablesample_clause:
                              13874                 :                :             TABLESAMPLE func_name '(' expr_list ')' opt_repeatable_clause
                              13875                 :                :                 {
 3257 simon@2ndQuadrant.co    13876                 :            127 :                     RangeTableSample *n = makeNode(RangeTableSample);
                              13877                 :                : 
                              13878                 :                :                     /* n->relation will be filled in later */
                              13879                 :            127 :                     n->method = $2;
                              13880                 :            127 :                     n->args = $4;
                              13881                 :            127 :                     n->repeatable = $6;
 3186 tgl@sss.pgh.pa.us       13882                 :            127 :                     n->location = @2;
 3257 simon@2ndQuadrant.co    13883                 :            127 :                     $$ = (Node *) n;
                              13884                 :                :                 }
                              13885                 :                :         ;
                              13886                 :                : 
                              13887                 :                : opt_repeatable_clause:
                              13888                 :             54 :             REPEATABLE '(' a_expr ')'   { $$ = (Node *) $3; }
                              13889                 :             73 :             | /*EMPTY*/                 { $$ = NULL; }
                              13890                 :                :         ;
                              13891                 :                : 
                              13892                 :                : /*
                              13893                 :                :  * func_table represents a function invocation in a FROM list. It can be
                              13894                 :                :  * a plain function call, like "foo(...)", or a ROWS FROM expression with
                              13895                 :                :  * one or more function calls, "ROWS FROM (foo(...), bar(...))",
                              13896                 :                :  * optionally with WITH ORDINALITY attached.
                              13897                 :                :  * In the ROWS FROM syntax, a column definition list can be given for each
                              13898                 :                :  * function, for example:
                              13899                 :                :  *     ROWS FROM (foo() AS (foo_res_a text, foo_res_b text),
                              13900                 :                :  *                bar() AS (bar_res_a text, bar_res_b text))
                              13901                 :                :  * It's also possible to attach a column definition list to the RangeFunction
                              13902                 :                :  * as a whole, but that's handled by the table_ref production.
                              13903                 :                :  */
                              13904                 :                : func_table: func_expr_windowless opt_ordinality
                              13905                 :                :                 {
 3797 tgl@sss.pgh.pa.us       13906                 :          20799 :                     RangeFunction *n = makeNode(RangeFunction);
                              13907                 :                : 
                              13908                 :          20799 :                     n->lateral = false;
                              13909                 :          20799 :                     n->ordinality = $2;
 3778 noah@leadboat.com       13910                 :          20799 :                     n->is_rowsfrom = false;
 3797 tgl@sss.pgh.pa.us       13911                 :          20799 :                     n->functions = list_make1(list_make2($1, NIL));
                              13912                 :                :                     /* alias and coldeflist are set by table_ref production */
                              13913                 :          20799 :                     $$ = (Node *) n;
                              13914                 :                :                 }
                              13915                 :                :             | ROWS FROM '(' rowsfrom_list ')' opt_ordinality
                              13916                 :                :                 {
                              13917                 :             66 :                     RangeFunction *n = makeNode(RangeFunction);
                              13918                 :                : 
                              13919                 :             66 :                     n->lateral = false;
 3778 noah@leadboat.com       13920                 :             66 :                     n->ordinality = $6;
                              13921                 :             66 :                     n->is_rowsfrom = true;
                              13922                 :             66 :                     n->functions = $4;
                              13923                 :                :                     /* alias and coldeflist are set by table_ref production */
 3797 tgl@sss.pgh.pa.us       13924                 :             66 :                     $$ = (Node *) n;
                              13925                 :                :                 }
                              13926                 :                :         ;
                              13927                 :                : 
                              13928                 :                : rowsfrom_item: func_expr_windowless opt_col_def_list
                              13929                 :            159 :                 { $$ = list_make2($1, $2); }
                              13930                 :                :         ;
                              13931                 :                : 
                              13932                 :                : rowsfrom_list:
 3778 noah@leadboat.com       13933                 :             66 :             rowsfrom_item                       { $$ = list_make1($1); }
                              13934                 :             93 :             | rowsfrom_list ',' rowsfrom_item   { $$ = lappend($1, $3); }
                              13935                 :                :         ;
                              13936                 :                : 
 3797 tgl@sss.pgh.pa.us       13937                 :             27 : opt_col_def_list: AS '(' TableFuncElementList ')'   { $$ = $3; }
                              13938                 :            132 :             | /*EMPTY*/                             { $$ = NIL; }
                              13939                 :                :         ;
                              13940                 :                : 
 3337                         13941                 :            379 : opt_ordinality: WITH_LA ORDINALITY                  { $$ = true; }
 3797                         13942                 :          20486 :             | /*EMPTY*/                             { $$ = false; }
                              13943                 :                :         ;
                              13944                 :                : 
                              13945                 :                : 
                              13946                 :                : where_clause:
 7972 bruce@momjian.us        13947                 :          90921 :             WHERE a_expr                            { $$ = $2; }
 7971                         13948                 :         152301 :             | /*EMPTY*/                             { $$ = NULL; }
                              13949                 :                :         ;
                              13950                 :                : 
                              13951                 :                : /* variant for UPDATE and DELETE */
                              13952                 :                : where_or_current_clause:
 6152 tgl@sss.pgh.pa.us       13953                 :           6454 :             WHERE a_expr                            { $$ = $2; }
                              13954                 :                :             | WHERE CURRENT_P OF cursor_name
                              13955                 :                :                 {
                              13956                 :            127 :                     CurrentOfExpr *n = makeNode(CurrentOfExpr);
                              13957                 :                : 
                              13958                 :                :                     /* cvarno is filled in by parse analysis */
                              13959                 :            127 :                     n->cursor_name = $4;
                              13960                 :            127 :                     n->cursor_param = 0;
                              13961                 :            127 :                     $$ = (Node *) n;
                              13962                 :                :                 }
                              13963                 :           2393 :             | /*EMPTY*/                             { $$ = NULL; }
                              13964                 :                :         ;
                              13965                 :                : 
                              13966                 :                : 
                              13967                 :                : OptTableFuncElementList:
 4949 peter_e@gmx.net         13968                 :            343 :             TableFuncElementList                { $$ = $1; }
                              13969                 :              3 :             | /*EMPTY*/                         { $$ = NIL; }
                              13970                 :                :         ;
                              13971                 :                : 
                              13972                 :                : TableFuncElementList:
                              13973                 :                :             TableFuncElement
                              13974                 :                :                 {
 7259 neilc@samurai.com       13975                 :            745 :                     $$ = list_make1($1);
                              13976                 :                :                 }
                              13977                 :                :             | TableFuncElementList ',' TableFuncElement
                              13978                 :                :                 {
 7899 tgl@sss.pgh.pa.us       13979                 :            987 :                     $$ = lappend($1, $3);
                              13980                 :                :                 }
                              13981                 :                :         ;
                              13982                 :                : 
                              13983                 :                : TableFuncElement:   ColId Typename opt_collate_clause
                              13984                 :                :                 {
 7924 bruce@momjian.us        13985                 :           1764 :                     ColumnDef *n = makeNode(ColumnDef);
                              13986                 :                : 
                              13987                 :           1764 :                     n->colname = $1;
 5386 peter_e@gmx.net         13988                 :           1764 :                     n->typeName = $2;
 4785 tgl@sss.pgh.pa.us       13989                 :           1764 :                     n->inhcount = 0;
 7875                         13990                 :           1764 :                     n->is_local = true;
 4785                         13991                 :           1764 :                     n->is_not_null = false;
                              13992                 :           1764 :                     n->is_from_type = false;
   54 peter@eisentraut.org    13993                 :           1764 :                     n->storage = 0;
 4785 tgl@sss.pgh.pa.us       13994                 :           1764 :                     n->raw_default = NULL;
                              13995                 :           1764 :                     n->cooked_default = NULL;
                              13996                 :           1764 :                     n->collClause = (CollateClause *) $3;
                              13997                 :           1764 :                     n->collOid = InvalidOid;
                              13998                 :           1764 :                     n->constraints = NIL;
 3797                         13999                 :           1764 :                     n->location = @1;
  702 peter@eisentraut.org    14000                 :           1764 :                     $$ = (Node *) n;
                              14001                 :                :                 }
                              14002                 :                :         ;
                              14003                 :                : 
                              14004                 :                : /*
                              14005                 :                :  * XMLTABLE
                              14006                 :                :  */
                              14007                 :                : xmltable:
                              14008                 :                :             XMLTABLE '(' c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
                              14009                 :                :                 {
 2594 alvherre@alvh.no-ip.    14010                 :            100 :                     RangeTableFunc *n = makeNode(RangeTableFunc);
                              14011                 :                : 
                              14012                 :            100 :                     n->rowexpr = $3;
                              14013                 :            100 :                     n->docexpr = $4;
                              14014                 :            100 :                     n->columns = $6;
                              14015                 :            100 :                     n->namespaces = NIL;
                              14016                 :            100 :                     n->location = @1;
  702 peter@eisentraut.org    14017                 :            100 :                     $$ = (Node *) n;
                              14018                 :                :                 }
                              14019                 :                :             | XMLTABLE '(' XMLNAMESPACES '(' xml_namespace_list ')' ','
                              14020                 :                :                 c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
                              14021                 :                :                 {
 2594 alvherre@alvh.no-ip.    14022                 :             10 :                     RangeTableFunc *n = makeNode(RangeTableFunc);
                              14023                 :                : 
                              14024                 :             10 :                     n->rowexpr = $8;
                              14025                 :             10 :                     n->docexpr = $9;
                              14026                 :             10 :                     n->columns = $11;
                              14027                 :             10 :                     n->namespaces = $5;
                              14028                 :             10 :                     n->location = @1;
  702 peter@eisentraut.org    14029                 :             10 :                     $$ = (Node *) n;
                              14030                 :                :                 }
                              14031                 :                :         ;
                              14032                 :                : 
 2594 alvherre@alvh.no-ip.    14033                 :            110 : xmltable_column_list: xmltable_column_el                    { $$ = list_make1($1); }
                              14034                 :            265 :             | xmltable_column_list ',' xmltable_column_el   { $$ = lappend($1, $3); }
                              14035                 :                :         ;
                              14036                 :                : 
                              14037                 :                : xmltable_column_el:
                              14038                 :                :             ColId Typename
                              14039                 :                :                 {
  702 peter@eisentraut.org    14040                 :             99 :                     RangeTableFuncCol *fc = makeNode(RangeTableFuncCol);
                              14041                 :                : 
 2594 alvherre@alvh.no-ip.    14042                 :             99 :                     fc->colname = $1;
                              14043                 :             99 :                     fc->for_ordinality = false;
                              14044                 :             99 :                     fc->typeName = $2;
                              14045                 :             99 :                     fc->is_not_null = false;
                              14046                 :             99 :                     fc->colexpr = NULL;
                              14047                 :             99 :                     fc->coldefexpr = NULL;
                              14048                 :             99 :                     fc->location = @1;
                              14049                 :                : 
                              14050                 :             99 :                     $$ = (Node *) fc;
                              14051                 :                :                 }
                              14052                 :                :             | ColId Typename xmltable_column_option_list
                              14053                 :                :                 {
  702 peter@eisentraut.org    14054                 :            245 :                     RangeTableFuncCol *fc = makeNode(RangeTableFuncCol);
                              14055                 :                :                     ListCell   *option;
                              14056                 :            245 :                     bool        nullability_seen = false;
                              14057                 :                : 
 2594 alvherre@alvh.no-ip.    14058                 :            245 :                     fc->colname = $1;
                              14059                 :            245 :                     fc->typeName = $2;
                              14060                 :            245 :                     fc->for_ordinality = false;
                              14061                 :            245 :                     fc->is_not_null = false;
                              14062                 :            245 :                     fc->colexpr = NULL;
                              14063                 :            245 :                     fc->coldefexpr = NULL;
                              14064                 :            245 :                     fc->location = @1;
                              14065                 :                : 
                              14066   [ +  -  +  +  :            546 :                     foreach(option, $3)
                                              +  + ]
                              14067                 :                :                     {
                              14068                 :            301 :                         DefElem   *defel = (DefElem *) lfirst(option);
                              14069                 :                : 
                              14070         [ +  + ]:            301 :                         if (strcmp(defel->defname, "default") == 0)
                              14071                 :                :                         {
                              14072         [ -  + ]:             28 :                             if (fc->coldefexpr != NULL)
 2594 alvherre@alvh.no-ip.    14073         [ #  # ]:UBC           0 :                                 ereport(ERROR,
                              14074                 :                :                                         (errcode(ERRCODE_SYNTAX_ERROR),
                              14075                 :                :                                          errmsg("only one DEFAULT value is allowed"),
                              14076                 :                :                                          parser_errposition(defel->location)));
 2594 alvherre@alvh.no-ip.    14077                 :CBC          28 :                             fc->coldefexpr = defel->arg;
                              14078                 :                :                         }
                              14079         [ +  + ]:            273 :                         else if (strcmp(defel->defname, "path") == 0)
                              14080                 :                :                         {
                              14081         [ -  + ]:            245 :                             if (fc->colexpr != NULL)
 2594 alvherre@alvh.no-ip.    14082         [ #  # ]:UBC           0 :                                 ereport(ERROR,
                              14083                 :                :                                         (errcode(ERRCODE_SYNTAX_ERROR),
                              14084                 :                :                                          errmsg("only one PATH value per column is allowed"),
                              14085                 :                :                                          parser_errposition(defel->location)));
 2594 alvherre@alvh.no-ip.    14086                 :CBC         245 :                             fc->colexpr = defel->arg;
                              14087                 :                :                         }
                              14088         [ +  - ]:             28 :                         else if (strcmp(defel->defname, "is_not_null") == 0)
                              14089                 :                :                         {
                              14090         [ -  + ]:             28 :                             if (nullability_seen)
 2594 alvherre@alvh.no-ip.    14091         [ #  # ]:UBC           0 :                                 ereport(ERROR,
                              14092                 :                :                                         (errcode(ERRCODE_SYNTAX_ERROR),
                              14093                 :                :                                          errmsg("conflicting or redundant NULL / NOT NULL declarations for column \"%s\"", fc->colname),
                              14094                 :                :                                          parser_errposition(defel->location)));
  821 peter@eisentraut.org    14095                 :CBC          28 :                             fc->is_not_null = boolVal(defel->arg);
 2594 alvherre@alvh.no-ip.    14096                 :             28 :                             nullability_seen = true;
                              14097                 :                :                         }
                              14098                 :                :                         else
                              14099                 :                :                         {
 2594 alvherre@alvh.no-ip.    14100         [ #  # ]:UBC           0 :                             ereport(ERROR,
                              14101                 :                :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              14102                 :                :                                      errmsg("unrecognized column option \"%s\"",
                              14103                 :                :                                             defel->defname),
                              14104                 :                :                                      parser_errposition(defel->location)));
                              14105                 :                :                         }
                              14106                 :                :                     }
 2594 alvherre@alvh.no-ip.    14107                 :CBC         245 :                     $$ = (Node *) fc;
                              14108                 :                :                 }
                              14109                 :                :             | ColId FOR ORDINALITY
                              14110                 :                :                 {
  702 peter@eisentraut.org    14111                 :             31 :                     RangeTableFuncCol *fc = makeNode(RangeTableFuncCol);
                              14112                 :                : 
 2594 alvherre@alvh.no-ip.    14113                 :             31 :                     fc->colname = $1;
                              14114                 :             31 :                     fc->for_ordinality = true;
                              14115                 :                :                     /* other fields are ignored, initialized by makeNode */
                              14116                 :             31 :                     fc->location = @1;
                              14117                 :                : 
                              14118                 :             31 :                     $$ = (Node *) fc;
                              14119                 :                :                 }
                              14120                 :                :         ;
                              14121                 :                : 
                              14122                 :                : xmltable_column_option_list:
                              14123                 :                :             xmltable_column_option_el
                              14124                 :            245 :                 { $$ = list_make1($1); }
                              14125                 :                :             | xmltable_column_option_list xmltable_column_option_el
                              14126                 :             56 :                 { $$ = lappend($1, $2); }
                              14127                 :                :         ;
                              14128                 :                : 
                              14129                 :                : xmltable_column_option_el:
                              14130                 :                :             IDENT b_expr
 2594 alvherre@alvh.no-ip.    14131                 :LBC       (245) :                 { $$ = makeDefElem($1, $2, @1); }
                              14132                 :                :             | DEFAULT b_expr
 2594 alvherre@alvh.no-ip.    14133                 :CBC          28 :                 { $$ = makeDefElem("default", $2, @1); }
                              14134                 :                :             | NOT NULL_P
  821 peter@eisentraut.org    14135                 :             28 :                 { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(true), @1); }
                              14136                 :                :             | NULL_P
  821 peter@eisentraut.org    14137                 :UBC           0 :                 { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(false), @1); }
                              14138                 :                :             | PATH b_expr
   10 amitlan@postgresql.o    14139                 :GNC         245 :                 { $$ = makeDefElem("path", $2, @1); }
                              14140                 :                :         ;
                              14141                 :                : 
                              14142                 :                : xml_namespace_list:
                              14143                 :                :             xml_namespace_el
 2594 alvherre@alvh.no-ip.    14144                 :CBC          10 :                 { $$ = list_make1($1); }
                              14145                 :                :             | xml_namespace_list ',' xml_namespace_el
 2594 alvherre@alvh.no-ip.    14146                 :UBC           0 :                 { $$ = lappend($1, $3); }
                              14147                 :                :         ;
                              14148                 :                : 
                              14149                 :                : xml_namespace_el:
                              14150                 :                :             b_expr AS ColLabel
                              14151                 :                :                 {
 2594 alvherre@alvh.no-ip.    14152                 :CBC           7 :                     $$ = makeNode(ResTarget);
                              14153                 :              7 :                     $$->name = $3;
                              14154                 :              7 :                     $$->indirection = NIL;
                              14155                 :              7 :                     $$->val = $1;
                              14156                 :              7 :                     $$->location = @1;
                              14157                 :                :                 }
                              14158                 :                :             | DEFAULT b_expr
                              14159                 :                :                 {
                              14160                 :              3 :                     $$ = makeNode(ResTarget);
                              14161                 :              3 :                     $$->name = NULL;
                              14162                 :              3 :                     $$->indirection = NIL;
                              14163                 :              3 :                     $$->val = $2;
                              14164                 :              3 :                     $$->location = @1;
                              14165                 :                :                 }
                              14166                 :                :         ;
                              14167                 :                : 
                              14168                 :                : json_table:
                              14169                 :                :             JSON_TABLE '('
                              14170                 :                :                 json_value_expr ',' a_expr json_table_path_name_opt
                              14171                 :                :                 json_passing_clause_opt
                              14172                 :                :                 COLUMNS '(' json_table_column_definition_list ')'
                              14173                 :                :                 json_on_error_clause_opt
                              14174                 :                :             ')'
                              14175                 :                :                 {
   10 amitlan@postgresql.o    14176                 :GNC         197 :                     JsonTable *n = makeNode(JsonTable);
                              14177                 :                :                     char      *pathstring;
                              14178                 :                : 
                              14179                 :            197 :                     n->context_item = (JsonValueExpr *) $3;
                              14180         [ +  + ]:            197 :                     if (!IsA($5, A_Const) ||
                              14181         [ -  + ]:            194 :                         castNode(A_Const, $5)->val.node.type != T_String)
                              14182         [ +  - ]:              3 :                         ereport(ERROR,
                              14183                 :                :                                 errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              14184                 :                :                                 errmsg("only string constants are supported in JSON_TABLE path specification"),
                              14185                 :                :                                 parser_errposition(@5));
                              14186                 :            194 :                     pathstring = castNode(A_Const, $5)->val.sval.sval;
                              14187                 :            194 :                     n->pathspec = makeJsonTablePathSpec(pathstring, $6, @5, @6);
                              14188                 :            194 :                     n->passing = $7;
                              14189                 :            194 :                     n->columns = $10;
                              14190                 :            194 :                     n->on_error = (JsonBehavior *) $12;
                              14191                 :            194 :                     n->location = @1;
                              14192                 :            194 :                     $$ = (Node *) n;
                              14193                 :                :                 }
                              14194                 :                :         ;
                              14195                 :                : 
                              14196                 :                : json_table_path_name_opt:
                              14197                 :             29 :             AS name         { $$ = $2; }
                              14198                 :            171 :             | /* empty */   { $$ = NULL; }
                              14199                 :                :         ;
                              14200                 :                : 
                              14201                 :                : json_table_column_definition_list:
                              14202                 :                :             json_table_column_definition
                              14203                 :            340 :                 { $$ = list_make1($1); }
                              14204                 :                :             | json_table_column_definition_list ',' json_table_column_definition
                              14205                 :            264 :                 { $$ = lappend($1, $3); }
                              14206                 :                :         ;
                              14207                 :                : 
                              14208                 :                : json_table_column_definition:
                              14209                 :                :             ColId FOR ORDINALITY
                              14210                 :                :                 {
                              14211                 :             42 :                     JsonTableColumn *n = makeNode(JsonTableColumn);
                              14212                 :                : 
                              14213                 :             42 :                     n->coltype = JTC_FOR_ORDINALITY;
                              14214                 :             42 :                     n->name = $1;
                              14215                 :             42 :                     n->location = @1;
                              14216                 :             42 :                     $$ = (Node *) n;
                              14217                 :                :                 }
                              14218                 :                :             | ColId Typename
                              14219                 :                :                 json_table_column_path_clause_opt
                              14220                 :                :                 json_wrapper_behavior
                              14221                 :                :                 json_quotes_clause_opt
                              14222                 :                :                 json_behavior_clause_opt
                              14223                 :                :                 {
                              14224                 :            323 :                     JsonTableColumn *n = makeNode(JsonTableColumn);
                              14225                 :                : 
                              14226                 :            323 :                     n->coltype = JTC_REGULAR;
                              14227                 :            323 :                     n->name = $1;
                              14228                 :            323 :                     n->typeName = $2;
                              14229                 :            323 :                     n->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
                              14230                 :            323 :                     n->pathspec = (JsonTablePathSpec *) $3;
                              14231                 :            323 :                     n->wrapper = $4;
                              14232                 :            323 :                     n->quotes = $5;
                              14233                 :            323 :                     n->on_empty = (JsonBehavior *) linitial($6);
                              14234                 :            323 :                     n->on_error = (JsonBehavior *) lsecond($6);
                              14235                 :            323 :                     n->location = @1;
                              14236                 :            323 :                     $$ = (Node *) n;
                              14237                 :                :                 }
                              14238                 :                :             | ColId Typename json_format_clause
                              14239                 :                :                 json_table_column_path_clause_opt
                              14240                 :                :                 json_wrapper_behavior
                              14241                 :                :                 json_quotes_clause_opt
                              14242                 :                :                 json_behavior_clause_opt
                              14243                 :                :                 {
                              14244                 :             54 :                     JsonTableColumn *n = makeNode(JsonTableColumn);
                              14245                 :                : 
                              14246                 :             54 :                     n->coltype = JTC_FORMATTED;
                              14247                 :             54 :                     n->name = $1;
                              14248                 :             54 :                     n->typeName = $2;
                              14249                 :             54 :                     n->format = (JsonFormat *) $3;
                              14250                 :             54 :                     n->pathspec = (JsonTablePathSpec *) $4;
                              14251                 :             54 :                     n->wrapper = $5;
                              14252                 :             54 :                     n->quotes = $6;
                              14253                 :             54 :                     n->on_empty = (JsonBehavior *) linitial($7);
                              14254                 :             54 :                     n->on_error = (JsonBehavior *) lsecond($7);
                              14255                 :             54 :                     n->location = @1;
                              14256                 :             54 :                     $$ = (Node *) n;
                              14257                 :                :                 }
                              14258                 :                :             | ColId Typename
                              14259                 :                :                 EXISTS json_table_column_path_clause_opt
                              14260                 :                :                 json_behavior_clause_opt
                              14261                 :                :                 {
                              14262                 :             42 :                     JsonTableColumn *n = makeNode(JsonTableColumn);
                              14263                 :                : 
                              14264                 :             42 :                     n->coltype = JTC_EXISTS;
                              14265                 :             42 :                     n->name = $1;
                              14266                 :             42 :                     n->typeName = $2;
                              14267                 :             42 :                     n->format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
                              14268                 :             42 :                     n->wrapper = JSW_NONE;
                              14269                 :             42 :                     n->quotes = JS_QUOTES_UNSPEC;
                              14270                 :             42 :                     n->pathspec = (JsonTablePathSpec *) $4;
                              14271                 :             42 :                     n->on_empty = (JsonBehavior *) linitial($5);
                              14272                 :             42 :                     n->on_error = (JsonBehavior *) lsecond($5);
                              14273                 :             42 :                     n->location = @1;
                              14274                 :             42 :                     $$ = (Node *) n;
                              14275                 :                :                 }
                              14276                 :                :             | NESTED path_opt Sconst
                              14277                 :                :                 COLUMNS '(' json_table_column_definition_list ')'
                              14278                 :                :                 {
    6                         14279                 :             72 :                     JsonTableColumn *n = makeNode(JsonTableColumn);
                              14280                 :                : 
                              14281                 :             72 :                     n->coltype = JTC_NESTED;
                              14282                 :            144 :                     n->pathspec = (JsonTablePathSpec *)
                              14283                 :             72 :                         makeJsonTablePathSpec($3, NULL, @3, -1);
                              14284                 :             72 :                     n->columns = $6;
                              14285                 :             72 :                     n->location = @1;
                              14286                 :             72 :                     $$ = (Node *) n;
                              14287                 :                :                 }
                              14288                 :                :             | NESTED path_opt Sconst AS name
                              14289                 :                :                 COLUMNS '(' json_table_column_definition_list ')'
                              14290                 :                :                 {
                              14291                 :             71 :                     JsonTableColumn *n = makeNode(JsonTableColumn);
                              14292                 :                : 
                              14293                 :             71 :                     n->coltype = JTC_NESTED;
                              14294                 :            142 :                     n->pathspec = (JsonTablePathSpec *)
                              14295                 :             71 :                         makeJsonTablePathSpec($3, $5, @3, @5);
                              14296                 :             71 :                     n->columns = $8;
                              14297                 :             71 :                     n->location = @1;
                              14298                 :             71 :                     $$ = (Node *) n;
                              14299                 :                :                 }
                              14300                 :                :         ;
                              14301                 :                : 
                              14302                 :                : path_opt:
                              14303                 :                :             PATH
                              14304                 :                :             | /* EMPTY */
                              14305                 :                :         ;
                              14306                 :                : 
                              14307                 :                : json_table_column_path_clause_opt:
                              14308                 :                :             PATH Sconst
   10                         14309                 :            360 :                 { $$ = (Node *) makeJsonTablePathSpec($2, NULL, @2, -1); }
                              14310                 :                :             | /* EMPTY */
                              14311                 :             59 :                 { $$ = NULL; }
                              14312                 :                :         ;
                              14313                 :                : 
                              14314                 :                : /*****************************************************************************
                              14315                 :                :  *
                              14316                 :                :  *  Type syntax
                              14317                 :                :  *      SQL introduces a large amount of type-specific syntax.
                              14318                 :                :  *      Define individual clauses to handle these cases, and use
                              14319                 :                :  *       the generic case to handle regular type-extensible Postgres syntax.
                              14320                 :                :  *      - thomas 1997-10-10
                              14321                 :                :  *
                              14322                 :                :  *****************************************************************************/
                              14323                 :                : 
                              14324                 :                : Typename:   SimpleTypename opt_array_bounds
                              14325                 :                :                 {
 9668 lockhart@fourpalms.o    14326                 :CBC      205565 :                     $$ = $1;
                              14327                 :         205565 :                     $$->arrayBounds = $2;
                              14328                 :                :                 }
                              14329                 :                :             | SETOF SimpleTypename opt_array_bounds
                              14330                 :                :                 {
                              14331                 :            949 :                     $$ = $2;
 7739 tgl@sss.pgh.pa.us       14332                 :            949 :                     $$->arrayBounds = $3;
 2433 peter_e@gmx.net         14333                 :            949 :                     $$->setof = true;
                              14334                 :                :                 }
                              14335                 :                :             /* SQL standard syntax, currently only one-dimensional */
                              14336                 :                :             | SimpleTypename ARRAY '[' Iconst ']'
                              14337                 :                :                 {
 7677 tgl@sss.pgh.pa.us       14338                 :              3 :                     $$ = $1;
 7259 neilc@samurai.com       14339                 :              3 :                     $$->arrayBounds = list_make1(makeInteger($4));
                              14340                 :                :                 }
                              14341                 :                :             | SETOF SimpleTypename ARRAY '[' Iconst ']'
                              14342                 :                :                 {
 7677 tgl@sss.pgh.pa.us       14343                 :UBC           0 :                     $$ = $2;
 7259 neilc@samurai.com       14344                 :              0 :                     $$->arrayBounds = list_make1(makeInteger($5));
 2433 peter_e@gmx.net         14345                 :              0 :                     $$->setof = true;
                              14346                 :                :                 }
                              14347                 :                :             | SimpleTypename ARRAY
                              14348                 :                :                 {
 5646                         14349                 :              0 :                     $$ = $1;
                              14350                 :              0 :                     $$->arrayBounds = list_make1(makeInteger(-1));
                              14351                 :                :                 }
                              14352                 :                :             | SETOF SimpleTypename ARRAY
                              14353                 :                :                 {
                              14354                 :              0 :                     $$ = $2;
                              14355                 :              0 :                     $$->arrayBounds = list_make1(makeInteger(-1));
 2433                         14356                 :              0 :                     $$->setof = true;
                              14357                 :                :                 }
                              14358                 :                :         ;
                              14359                 :                : 
                              14360                 :                : opt_array_bounds:
                              14361                 :                :             opt_array_bounds '[' ']'
 7972 bruce@momjian.us        14362                 :CBC        5721 :                     {  $$ = lappend($1, makeInteger(-1)); }
                              14363                 :                :             | opt_array_bounds '[' Iconst ']'
                              14364                 :             26 :                     {  $$ = lappend($1, makeInteger($3)); }
                              14365                 :                :             | /*EMPTY*/
                              14366                 :         206514 :                     {  $$ = NIL; }
                              14367                 :                :         ;
                              14368                 :                : 
                              14369                 :                : SimpleTypename:
 7924 lockhart@fourpalms.o    14370                 :         165054 :             GenericType                             { $$ = $1; }
                              14371                 :          34645 :             | Numeric                               { $$ = $1; }
                              14372                 :            949 :             | Bit                                   { $$ = $1; }
                              14373                 :           1506 :             | Character                             { $$ = $1; }
                              14374                 :           2107 :             | ConstDatetime                         { $$ = $1; }
                              14375                 :                :             | ConstInterval opt_interval
                              14376                 :                :                 {
 8214                         14377                 :           1632 :                     $$ = $1;
 5694 tgl@sss.pgh.pa.us       14378                 :           1632 :                     $$->typmods = $2;
                              14379                 :                :                 }
                              14380                 :                :             | ConstInterval '(' Iconst ')'
                              14381                 :                :                 {
 8214 lockhart@fourpalms.o    14382                 :UBC           0 :                     $$ = $1;
 3466 bruce@momjian.us        14383                 :              0 :                     $$->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
                              14384                 :                :                                              makeIntConst($3, @3));
                              14385                 :                :                 }
  269 amitlan@postgresql.o    14386                 :GNC         814 :             | JsonType                              { $$ = $1; }
                              14387                 :                :         ;
                              14388                 :                : 
                              14389                 :                : /* We have a separate ConstTypename to allow defaulting fixed-length
                              14390                 :                :  * types such as CHAR() and BIT() to an unspecified length.
                              14391                 :                :  * SQL9x requires that these default to a length of one, but this
                              14392                 :                :  * makes no sense for constructs like CHAR 'hi' and BIT '0101',
                              14393                 :                :  * where there is an obvious better choice to make.
                              14394                 :                :  * Note that ConstInterval is not included here since it must
                              14395                 :                :  * be pushed up higher in the rules to accommodate the postfix
                              14396                 :                :  * options (e.g. INTERVAL '1' YEAR). Likewise, we have to handle
                              14397                 :                :  * the generic-type-name case in AexprConst to avoid premature
                              14398                 :                :  * reduce/reduce conflicts against function names.
                              14399                 :                :  */
                              14400                 :                : ConstTypename:
 6315 tgl@sss.pgh.pa.us       14401                 :CBC          39 :             Numeric                                 { $$ = $1; }
 7924 lockhart@fourpalms.o    14402                 :UBC           0 :             | ConstBit                              { $$ = $1; }
 7924 lockhart@fourpalms.o    14403                 :CBC          16 :             | ConstCharacter                        { $$ = $1; }
                              14404                 :           1267 :             | ConstDatetime                         { $$ = $1; }
  269 amitlan@postgresql.o    14405                 :GNC         132 :             | JsonType                              { $$ = $1; }
                              14406                 :                :         ;
                              14407                 :                : 
                              14408                 :                : /*
                              14409                 :                :  * GenericType covers all type names that don't have special syntax mandated
                              14410                 :                :  * by the standard, including qualified names.  We also allow type modifiers.
                              14411                 :                :  * To avoid parsing conflicts against function invocations, the modifiers
                              14412                 :                :  * have to be shown as expr_list here, but parse analysis will only accept
                              14413                 :                :  * constants for them.
                              14414                 :                :  */
                              14415                 :                : GenericType:
                              14416                 :                :             type_function_name opt_type_modifiers
                              14417                 :                :                 {
 8017 tgl@sss.pgh.pa.us       14418                 :CBC      122065 :                     $$ = makeTypeName($1);
 6315                         14419                 :         122065 :                     $$->typmods = $2;
                              14420                 :         122065 :                     $$->location = @1;
                              14421                 :                :                 }
                              14422                 :                :             | type_function_name attrs opt_type_modifiers
                              14423                 :                :                 {
                              14424                 :          42989 :                     $$ = makeTypeNameFromNameList(lcons(makeString($1), $2));
                              14425                 :          42989 :                     $$->typmods = $3;
 6606                         14426                 :          42989 :                     $$->location = @1;
                              14427                 :                :                 }
                              14428                 :                :         ;
                              14429                 :                : 
 6315                         14430                 :            666 : opt_type_modifiers: '(' expr_list ')'               { $$ = $2; }
                              14431                 :         167251 :                     | /* EMPTY */                   { $$ = NIL; }
                              14432                 :                :         ;
                              14433                 :                : 
                              14434                 :                : /*
                              14435                 :                :  * SQL numeric data types
                              14436                 :                :  */
                              14437                 :                : Numeric:    INT_P
                              14438                 :                :                 {
 8017                         14439                 :          17283 :                     $$ = SystemTypeName("int4");
 6315                         14440                 :          17283 :                     $$->location = @1;
                              14441                 :                :                 }
                              14442                 :                :             | INTEGER
                              14443                 :                :                 {
 8017                         14444                 :           6459 :                     $$ = SystemTypeName("int4");
 6315                         14445                 :           6459 :                     $$->location = @1;
                              14446                 :                :                 }
                              14447                 :                :             | SMALLINT
                              14448                 :                :                 {
 8017                         14449                 :            561 :                     $$ = SystemTypeName("int2");
 6315                         14450                 :            561 :                     $$->location = @1;
                              14451                 :                :                 }
                              14452                 :                :             | BIGINT
                              14453                 :                :                 {
 8017                         14454                 :           2062 :                     $$ = SystemTypeName("int8");
 6315                         14455                 :           2062 :                     $$->location = @1;
                              14456                 :                :                 }
                              14457                 :                :             | REAL
                              14458                 :                :                 {
 8017                         14459                 :            184 :                     $$ = SystemTypeName("float4");
 6315                         14460                 :            184 :                     $$->location = @1;
                              14461                 :                :                 }
                              14462                 :                :             | FLOAT_P opt_float
                              14463                 :                :                 {
 8017                         14464                 :            239 :                     $$ = $2;
 6315                         14465                 :            239 :                     $$->location = @1;
                              14466                 :                :                 }
                              14467                 :                :             | DOUBLE_P PRECISION
                              14468                 :                :                 {
 8017                         14469                 :            239 :                     $$ = SystemTypeName("float8");
 6315                         14470                 :            239 :                     $$->location = @1;
                              14471                 :                :                 }
                              14472                 :                :             | DECIMAL_P opt_type_modifiers
                              14473                 :                :                 {
 8017                         14474                 :             16 :                     $$ = SystemTypeName("numeric");
 6315                         14475                 :             16 :                     $$->typmods = $2;
                              14476                 :             16 :                     $$->location = @1;
                              14477                 :                :                 }
                              14478                 :                :             | DEC opt_type_modifiers
                              14479                 :                :                 {
 8017 tgl@sss.pgh.pa.us       14480                 :UBC           0 :                     $$ = SystemTypeName("numeric");
 6315                         14481                 :              0 :                     $$->typmods = $2;
                              14482                 :              0 :                     $$->location = @1;
                              14483                 :                :                 }
                              14484                 :                :             | NUMERIC opt_type_modifiers
                              14485                 :                :                 {
 8017 tgl@sss.pgh.pa.us       14486                 :CBC        2847 :                     $$ = SystemTypeName("numeric");
 6315                         14487                 :           2847 :                     $$->typmods = $2;
                              14488                 :           2847 :                     $$->location = @1;
                              14489                 :                :                 }
                              14490                 :                :             | BOOLEAN_P
                              14491                 :                :                 {
 8017                         14492                 :           4794 :                     $$ = SystemTypeName("bool");
 6315                         14493                 :           4794 :                     $$->location = @1;
                              14494                 :                :                 }
                              14495                 :                :         ;
                              14496                 :                : 
                              14497                 :                : opt_float:  '(' Iconst ')'
                              14498                 :                :                 {
                              14499                 :                :                     /*
                              14500                 :                :                      * Check FLOAT() precision limits assuming IEEE floating
                              14501                 :                :                      * types - thomas 1997-09-18
                              14502                 :                :                      */
 9668 lockhart@fourpalms.o    14503         [ -  + ]:              1 :                     if ($2 < 1)
 7575 tgl@sss.pgh.pa.us       14504         [ #  # ]:UBC           0 :                         ereport(ERROR,
                              14505                 :                :                                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                              14506                 :                :                                  errmsg("precision for type float must be at least 1 bit"),
                              14507                 :                :                                  parser_errposition(@2)));
 7607 tgl@sss.pgh.pa.us       14508         [ +  - ]:CBC           1 :                     else if ($2 <= 24)
 8017                         14509                 :              1 :                         $$ = SystemTypeName("float4");
 7607 tgl@sss.pgh.pa.us       14510         [ #  # ]:UBC           0 :                     else if ($2 <= 53)
 8017                         14511                 :              0 :                         $$ = SystemTypeName("float8");
                              14512                 :                :                     else
 7575                         14513         [ #  # ]:              0 :                         ereport(ERROR,
                              14514                 :                :                                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                              14515                 :                :                                  errmsg("precision for type float must be less than 54 bits"),
                              14516                 :                :                                  parser_errposition(@2)));
                              14517                 :                :                 }
                              14518                 :                :             | /*EMPTY*/
                              14519                 :                :                 {
 8017 tgl@sss.pgh.pa.us       14520                 :CBC         238 :                     $$ = SystemTypeName("float8");
                              14521                 :                :                 }
                              14522                 :                :         ;
                              14523                 :                : 
                              14524                 :                : /*
                              14525                 :                :  * SQL bit-field data types
                              14526                 :                :  * The following implements BIT() and BIT VARYING().
                              14527                 :                :  */
                              14528                 :                : Bit:        BitWithLength
                              14529                 :                :                 {
 7924 lockhart@fourpalms.o    14530                 :            856 :                     $$ = $1;
                              14531                 :                :                 }
                              14532                 :                :             | BitWithoutLength
                              14533                 :                :                 {
                              14534                 :             93 :                     $$ = $1;
                              14535                 :                :                 }
                              14536                 :                :         ;
                              14537                 :                : 
                              14538                 :                : /* ConstBit is like Bit except "BIT" defaults to unspecified length */
                              14539                 :                : /* See notes for ConstCharacter, which addresses same issue for "CHAR" */
                              14540                 :                : ConstBit:   BitWithLength
                              14541                 :                :                 {
 7924 lockhart@fourpalms.o    14542                 :UBC           0 :                     $$ = $1;
                              14543                 :                :                 }
                              14544                 :                :             | BitWithoutLength
                              14545                 :                :                 {
                              14546                 :              0 :                     $$ = $1;
 6315 tgl@sss.pgh.pa.us       14547                 :              0 :                     $$->typmods = NIL;
                              14548                 :                :                 }
                              14549                 :                :         ;
                              14550                 :                : 
                              14551                 :                : BitWithLength:
                              14552                 :                :             BIT opt_varying '(' expr_list ')'
                              14553                 :                :                 {
                              14554                 :                :                     char *typname;
                              14555                 :                : 
 8017 tgl@sss.pgh.pa.us       14556         [ +  + ]:CBC         856 :                     typname = $2 ? "varbit" : "bit";
                              14557                 :            856 :                     $$ = SystemTypeName(typname);
 6315                         14558                 :            856 :                     $$->typmods = $4;
                              14559                 :            856 :                     $$->location = @1;
                              14560                 :                :                 }
                              14561                 :                :         ;
                              14562                 :                : 
                              14563                 :                : BitWithoutLength:
                              14564                 :                :             BIT opt_varying
                              14565                 :                :                 {
                              14566                 :                :                     /* bit defaults to bit(1), varbit to no limit */
 8017                         14567         [ +  + ]:             93 :                     if ($2)
                              14568                 :                :                     {
                              14569                 :             10 :                         $$ = SystemTypeName("varbit");
                              14570                 :                :                     }
                              14571                 :                :                     else
                              14572                 :                :                     {
                              14573                 :             83 :                         $$ = SystemTypeName("bit");
 5708                         14574                 :             83 :                         $$->typmods = list_make1(makeIntConst(1, -1));
                              14575                 :                :                     }
 6315                         14576                 :             93 :                     $$->location = @1;
                              14577                 :                :                 }
                              14578                 :                :         ;
                              14579                 :                : 
                              14580                 :                : 
                              14581                 :                : /*
                              14582                 :                :  * SQL character data types
                              14583                 :                :  * The following implements CHAR() and VARCHAR().
                              14584                 :                :  */
                              14585                 :                : Character:  CharacterWithLength
                              14586                 :                :                 {
 7924 lockhart@fourpalms.o    14587                 :            913 :                     $$ = $1;
                              14588                 :                :                 }
                              14589                 :                :             | CharacterWithoutLength
                              14590                 :                :                 {
                              14591                 :            593 :                     $$ = $1;
                              14592                 :                :                 }
                              14593                 :                :         ;
                              14594                 :                : 
                              14595                 :                : ConstCharacter:  CharacterWithLength
                              14596                 :                :                 {
                              14597                 :              6 :                     $$ = $1;
                              14598                 :                :                 }
                              14599                 :                :             | CharacterWithoutLength
                              14600                 :                :                 {
                              14601                 :                :                     /* Length was not specified so allow to be unrestricted.
                              14602                 :                :                      * This handles problems with fixed-length (bpchar) strings
                              14603                 :                :                      * which in column definitions must default to a length
                              14604                 :                :                      * of one, but should not be constrained if the length
                              14605                 :                :                      * was not specified.
                              14606                 :                :                      */
                              14607                 :             10 :                     $$ = $1;
 6315 tgl@sss.pgh.pa.us       14608                 :             10 :                     $$->typmods = NIL;
                              14609                 :                :                 }
                              14610                 :                :         ;
                              14611                 :                : 
                              14612                 :                : CharacterWithLength:  character '(' Iconst ')'
                              14613                 :                :                 {
 8017                         14614                 :            919 :                     $$ = SystemTypeName($1);
 5708                         14615                 :            919 :                     $$->typmods = list_make1(makeIntConst($3, @3));
 6315                         14616                 :            919 :                     $$->location = @1;
                              14617                 :                :                 }
                              14618                 :                :         ;
                              14619                 :                : 
                              14620                 :                : CharacterWithoutLength:  character
                              14621                 :                :                 {
 8017                         14622                 :            603 :                     $$ = SystemTypeName($1);
                              14623                 :                :                     /* char defaults to char(1), varchar to no limit */
 8189                         14624         [ +  + ]:            603 :                     if (strcmp($1, "bpchar") == 0)
 5708                         14625                 :            125 :                         $$->typmods = list_make1(makeIntConst(1, -1));
 6315                         14626                 :            603 :                     $$->location = @1;
                              14627                 :                :                 }
                              14628                 :                :         ;
                              14629                 :                : 
                              14630                 :                : character:  CHARACTER opt_varying
 7972 bruce@momjian.us        14631         [ +  + ]:            247 :                                         { $$ = $2 ? "varchar": "bpchar"; }
                              14632                 :                :             | CHAR_P opt_varying
                              14633         [ -  + ]:            534 :                                         { $$ = $2 ? "varchar": "bpchar"; }
                              14634                 :                :             | VARCHAR
                              14635                 :            740 :                                         { $$ = "varchar"; }
                              14636                 :                :             | NATIONAL CHARACTER opt_varying
 7972 bruce@momjian.us        14637         [ #  # ]:UBC           0 :                                         { $$ = $3 ? "varchar": "bpchar"; }
                              14638                 :                :             | NATIONAL CHAR_P opt_varying
                              14639         [ #  # ]:              0 :                                         { $$ = $3 ? "varchar": "bpchar"; }
                              14640                 :                :             | NCHAR opt_varying
 7972 bruce@momjian.us        14641         [ -  + ]:CBC           1 :                                         { $$ = $2 ? "varchar": "bpchar"; }
                              14642                 :                :         ;
                              14643                 :                : 
                              14644                 :                : opt_varying:
 2433 peter_e@gmx.net         14645                 :            197 :             VARYING                                 { $$ = true; }
                              14646                 :           1534 :             | /*EMPTY*/                             { $$ = false; }
                              14647                 :                :         ;
                              14648                 :                : 
                              14649                 :                : /*
                              14650                 :                :  * SQL date/time types
                              14651                 :                :  */
                              14652                 :                : ConstDatetime:
                              14653                 :                :             TIMESTAMP '(' Iconst ')' opt_timezone
                              14654                 :                :                 {
 8229 lockhart@fourpalms.o    14655         [ +  + ]:             56 :                     if ($5)
 8017 tgl@sss.pgh.pa.us       14656                 :             44 :                         $$ = SystemTypeName("timestamptz");
                              14657                 :                :                     else
                              14658                 :             12 :                         $$ = SystemTypeName("timestamp");
 5708                         14659                 :             56 :                     $$->typmods = list_make1(makeIntConst($3, @3));
 6315                         14660                 :             56 :                     $$->location = @1;
                              14661                 :                :                 }
                              14662                 :                :             | TIMESTAMP opt_timezone
                              14663                 :                :                 {
 8234 lockhart@fourpalms.o    14664         [ +  + ]:           2281 :                     if ($2)
 8017 tgl@sss.pgh.pa.us       14665                 :            651 :                         $$ = SystemTypeName("timestamptz");
                              14666                 :                :                     else
                              14667                 :           1630 :                         $$ = SystemTypeName("timestamp");
 6315                         14668                 :           2281 :                     $$->location = @1;
                              14669                 :                :                 }
                              14670                 :                :             | TIME '(' Iconst ')' opt_timezone
                              14671                 :                :                 {
 8229 lockhart@fourpalms.o    14672         [ +  + ]:             11 :                     if ($5)
 8017 tgl@sss.pgh.pa.us       14673                 :              4 :                         $$ = SystemTypeName("timetz");
                              14674                 :                :                     else
                              14675                 :              7 :                         $$ = SystemTypeName("time");
 5708                         14676                 :             11 :                     $$->typmods = list_make1(makeIntConst($3, @3));
 6315                         14677                 :             11 :                     $$->location = @1;
                              14678                 :                :                 }
                              14679                 :                :             | TIME opt_timezone
                              14680                 :                :                 {
 8797 lockhart@fourpalms.o    14681         [ +  + ]:           1026 :                     if ($2)
 8017 tgl@sss.pgh.pa.us       14682                 :            133 :                         $$ = SystemTypeName("timetz");
                              14683                 :                :                     else
                              14684                 :            893 :                         $$ = SystemTypeName("time");
 6315                         14685                 :           1026 :                     $$->location = @1;
                              14686                 :                :                 }
                              14687                 :                :         ;
                              14688                 :                : 
                              14689                 :                : ConstInterval:
                              14690                 :                :             INTERVAL
                              14691                 :                :                 {
                              14692                 :           3254 :                     $$ = SystemTypeName("interval");
                              14693                 :           3254 :                     $$->location = @1;
                              14694                 :                :                 }
                              14695                 :                :         ;
                              14696                 :                : 
                              14697                 :                : opt_timezone:
 2433 peter_e@gmx.net         14698                 :            832 :             WITH_LA TIME ZONE                       { $$ = true; }
  376 alvherre@alvh.no-ip.    14699                 :            253 :             | WITHOUT_LA TIME ZONE                  { $$ = false; }
 2433 peter_e@gmx.net         14700                 :           2289 :             | /*EMPTY*/                             { $$ = false; }
                              14701                 :                :         ;
                              14702                 :                : 
                              14703                 :                : opt_interval:
                              14704                 :                :             YEAR_P
 5694 tgl@sss.pgh.pa.us       14705                 :              6 :                 { $$ = list_make1(makeIntConst(INTERVAL_MASK(YEAR), @1)); }
                              14706                 :                :             | MONTH_P
                              14707                 :              9 :                 { $$ = list_make1(makeIntConst(INTERVAL_MASK(MONTH), @1)); }
                              14708                 :                :             | DAY_P
                              14709                 :              9 :                 { $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY), @1)); }
                              14710                 :                :             | HOUR_P
                              14711                 :              6 :                 { $$ = list_make1(makeIntConst(INTERVAL_MASK(HOUR), @1)); }
                              14712                 :                :             | MINUTE_P
                              14713                 :              6 :                 { $$ = list_make1(makeIntConst(INTERVAL_MASK(MINUTE), @1)); }
                              14714                 :                :             | interval_second
                              14715                 :             18 :                 { $$ = $1; }
                              14716                 :                :             | YEAR_P TO MONTH_P
                              14717                 :                :                 {
                              14718                 :              9 :                     $$ = list_make1(makeIntConst(INTERVAL_MASK(YEAR) |
                              14719                 :                :                                                  INTERVAL_MASK(MONTH), @1));
                              14720                 :                :                 }
                              14721                 :                :             | DAY_P TO HOUR_P
                              14722                 :                :                 {
                              14723                 :             12 :                     $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY) |
                              14724                 :                :                                                  INTERVAL_MASK(HOUR), @1));
                              14725                 :                :                 }
                              14726                 :                :             | DAY_P TO MINUTE_P
                              14727                 :                :                 {
                              14728                 :             12 :                     $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY) |
                              14729                 :                :                                                  INTERVAL_MASK(HOUR) |
                              14730                 :                :                                                  INTERVAL_MASK(MINUTE), @1));
                              14731                 :                :                 }
                              14732                 :                :             | DAY_P TO interval_second
                              14733                 :                :                 {
                              14734                 :             24 :                     $$ = $3;
                              14735                 :             24 :                     linitial($$) = makeIntConst(INTERVAL_MASK(DAY) |
                              14736                 :                :                                                 INTERVAL_MASK(HOUR) |
                              14737                 :                :                                                 INTERVAL_MASK(MINUTE) |
                              14738                 :             24 :                                                 INTERVAL_MASK(SECOND), @1);
                              14739                 :                :                 }
                              14740                 :                :             | HOUR_P TO MINUTE_P
                              14741                 :                :                 {
                              14742                 :              9 :                     $$ = list_make1(makeIntConst(INTERVAL_MASK(HOUR) |
                              14743                 :                :                                                  INTERVAL_MASK(MINUTE), @1));
                              14744                 :                :                 }
                              14745                 :                :             | HOUR_P TO interval_second
                              14746                 :                :                 {
                              14747                 :             18 :                     $$ = $3;
                              14748                 :             18 :                     linitial($$) = makeIntConst(INTERVAL_MASK(HOUR) |
                              14749                 :                :                                                 INTERVAL_MASK(MINUTE) |
                              14750                 :             18 :                                                 INTERVAL_MASK(SECOND), @1);
                              14751                 :                :                 }
                              14752                 :                :             | MINUTE_P TO interval_second
                              14753                 :                :                 {
                              14754                 :             33 :                     $$ = $3;
                              14755                 :             33 :                     linitial($$) = makeIntConst(INTERVAL_MASK(MINUTE) |
                              14756                 :             33 :                                                 INTERVAL_MASK(SECOND), @1);
                              14757                 :                :                 }
                              14758                 :                :             | /*EMPTY*/
                              14759                 :           3077 :                 { $$ = NIL; }
                              14760                 :                :         ;
                              14761                 :                : 
                              14762                 :                : interval_second:
                              14763                 :                :             SECOND_P
                              14764                 :                :                 {
                              14765                 :             51 :                     $$ = list_make1(makeIntConst(INTERVAL_MASK(SECOND), @1));
                              14766                 :                :                 }
                              14767                 :                :             | SECOND_P '(' Iconst ')'
                              14768                 :                :                 {
                              14769                 :             42 :                     $$ = list_make2(makeIntConst(INTERVAL_MASK(SECOND), @1),
                              14770                 :                :                                     makeIntConst($3, @3));
                              14771                 :                :                 }
                              14772                 :                :         ;
                              14773                 :                : 
                              14774                 :                : JsonType:
                              14775                 :                :             JSON
                              14776                 :                :                 {
  269 amitlan@postgresql.o    14777                 :GNC         946 :                     $$ = SystemTypeName("json");
                              14778                 :            946 :                     $$->location = @1;
                              14779                 :                :                 }
                              14780                 :                :         ;
                              14781                 :                : 
                              14782                 :                : /*****************************************************************************
                              14783                 :                :  *
                              14784                 :                :  *  expression grammar
                              14785                 :                :  *
                              14786                 :                :  *****************************************************************************/
                              14787                 :                : 
                              14788                 :                : /*
                              14789                 :                :  * General expressions
                              14790                 :                :  * This is the heart of the expression syntax.
                              14791                 :                :  *
                              14792                 :                :  * We have two expression types: a_expr is the unrestricted kind, and
                              14793                 :                :  * b_expr is a subset that must be used in some places to avoid shift/reduce
                              14794                 :                :  * conflicts.  For example, we can't do BETWEEN as "BETWEEN a_expr AND a_expr"
                              14795                 :                :  * because that use of AND conflicts with AND as a boolean operator.  So,
                              14796                 :                :  * b_expr is used in BETWEEN and we remove boolean keywords from b_expr.
                              14797                 :                :  *
                              14798                 :                :  * Note that '(' a_expr ')' is a b_expr, so an unrestricted expression can
                              14799                 :                :  * always be used by surrounding it with parens.
                              14800                 :                :  *
                              14801                 :                :  * c_expr is all the productions that are common to a_expr and b_expr;
                              14802                 :                :  * it's factored out just to eliminate redundant coding.
                              14803                 :                :  *
                              14804                 :                :  * Be careful of productions involving more than one terminal token.
                              14805                 :                :  * By default, bison will assign such productions the precedence of their
                              14806                 :                :  * last terminal, but in nearly all cases you want it to be the precedence
                              14807                 :                :  * of the first terminal instead; otherwise you will not get the behavior
                              14808                 :                :  * you expect!  So we use %prec annotations freely to set precedences.
                              14809                 :                :  */
 7972 bruce@momjian.us        14810                 :CBC     1683613 : a_expr:     c_expr                                  { $$ = $1; }
                              14811                 :                :             | a_expr TYPECAST Typename
 5708 tgl@sss.pgh.pa.us       14812                 :          88029 :                     { $$ = makeTypeCast($1, $3, @2); }
                              14813                 :                :             | a_expr COLLATE any_name
                              14814                 :                :                 {
 4785                         14815                 :           3841 :                     CollateClause *n = makeNode(CollateClause);
                              14816                 :                : 
 4783                         14817                 :           3841 :                     n->arg = $1;
                              14818                 :           3841 :                     n->collname = $3;
 4785                         14819                 :           3841 :                     n->location = @2;
                              14820                 :           3841 :                     $$ = (Node *) n;
                              14821                 :                :                 }
                              14822                 :                :             | a_expr AT TIME ZONE a_expr            %prec AT
                              14823                 :                :                 {
 3940 rhaas@postgresql.org    14824                 :            198 :                     $$ = (Node *) makeFuncCall(SystemFuncName("timezone"),
                              14825                 :            198 :                                                list_make2($5, $1),
                              14826                 :                :                                                COERCE_SQL_SYNTAX,
                              14827                 :            198 :                                                @2);
                              14828                 :                :                 }
                              14829                 :                :             | a_expr AT LOCAL                       %prec AT
                              14830                 :                :                 {
  184 michael@paquier.xyz     14831                 :GNC          21 :                     $$ = (Node *) makeFuncCall(SystemFuncName("timezone"),
                              14832                 :             21 :                                                list_make1($1),
                              14833                 :                :                                                COERCE_SQL_SYNTAX,
                              14834                 :                :                                                -1);
                              14835                 :                :                 }
                              14836                 :                :         /*
                              14837                 :                :          * These operators must be called out explicitly in order to make use
                              14838                 :                :          * of bison's automatic operator-precedence handling.  All other
                              14839                 :                :          * operator names are handled by the generic productions using "Op",
                              14840                 :                :          * below; and all those operators will have the same precedence.
                              14841                 :                :          *
                              14842                 :                :          * If you add more explicitly-known operators, be sure to add them
                              14843                 :                :          * also to b_expr and to the MathOp list below.
                              14844                 :                :          */
                              14845                 :                :             | '+' a_expr                    %prec UMINUS
 6606 tgl@sss.pgh.pa.us       14846                 :CBC           6 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
                              14847                 :                :             | '-' a_expr                    %prec UMINUS
                              14848                 :          15289 :                 { $$ = doNegate($2, @1); }
                              14849                 :                :             | a_expr '+' a_expr
                              14850                 :           6461 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3, @2); }
                              14851                 :                :             | a_expr '-' a_expr
                              14852                 :           2989 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3, @2); }
                              14853                 :                :             | a_expr '*' a_expr
                              14854                 :           4259 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3, @2); }
                              14855                 :                :             | a_expr '/' a_expr
                              14856                 :           1905 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3, @2); }
                              14857                 :                :             | a_expr '%' a_expr
                              14858                 :           1301 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3, @2); }
                              14859                 :                :             | a_expr '^' a_expr
                              14860                 :            227 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3, @2); }
                              14861                 :                :             | a_expr '<' a_expr
                              14862                 :          12238 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3, @2); }
                              14863                 :                :             | a_expr '>' a_expr
                              14864                 :          17935 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3, @2); }
                              14865                 :                :             | a_expr '=' a_expr
                              14866                 :         173722 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3, @2); }
                              14867                 :                :             | a_expr LESS_EQUALS a_expr
 3322                         14868                 :           2492 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $3, @2); }
                              14869                 :                :             | a_expr GREATER_EQUALS a_expr
                              14870                 :           2443 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3, @2); }
                              14871                 :                :             | a_expr NOT_EQUALS a_expr
                              14872                 :          18877 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, $3, @2); }
                              14873                 :                : 
                              14874                 :                :             | a_expr qual_Op a_expr             %prec Op
 6606                         14875                 :          27051 :                 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
                              14876                 :                :             | qual_Op a_expr                    %prec Op
                              14877                 :             96 :                 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
                              14878                 :                : 
                              14879                 :                :             | a_expr AND a_expr
 3590                         14880                 :         102865 :                 { $$ = makeAndExpr($1, $3, @2); }
                              14881                 :                :             | a_expr OR a_expr
                              14882                 :           8024 :                 { $$ = makeOrExpr($1, $3, @2); }
                              14883                 :                :             | NOT a_expr
                              14884                 :           6887 :                 { $$ = makeNotExpr($2, @1); }
                              14885                 :                :             | NOT_LA a_expr                     %prec NOT
 3322 tgl@sss.pgh.pa.us       14886                 :UBC           0 :                 { $$ = makeNotExpr($2, @1); }
                              14887                 :                : 
                              14888                 :                :             | a_expr LIKE a_expr
                              14889                 :                :                 {
 3338 tgl@sss.pgh.pa.us       14890                 :CBC         896 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "~~",
                              14891                 :            896 :                                                    $1, $3, @2);
                              14892                 :                :                 }
                              14893                 :                :             | a_expr LIKE a_expr ESCAPE a_expr                  %prec LIKE
                              14894                 :                :                 {
  702 peter@eisentraut.org    14895                 :             48 :                     FuncCall   *n = makeFuncCall(SystemFuncName("like_escape"),
                              14896                 :             48 :                                                  list_make2($3, $5),
                              14897                 :                :                                                  COERCE_EXPLICIT_CALL,
                              14898                 :             48 :                                                  @2);
 3338 tgl@sss.pgh.pa.us       14899                 :             48 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "~~",
                              14900                 :             48 :                                                    $1, (Node *) n, @2);
                              14901                 :                :                 }
                              14902                 :                :             | a_expr NOT_LA LIKE a_expr                         %prec NOT_LA
                              14903                 :                :                 {
                              14904                 :            107 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "!~~",
                              14905                 :            107 :                                                    $1, $4, @2);
                              14906                 :                :                 }
                              14907                 :                :             | a_expr NOT_LA LIKE a_expr ESCAPE a_expr           %prec NOT_LA
                              14908                 :                :                 {
  702 peter@eisentraut.org    14909                 :             48 :                     FuncCall   *n = makeFuncCall(SystemFuncName("like_escape"),
                              14910                 :             48 :                                                  list_make2($4, $6),
                              14911                 :                :                                                  COERCE_EXPLICIT_CALL,
                              14912                 :             48 :                                                  @2);
 3338 tgl@sss.pgh.pa.us       14913                 :             48 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "!~~",
                              14914                 :             48 :                                                    $1, (Node *) n, @2);
                              14915                 :                :                 }
                              14916                 :                :             | a_expr ILIKE a_expr
                              14917                 :                :                 {
                              14918                 :             86 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "~~*",
                              14919                 :             86 :                                                    $1, $3, @2);
                              14920                 :                :                 }
                              14921                 :                :             | a_expr ILIKE a_expr ESCAPE a_expr                 %prec ILIKE
                              14922                 :                :                 {
  702 peter@eisentraut.org    14923                 :UBC           0 :                     FuncCall   *n = makeFuncCall(SystemFuncName("like_escape"),
                              14924                 :              0 :                                                  list_make2($3, $5),
                              14925                 :                :                                                  COERCE_EXPLICIT_CALL,
                              14926                 :              0 :                                                  @2);
 3338 tgl@sss.pgh.pa.us       14927                 :              0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "~~*",
                              14928                 :              0 :                                                    $1, (Node *) n, @2);
                              14929                 :                :                 }
                              14930                 :                :             | a_expr NOT_LA ILIKE a_expr                        %prec NOT_LA
                              14931                 :                :                 {
 3338 tgl@sss.pgh.pa.us       14932                 :CBC          15 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "!~~*",
                              14933                 :             15 :                                                    $1, $4, @2);
                              14934                 :                :                 }
                              14935                 :                :             | a_expr NOT_LA ILIKE a_expr ESCAPE a_expr          %prec NOT_LA
                              14936                 :                :                 {
  702 peter@eisentraut.org    14937                 :UBC           0 :                     FuncCall   *n = makeFuncCall(SystemFuncName("like_escape"),
                              14938                 :              0 :                                                  list_make2($4, $6),
                              14939                 :                :                                                  COERCE_EXPLICIT_CALL,
                              14940                 :              0 :                                                  @2);
 3338 tgl@sss.pgh.pa.us       14941                 :              0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "!~~*",
                              14942                 :              0 :                                                    $1, (Node *) n, @2);
                              14943                 :                :                 }
                              14944                 :                : 
                              14945                 :                :             | a_expr SIMILAR TO a_expr                          %prec SIMILAR
                              14946                 :                :                 {
  702 peter@eisentraut.org    14947                 :CBC          20 :                     FuncCall   *n = makeFuncCall(SystemFuncName("similar_to_escape"),
                              14948                 :             20 :                                                  list_make1($4),
                              14949                 :                :                                                  COERCE_EXPLICIT_CALL,
                              14950                 :             20 :                                                  @2);
 3338 tgl@sss.pgh.pa.us       14951                 :             20 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "~",
                              14952                 :             20 :                                                    $1, (Node *) n, @2);
                              14953                 :                :                 }
                              14954                 :                :             | a_expr SIMILAR TO a_expr ESCAPE a_expr            %prec SIMILAR
                              14955                 :                :                 {
  702 peter@eisentraut.org    14956                 :             15 :                     FuncCall   *n = makeFuncCall(SystemFuncName("similar_to_escape"),
                              14957                 :             15 :                                                  list_make2($4, $6),
                              14958                 :                :                                                  COERCE_EXPLICIT_CALL,
                              14959                 :             15 :                                                  @2);
 3338 tgl@sss.pgh.pa.us       14960                 :             15 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "~",
                              14961                 :             15 :                                                    $1, (Node *) n, @2);
                              14962                 :                :                 }
                              14963                 :                :             | a_expr NOT_LA SIMILAR TO a_expr                   %prec NOT_LA
                              14964                 :                :                 {
  702 peter@eisentraut.org    14965                 :UBC           0 :                     FuncCall   *n = makeFuncCall(SystemFuncName("similar_to_escape"),
                              14966                 :              0 :                                                  list_make1($5),
                              14967                 :                :                                                  COERCE_EXPLICIT_CALL,
                              14968                 :              0 :                                                  @2);
 3338 tgl@sss.pgh.pa.us       14969                 :              0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "!~",
                              14970                 :              0 :                                                    $1, (Node *) n, @2);
                              14971                 :                :                 }
                              14972                 :                :             | a_expr NOT_LA SIMILAR TO a_expr ESCAPE a_expr     %prec NOT_LA
                              14973                 :                :                 {
  702 peter@eisentraut.org    14974                 :              0 :                     FuncCall   *n = makeFuncCall(SystemFuncName("similar_to_escape"),
                              14975                 :              0 :                                                  list_make2($5, $7),
                              14976                 :                :                                                  COERCE_EXPLICIT_CALL,
                              14977                 :              0 :                                                  @2);
 3338 tgl@sss.pgh.pa.us       14978                 :              0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "!~",
                              14979                 :              0 :                                                    $1, (Node *) n, @2);
                              14980                 :                :                 }
                              14981                 :                : 
                              14982                 :                :             /* NullTest clause
                              14983                 :                :              * Define SQL-style Null test clause.
                              14984                 :                :              * Allow two forms described in the standard:
                              14985                 :                :              *  a IS NULL
                              14986                 :                :              *  a IS NOT NULL
                              14987                 :                :              * Allow two SQL extensions
                              14988                 :                :              *  a ISNULL
                              14989                 :                :              *  a NOTNULL
                              14990                 :                :              */
                              14991                 :                :             | a_expr IS NULL_P                          %prec IS
                              14992                 :                :                 {
  702 peter@eisentraut.org    14993                 :CBC        2408 :                     NullTest   *n = makeNode(NullTest);
                              14994                 :                : 
 6408 tgl@sss.pgh.pa.us       14995                 :           2408 :                     n->arg = (Expr *) $1;
                              14996                 :           2408 :                     n->nulltesttype = IS_NULL;
 3339                         14997                 :           2408 :                     n->location = @2;
  702 peter@eisentraut.org    14998                 :           2408 :                     $$ = (Node *) n;
                              14999                 :                :                 }
                              15000                 :                :             | a_expr ISNULL
                              15001                 :                :                 {
                              15002                 :             48 :                     NullTest   *n = makeNode(NullTest);
                              15003                 :                : 
 6408 tgl@sss.pgh.pa.us       15004                 :             48 :                     n->arg = (Expr *) $1;
                              15005                 :             48 :                     n->nulltesttype = IS_NULL;
 3339                         15006                 :             48 :                     n->location = @2;
  702 peter@eisentraut.org    15007                 :             48 :                     $$ = (Node *) n;
                              15008                 :                :                 }
                              15009                 :                :             | a_expr IS NOT NULL_P                      %prec IS
                              15010                 :                :                 {
                              15011                 :           5366 :                     NullTest   *n = makeNode(NullTest);
                              15012                 :                : 
 6408 tgl@sss.pgh.pa.us       15013                 :           5366 :                     n->arg = (Expr *) $1;
                              15014                 :           5366 :                     n->nulltesttype = IS_NOT_NULL;
 3339                         15015                 :           5366 :                     n->location = @2;
  702 peter@eisentraut.org    15016                 :           5366 :                     $$ = (Node *) n;
                              15017                 :                :                 }
                              15018                 :                :             | a_expr NOTNULL
                              15019                 :                :                 {
                              15020                 :              3 :                     NullTest   *n = makeNode(NullTest);
                              15021                 :                : 
 6408 tgl@sss.pgh.pa.us       15022                 :              3 :                     n->arg = (Expr *) $1;
                              15023                 :              3 :                     n->nulltesttype = IS_NOT_NULL;
 3339                         15024                 :              3 :                     n->location = @2;
  702 peter@eisentraut.org    15025                 :              3 :                     $$ = (Node *) n;
                              15026                 :                :                 }
                              15027                 :                :             | row OVERLAPS row
                              15028                 :                :                 {
 3708 tgl@sss.pgh.pa.us       15029         [ -  + ]:            384 :                     if (list_length($1) != 2)
 3708 tgl@sss.pgh.pa.us       15030         [ #  # ]:UBC           0 :                         ereport(ERROR,
                              15031                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                              15032                 :                :                                  errmsg("wrong number of parameters on left side of OVERLAPS expression"),
                              15033                 :                :                                  parser_errposition(@1)));
 3708 tgl@sss.pgh.pa.us       15034         [ -  + ]:CBC         384 :                     if (list_length($3) != 2)
 3708 tgl@sss.pgh.pa.us       15035         [ #  # ]:UBC           0 :                         ereport(ERROR,
                              15036                 :                :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                              15037                 :                :                                  errmsg("wrong number of parameters on right side of OVERLAPS expression"),
                              15038                 :                :                                  parser_errposition(@3)));
 3708 tgl@sss.pgh.pa.us       15039                 :CBC         384 :                     $$ = (Node *) makeFuncCall(SystemFuncName("overlaps"),
                              15040                 :            384 :                                                list_concat($1, $3),
                              15041                 :                :                                                COERCE_SQL_SYNTAX,
                              15042                 :            384 :                                                @2);
                              15043                 :                :                 }
                              15044                 :                :             | a_expr IS TRUE_P                          %prec IS
                              15045                 :                :                 {
 8335                         15046                 :            188 :                     BooleanTest *b = makeNode(BooleanTest);
                              15047                 :                : 
 7794                         15048                 :            188 :                     b->arg = (Expr *) $1;
 8335                         15049                 :            188 :                     b->booltesttype = IS_TRUE;
 3339                         15050                 :            188 :                     b->location = @2;
  702 peter@eisentraut.org    15051                 :            188 :                     $$ = (Node *) b;
                              15052                 :                :                 }
                              15053                 :                :             | a_expr IS NOT TRUE_P                      %prec IS
                              15054                 :                :                 {
 8335 tgl@sss.pgh.pa.us       15055                 :             69 :                     BooleanTest *b = makeNode(BooleanTest);
                              15056                 :                : 
 7794                         15057                 :             69 :                     b->arg = (Expr *) $1;
 8335                         15058                 :             69 :                     b->booltesttype = IS_NOT_TRUE;
 3339                         15059                 :             69 :                     b->location = @2;
  702 peter@eisentraut.org    15060                 :             69 :                     $$ = (Node *) b;
                              15061                 :                :                 }
                              15062                 :                :             | a_expr IS FALSE_P                         %prec IS
                              15063                 :                :                 {
 8335 tgl@sss.pgh.pa.us       15064                 :             57 :                     BooleanTest *b = makeNode(BooleanTest);
                              15065                 :                : 
 7794                         15066                 :             57 :                     b->arg = (Expr *) $1;
 8335                         15067                 :             57 :                     b->booltesttype = IS_FALSE;
 3339                         15068                 :             57 :                     b->location = @2;
  702 peter@eisentraut.org    15069                 :             57 :                     $$ = (Node *) b;
                              15070                 :                :                 }
                              15071                 :                :             | a_expr IS NOT FALSE_P                     %prec IS
                              15072                 :                :                 {
 8335 tgl@sss.pgh.pa.us       15073                 :             45 :                     BooleanTest *b = makeNode(BooleanTest);
                              15074                 :                : 
 7794                         15075                 :             45 :                     b->arg = (Expr *) $1;
 8335                         15076                 :             45 :                     b->booltesttype = IS_NOT_FALSE;
 3339                         15077                 :             45 :                     b->location = @2;
  702 peter@eisentraut.org    15078                 :             45 :                     $$ = (Node *) b;
                              15079                 :                :                 }
                              15080                 :                :             | a_expr IS UNKNOWN                         %prec IS
                              15081                 :                :                 {
 8335 tgl@sss.pgh.pa.us       15082                 :             26 :                     BooleanTest *b = makeNode(BooleanTest);
                              15083                 :                : 
 7794                         15084                 :             26 :                     b->arg = (Expr *) $1;
 8335                         15085                 :             26 :                     b->booltesttype = IS_UNKNOWN;
 3339                         15086                 :             26 :                     b->location = @2;
  702 peter@eisentraut.org    15087                 :             26 :                     $$ = (Node *) b;
                              15088                 :                :                 }
                              15089                 :                :             | a_expr IS NOT UNKNOWN                     %prec IS
                              15090                 :                :                 {
 8335 tgl@sss.pgh.pa.us       15091                 :             24 :                     BooleanTest *b = makeNode(BooleanTest);
                              15092                 :                : 
 7794                         15093                 :             24 :                     b->arg = (Expr *) $1;
 8335                         15094                 :             24 :                     b->booltesttype = IS_NOT_UNKNOWN;
 3339                         15095                 :             24 :                     b->location = @2;
  702 peter@eisentraut.org    15096                 :             24 :                     $$ = (Node *) b;
                              15097                 :                :                 }
                              15098                 :                :             | a_expr IS DISTINCT FROM a_expr            %prec IS
                              15099                 :                :                 {
 6606 tgl@sss.pgh.pa.us       15100                 :            443 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5, @2);
                              15101                 :                :                 }
                              15102                 :                :             | a_expr IS NOT DISTINCT FROM a_expr        %prec IS
                              15103                 :                :                 {
 2817                         15104                 :             31 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_DISTINCT, "=", $1, $6, @2);
                              15105                 :                :                 }
                              15106                 :                :             | a_expr BETWEEN opt_asymmetric b_expr AND a_expr       %prec BETWEEN
                              15107                 :                :                 {
 3339                         15108                 :            231 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_BETWEEN,
                              15109                 :                :                                                    "BETWEEN",
                              15110                 :            231 :                                                    $1,
                              15111                 :            231 :                                                    (Node *) list_make2($4, $6),
                              15112                 :            231 :                                                    @2);
                              15113                 :                :                 }
                              15114                 :                :             | a_expr NOT_LA BETWEEN opt_asymmetric b_expr AND a_expr %prec NOT_LA
                              15115                 :                :                 {
                              15116                 :              6 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_BETWEEN,
                              15117                 :                :                                                    "NOT BETWEEN",
                              15118                 :              6 :                                                    $1,
                              15119                 :              6 :                                                    (Node *) list_make2($5, $7),
                              15120                 :              6 :                                                    @2);
                              15121                 :                :                 }
                              15122                 :                :             | a_expr BETWEEN SYMMETRIC b_expr AND a_expr            %prec BETWEEN
                              15123                 :                :                 {
                              15124                 :              6 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_BETWEEN_SYM,
                              15125                 :                :                                                    "BETWEEN SYMMETRIC",
                              15126                 :              6 :                                                    $1,
                              15127                 :              6 :                                                    (Node *) list_make2($4, $6),
                              15128                 :              6 :                                                    @2);
                              15129                 :                :                 }
                              15130                 :                :             | a_expr NOT_LA BETWEEN SYMMETRIC b_expr AND a_expr     %prec NOT_LA
                              15131                 :                :                 {
                              15132                 :              6 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_BETWEEN_SYM,
                              15133                 :                :                                                    "NOT BETWEEN SYMMETRIC",
                              15134                 :              6 :                                                    $1,
                              15135                 :              6 :                                                    (Node *) list_make2($5, $7),
                              15136                 :              6 :                                                    @2);
                              15137                 :                :                 }
                              15138                 :                :             | a_expr IN_P in_expr
                              15139                 :                :                 {
                              15140                 :                :                     /* in_expr returns a SubLink or a list of a_exprs */
 8490                         15141         [ +  + ]:           8500 :                     if (IsA($3, SubLink))
                              15142                 :                :                     {
                              15143                 :                :                         /* generate foo = ANY (subquery) */
  702 peter@eisentraut.org    15144                 :           1136 :                         SubLink    *n = (SubLink *) $3;
                              15145                 :                : 
 6712 tgl@sss.pgh.pa.us       15146                 :           1136 :                         n->subLinkType = ANY_SUBLINK;
 3588                         15147                 :           1136 :                         n->subLinkId = 0;
 6682                         15148                 :           1136 :                         n->testexpr = $1;
 3338                         15149                 :           1136 :                         n->operName = NIL;       /* show it's IN not = ANY */
 5708                         15150                 :           1136 :                         n->location = @2;
  702 peter@eisentraut.org    15151                 :           1136 :                         $$ = (Node *) n;
                              15152                 :                :                     }
                              15153                 :                :                     else
                              15154                 :                :                     {
                              15155                 :                :                         /* generate scalar IN expression */
 6606 tgl@sss.pgh.pa.us       15156                 :           7364 :                         $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "=", $1, $3, @2);
                              15157                 :                :                     }
                              15158                 :                :                 }
                              15159                 :                :             | a_expr NOT_LA IN_P in_expr                        %prec NOT_LA
                              15160                 :                :                 {
                              15161                 :                :                     /* in_expr returns a SubLink or a list of a_exprs */
 8490                         15162         [ +  + ]:           1114 :                     if (IsA($4, SubLink))
                              15163                 :                :                     {
                              15164                 :                :                         /* generate NOT (foo = ANY (subquery)) */
                              15165                 :                :                         /* Make an = ANY node */
  702 peter@eisentraut.org    15166                 :             60 :                         SubLink    *n = (SubLink *) $4;
                              15167                 :                : 
 7766 tgl@sss.pgh.pa.us       15168                 :             60 :                         n->subLinkType = ANY_SUBLINK;
 3588                         15169                 :             60 :                         n->subLinkId = 0;
 6682                         15170                 :             60 :                         n->testexpr = $1;
 3338                         15171                 :             60 :                         n->operName = NIL;       /* show it's IN not = ANY */
                              15172                 :             60 :                         n->location = @2;
                              15173                 :                :                         /* Stick a NOT on top; must have same parse location */
 3590                         15174                 :             60 :                         $$ = makeNotExpr((Node *) n, @2);
                              15175                 :                :                     }
                              15176                 :                :                     else
                              15177                 :                :                     {
                              15178                 :                :                         /* generate scalar NOT IN expression */
 6606                         15179                 :           1054 :                         $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "<>", $1, $4, @2);
                              15180                 :                :                     }
                              15181                 :                :                 }
                              15182                 :                :             | a_expr subquery_Op sub_type select_with_parens    %prec Op
                              15183                 :                :                 {
  702 peter@eisentraut.org    15184                 :             83 :                     SubLink    *n = makeNode(SubLink);
                              15185                 :                : 
 8917 tgl@sss.pgh.pa.us       15186                 :             83 :                     n->subLinkType = $3;
 3588                         15187                 :             83 :                     n->subLinkId = 0;
 6682                         15188                 :             83 :                     n->testexpr = $1;
 7765                         15189                 :             83 :                     n->operName = $2;
 8490                         15190                 :             83 :                     n->subselect = $4;
 5708                         15191                 :             83 :                     n->location = @2;
  702 peter@eisentraut.org    15192                 :             83 :                     $$ = (Node *) n;
                              15193                 :                :                 }
                              15194                 :                :             | a_expr subquery_Op sub_type '(' a_expr ')'        %prec Op
                              15195                 :                :                 {
 7595 tgl@sss.pgh.pa.us       15196         [ +  + ]:           7261 :                     if ($3 == ANY_SUBLINK)
 6606                         15197                 :           7111 :                         $$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5, @2);
                              15198                 :                :                     else
                              15199                 :            150 :                         $$ = (Node *) makeA_Expr(AEXPR_OP_ALL, $2, $1, $5, @2);
                              15200                 :                :                 }
                              15201                 :                :             | UNIQUE opt_unique_null_treatment select_with_parens
                              15202                 :                :                 {
                              15203                 :                :                     /* Not sure how to get rid of the parentheses
                              15204                 :                :                      * but there are lots of shift/reduce errors without them.
                              15205                 :                :                      *
                              15206                 :                :                      * Should be able to implement this by plopping the entire
                              15207                 :                :                      * select into a node, then transforming the target expressions
                              15208                 :                :                      * from whatever they are into count(*), and testing the
                              15209                 :                :                      * entire result equal to one.
                              15210                 :                :                      * But, will probably implement a separate node in the executor.
                              15211                 :                :                      */
 7575 tgl@sss.pgh.pa.us       15212         [ #  # ]:UBC           0 :                     ereport(ERROR,
                              15213                 :                :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              15214                 :                :                              errmsg("UNIQUE predicate is not yet implemented"),
                              15215                 :                :                              parser_errposition(@1)));
                              15216                 :                :                 }
                              15217                 :                :             | a_expr IS DOCUMENT_P                  %prec IS
                              15218                 :                :                 {
 5708 tgl@sss.pgh.pa.us       15219                 :CBC           9 :                     $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL,
                              15220                 :              9 :                                      list_make1($1), @2);
                              15221                 :                :                 }
                              15222                 :                :             | a_expr IS NOT DOCUMENT_P              %prec IS
                              15223                 :                :                 {
 3590                         15224                 :              9 :                     $$ = makeNotExpr(makeXmlExpr(IS_DOCUMENT, NULL, NIL,
                              15225                 :              9 :                                                  list_make1($1), @2),
                              15226                 :              9 :                                      @2);
                              15227                 :                :                 }
                              15228                 :                :             | a_expr IS NORMALIZED                              %prec IS
                              15229                 :                :                 {
 1257                         15230                 :              6 :                     $$ = (Node *) makeFuncCall(SystemFuncName("is_normalized"),
                              15231                 :              6 :                                                list_make1($1),
                              15232                 :                :                                                COERCE_SQL_SYNTAX,
                              15233                 :              6 :                                                @2);
                              15234                 :                :                 }
                              15235                 :                :             | a_expr IS unicode_normal_form NORMALIZED          %prec IS
                              15236                 :                :                 {
                              15237                 :             18 :                     $$ = (Node *) makeFuncCall(SystemFuncName("is_normalized"),
                              15238                 :             18 :                                                list_make2($1, makeStringConst($3, @3)),
                              15239                 :                :                                                COERCE_SQL_SYNTAX,
                              15240                 :             18 :                                                @2);
                              15241                 :                :                 }
                              15242                 :                :             | a_expr IS NOT NORMALIZED                          %prec IS
                              15243                 :                :                 {
 1257 tgl@sss.pgh.pa.us       15244                 :UBC           0 :                     $$ = makeNotExpr((Node *) makeFuncCall(SystemFuncName("is_normalized"),
                              15245                 :              0 :                                                            list_make1($1),
                              15246                 :                :                                                            COERCE_SQL_SYNTAX,
                              15247                 :              0 :                                                            @2),
                              15248                 :              0 :                                      @2);
                              15249                 :                :                 }
                              15250                 :                :             | a_expr IS NOT unicode_normal_form NORMALIZED      %prec IS
                              15251                 :                :                 {
                              15252                 :              0 :                     $$ = makeNotExpr((Node *) makeFuncCall(SystemFuncName("is_normalized"),
                              15253                 :              0 :                                                            list_make2($1, makeStringConst($4, @4)),
                              15254                 :                :                                                            COERCE_SQL_SYNTAX,
                              15255                 :              0 :                                                            @2),
                              15256                 :              0 :                                      @2);
                              15257                 :                :                 }
                              15258                 :                :             | a_expr IS json_predicate_type_constraint
                              15259                 :                :                     json_key_uniqueness_constraint_opt      %prec IS
                              15260                 :                :                 {
  380 alvherre@alvh.no-ip.    15261                 :CBC         145 :                     JsonFormat *format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
                              15262                 :                : 
                              15263                 :            145 :                     $$ = makeJsonIsPredicate($1, format, $3, $4, @1);
                              15264                 :                :                 }
                              15265                 :                :             /*
                              15266                 :                :              * Required by SQL/JSON, but there are conflicts
                              15267                 :                :             | a_expr
                              15268                 :                :                 json_format_clause
                              15269                 :                :                 IS  json_predicate_type_constraint
                              15270                 :                :                     json_key_uniqueness_constraint_opt      %prec IS
                              15271                 :                :                 {
                              15272                 :                :                     $$ = makeJsonIsPredicate($1, $2, $4, $5, @1);
                              15273                 :                :                 }
                              15274                 :                :             */
                              15275                 :                :             | a_expr IS NOT
                              15276                 :                :                     json_predicate_type_constraint
                              15277                 :                :                     json_key_uniqueness_constraint_opt      %prec IS
                              15278                 :                :                 {
                              15279                 :             22 :                     JsonFormat *format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
                              15280                 :                : 
                              15281                 :             22 :                     $$ = makeNotExpr(makeJsonIsPredicate($1, format, $4, $5, @1), @1);
                              15282                 :                :                 }
                              15283                 :                :             /*
                              15284                 :                :              * Required by SQL/JSON, but there are conflicts
                              15285                 :                :             | a_expr
                              15286                 :                :                 json_format_clause
                              15287                 :                :                 IS NOT
                              15288                 :                :                     json_predicate_type_constraint
                              15289                 :                :                     json_key_uniqueness_constraint_opt      %prec IS
                              15290                 :                :                 {
                              15291                 :                :                     $$ = makeNotExpr(makeJsonIsPredicate($1, $2, $5, $6, @1), @1);
                              15292                 :                :                 }
                              15293                 :                :             */
                              15294                 :                :             | DEFAULT
                              15295                 :                :                 {
                              15296                 :                :                     /*
                              15297                 :                :                      * The SQL spec only allows DEFAULT in "contextually typed
                              15298                 :                :                      * expressions", but for us, it's easier to allow it in
                              15299                 :                :                      * any a_expr and then throw error during parse analysis
                              15300                 :                :                      * if it's in an inappropriate context.  This way also
                              15301                 :                :                      * lets us say something smarter than "syntax error".
                              15302                 :                :                      */
 2700 tgl@sss.pgh.pa.us       15303                 :            731 :                     SetToDefault *n = makeNode(SetToDefault);
                              15304                 :                : 
                              15305                 :                :                     /* parse analysis will fill in the rest */
                              15306                 :            731 :                     n->location = @1;
  702 peter@eisentraut.org    15307                 :            731 :                     $$ = (Node *) n;
                              15308                 :                :                 }
                              15309                 :                :         ;
                              15310                 :                : 
                              15311                 :                : /*
                              15312                 :                :  * Restricted expressions
                              15313                 :                :  *
                              15314                 :                :  * b_expr is a subset of the complete expression syntax defined by a_expr.
                              15315                 :                :  *
                              15316                 :                :  * Presently, AND, NOT, IS, and IN are the a_expr keywords that would
                              15317                 :                :  * cause trouble in the places where b_expr is used.  For simplicity, we
                              15318                 :                :  * just eliminate all the boolean-keyword-operator productions from b_expr.
                              15319                 :                :  */
                              15320                 :                : b_expr:     c_expr
 7972 bruce@momjian.us        15321                 :           1734 :                 { $$ = $1; }
                              15322                 :                :             | b_expr TYPECAST Typename
 5708 tgl@sss.pgh.pa.us       15323                 :             67 :                 { $$ = makeTypeCast($1, $3, @2); }
                              15324                 :                :             | '+' b_expr                    %prec UMINUS
 6606 tgl@sss.pgh.pa.us       15325                 :UBC           0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
                              15326                 :                :             | '-' b_expr                    %prec UMINUS
 6606 tgl@sss.pgh.pa.us       15327                 :CBC          33 :                 { $$ = doNegate($2, @1); }
                              15328                 :                :             | b_expr '+' b_expr
                              15329                 :             15 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3, @2); }
                              15330                 :                :             | b_expr '-' b_expr
                              15331                 :              6 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3, @2); }
                              15332                 :                :             | b_expr '*' b_expr
                              15333                 :              6 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3, @2); }
                              15334                 :                :             | b_expr '/' b_expr
 6606 tgl@sss.pgh.pa.us       15335                 :UBC           0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3, @2); }
                              15336                 :                :             | b_expr '%' b_expr
                              15337                 :              0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3, @2); }
                              15338                 :                :             | b_expr '^' b_expr
 6606 tgl@sss.pgh.pa.us       15339                 :CBC           3 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3, @2); }
                              15340                 :                :             | b_expr '<' b_expr
 6606 tgl@sss.pgh.pa.us       15341                 :UBC           0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3, @2); }
                              15342                 :                :             | b_expr '>' b_expr
                              15343                 :              0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3, @2); }
                              15344                 :                :             | b_expr '=' b_expr
                              15345                 :              0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3, @2); }
                              15346                 :                :             | b_expr LESS_EQUALS b_expr
 3322                         15347                 :              0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $3, @2); }
                              15348                 :                :             | b_expr GREATER_EQUALS b_expr
                              15349                 :              0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3, @2); }
                              15350                 :                :             | b_expr NOT_EQUALS b_expr
                              15351                 :              0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, $3, @2); }
                              15352                 :                :             | b_expr qual_Op b_expr             %prec Op
 6606 tgl@sss.pgh.pa.us       15353                 :CBC           6 :                 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
                              15354                 :                :             | qual_Op b_expr                    %prec Op
 6606 tgl@sss.pgh.pa.us       15355                 :UBC           0 :                 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
                              15356                 :                :             | b_expr IS DISTINCT FROM b_expr        %prec IS
                              15357                 :                :                 {
                              15358                 :              0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5, @2);
                              15359                 :                :                 }
                              15360                 :                :             | b_expr IS NOT DISTINCT FROM b_expr    %prec IS
                              15361                 :                :                 {
 2817                         15362                 :              0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_DISTINCT, "=", $1, $6, @2);
                              15363                 :                :                 }
                              15364                 :                :             | b_expr IS DOCUMENT_P                  %prec IS
                              15365                 :                :                 {
 5708                         15366                 :              0 :                     $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL,
                              15367                 :              0 :                                      list_make1($1), @2);
                              15368                 :                :                 }
                              15369                 :                :             | b_expr IS NOT DOCUMENT_P              %prec IS
                              15370                 :                :                 {
 3590                         15371                 :              0 :                     $$ = makeNotExpr(makeXmlExpr(IS_DOCUMENT, NULL, NIL,
                              15372                 :              0 :                                                  list_make1($1), @2),
                              15373                 :              0 :                                      @2);
                              15374                 :                :                 }
                              15375                 :                :         ;
                              15376                 :                : 
                              15377                 :                : /*
                              15378                 :                :  * Productions that can be used in both a_expr and b_expr.
                              15379                 :                :  *
                              15380                 :                :  * Note: productions that refer recursively to a_expr or b_expr mostly
                              15381                 :                :  * cannot appear here.  However, it's OK to refer to a_exprs that occur
                              15382                 :                :  * inside parentheses, such as function arguments; that cannot introduce
                              15383                 :                :  * ambiguity to the b_expr syntax.
                              15384                 :                :  */
 7249 tgl@sss.pgh.pa.us       15385                 :CBC      763330 : c_expr:     columnref                               { $$ = $1; }
 7972 bruce@momjian.us        15386                 :         561473 :             | AexprConst                            { $$ = $1; }
                              15387                 :                :             | PARAM opt_indirection
                              15388                 :                :                 {
  702 peter@eisentraut.org    15389                 :          81485 :                     ParamRef   *p = makeNode(ParamRef);
                              15390                 :                : 
 7249 tgl@sss.pgh.pa.us       15391                 :          81485 :                     p->number = $1;
 5708                         15392                 :          81485 :                     p->location = @1;
 7249                         15393         [ +  + ]:          81485 :                     if ($2)
                              15394                 :                :                     {
                              15395                 :            563 :                         A_Indirection *n = makeNode(A_Indirection);
                              15396                 :                : 
                              15397                 :            563 :                         n->arg = (Node *) p;
 5389                         15398                 :            563 :                         n->indirection = check_indirection($2, yyscanner);
 7249                         15399                 :            563 :                         $$ = (Node *) n;
                              15400                 :                :                     }
                              15401                 :                :                     else
                              15402                 :          80922 :                         $$ = (Node *) p;
                              15403                 :                :                 }
                              15404                 :                :             | '(' a_expr ')' opt_indirection
                              15405                 :                :                 {
 7677                         15406         [ +  + ]:          44401 :                     if ($4)
                              15407                 :                :                     {
 7249                         15408                 :           4871 :                         A_Indirection *n = makeNode(A_Indirection);
                              15409                 :                : 
 7677                         15410                 :           4871 :                         n->arg = $2;
 5389                         15411                 :           4871 :                         n->indirection = check_indirection($4, yyscanner);
  702 peter@eisentraut.org    15412                 :           4871 :                         $$ = (Node *) n;
                              15413                 :                :                     }
                              15414                 :                :                     else
 7677 tgl@sss.pgh.pa.us       15415                 :          39530 :                         $$ = $2;
                              15416                 :                :                 }
                              15417                 :                :             | case_expr
 7972 bruce@momjian.us        15418                 :          27946 :                 { $$ = $1; }
                              15419                 :                :             | func_expr
 7137 tgl@sss.pgh.pa.us       15420                 :         182381 :                 { $$ = $1; }
                              15421                 :                :             | select_with_parens            %prec UMINUS
                              15422                 :                :                 {
  702 peter@eisentraut.org    15423                 :          11605 :                     SubLink    *n = makeNode(SubLink);
                              15424                 :                : 
 7137 tgl@sss.pgh.pa.us       15425                 :          11605 :                     n->subLinkType = EXPR_SUBLINK;
 3588                         15426                 :          11605 :                     n->subLinkId = 0;
 6682                         15427                 :          11605 :                     n->testexpr = NULL;
 7137                         15428                 :          11605 :                     n->operName = NIL;
                              15429                 :          11605 :                     n->subselect = $1;
 5708                         15430                 :          11605 :                     n->location = @1;
  702 peter@eisentraut.org    15431                 :          11605 :                     $$ = (Node *) n;
                              15432                 :                :                 }
                              15433                 :                :             | select_with_parens indirection
                              15434                 :                :                 {
                              15435                 :                :                     /*
                              15436                 :                :                      * Because the select_with_parens nonterminal is designed
                              15437                 :                :                      * to "eat" as many levels of parens as possible, the
                              15438                 :                :                      * '(' a_expr ')' opt_indirection production above will
                              15439                 :                :                      * fail to match a sub-SELECT with indirection decoration;
                              15440                 :                :                      * the sub-SELECT won't be regarded as an a_expr as long
                              15441                 :                :                      * as there are parens around it.  To support applying
                              15442                 :                :                      * subscripting or field selection to a sub-SELECT result,
                              15443                 :                :                      * we need this redundant-looking production.
                              15444                 :                :                      */
                              15445                 :              9 :                     SubLink    *n = makeNode(SubLink);
 4092 tgl@sss.pgh.pa.us       15446                 :              9 :                     A_Indirection *a = makeNode(A_Indirection);
                              15447                 :                : 
                              15448                 :              9 :                     n->subLinkType = EXPR_SUBLINK;
 3588                         15449                 :              9 :                     n->subLinkId = 0;
 4092                         15450                 :              9 :                     n->testexpr = NULL;
                              15451                 :              9 :                     n->operName = NIL;
                              15452                 :              9 :                     n->subselect = $1;
                              15453                 :              9 :                     n->location = @1;
  702 peter@eisentraut.org    15454                 :              9 :                     a->arg = (Node *) n;
 4092 tgl@sss.pgh.pa.us       15455                 :              9 :                     a->indirection = check_indirection($2, yyscanner);
  702 peter@eisentraut.org    15456                 :              9 :                     $$ = (Node *) a;
                              15457                 :                :                 }
                              15458                 :                :             | EXISTS select_with_parens
                              15459                 :                :                 {
                              15460                 :           2617 :                     SubLink    *n = makeNode(SubLink);
                              15461                 :                : 
 7137 tgl@sss.pgh.pa.us       15462                 :           2617 :                     n->subLinkType = EXISTS_SUBLINK;
 3588                         15463                 :           2617 :                     n->subLinkId = 0;
 6682                         15464                 :           2617 :                     n->testexpr = NULL;
 7137                         15465                 :           2617 :                     n->operName = NIL;
                              15466                 :           2617 :                     n->subselect = $2;
 5708                         15467                 :           2617 :                     n->location = @1;
  702 peter@eisentraut.org    15468                 :           2617 :                     $$ = (Node *) n;
                              15469                 :                :                 }
                              15470                 :                :             | ARRAY select_with_parens
                              15471                 :                :                 {
                              15472                 :           3638 :                     SubLink    *n = makeNode(SubLink);
                              15473                 :                : 
 7137 tgl@sss.pgh.pa.us       15474                 :           3638 :                     n->subLinkType = ARRAY_SUBLINK;
 3588                         15475                 :           3638 :                     n->subLinkId = 0;
 6682                         15476                 :           3638 :                     n->testexpr = NULL;
 7137                         15477                 :           3638 :                     n->operName = NIL;
                              15478                 :           3638 :                     n->subselect = $2;
 5708                         15479                 :           3638 :                     n->location = @1;
  702 peter@eisentraut.org    15480                 :           3638 :                     $$ = (Node *) n;
                              15481                 :                :                 }
                              15482                 :                :             | ARRAY array_expr
                              15483                 :                :                 {
 2609 peter_e@gmx.net         15484                 :           3689 :                     A_ArrayExpr *n = castNode(A_ArrayExpr, $2);
                              15485                 :                : 
                              15486                 :                :                     /* point outermost A_ArrayExpr to the ARRAY keyword */
 5708 tgl@sss.pgh.pa.us       15487                 :           3689 :                     n->location = @1;
  702 peter@eisentraut.org    15488                 :           3689 :                     $$ = (Node *) n;
                              15489                 :                :                 }
                              15490                 :                :             | explicit_row
                              15491                 :                :                 {
                              15492                 :           1889 :                     RowExpr    *r = makeNode(RowExpr);
                              15493                 :                : 
 3256 andres@anarazel.de      15494                 :           1889 :                     r->args = $1;
                              15495                 :           1889 :                     r->row_typeid = InvalidOid;  /* not analyzed yet */
                              15496                 :           1889 :                     r->colnames = NIL;   /* to be filled in during analysis */
                              15497                 :           1889 :                     r->row_format = COERCE_EXPLICIT_CALL; /* abuse */
                              15498                 :           1889 :                     r->location = @1;
  702 peter@eisentraut.org    15499                 :           1889 :                     $$ = (Node *) r;
                              15500                 :                :                 }
                              15501                 :                :             | implicit_row
                              15502                 :                :                 {
                              15503                 :           1050 :                     RowExpr    *r = makeNode(RowExpr);
                              15504                 :                : 
 7137 tgl@sss.pgh.pa.us       15505                 :           1050 :                     r->args = $1;
                              15506                 :           1050 :                     r->row_typeid = InvalidOid;  /* not analyzed yet */
 4443                         15507                 :           1050 :                     r->colnames = NIL;   /* to be filled in during analysis */
 3256 andres@anarazel.de      15508                 :           1050 :                     r->row_format = COERCE_IMPLICIT_CAST; /* abuse */
 5708 tgl@sss.pgh.pa.us       15509                 :           1050 :                     r->location = @1;
  702 peter@eisentraut.org    15510                 :           1050 :                     $$ = (Node *) r;
                              15511                 :                :                 }
                              15512                 :                :             | GROUPING '(' expr_list ')'
                              15513                 :                :               {
 3256 andres@anarazel.de      15514                 :            157 :                   GroupingFunc *g = makeNode(GroupingFunc);
                              15515                 :                : 
                              15516                 :            157 :                   g->args = $3;
                              15517                 :            157 :                   g->location = @1;
  702 peter@eisentraut.org    15518                 :            157 :                   $$ = (Node *) g;
                              15519                 :                :               }
                              15520                 :                :         ;
                              15521                 :                : 
                              15522                 :                : func_application: func_name '(' ')'
                              15523                 :                :                 {
 1257 tgl@sss.pgh.pa.us       15524                 :          24040 :                     $$ = (Node *) makeFuncCall($1, NIL,
                              15525                 :                :                                                COERCE_EXPLICIT_CALL,
                              15526                 :          24040 :                                                @1);
                              15527                 :                :                 }
                              15528                 :                :             | func_name '(' func_arg_list opt_sort_clause ')'
                              15529                 :                :                 {
  702 peter@eisentraut.org    15530                 :         142669 :                     FuncCall   *n = makeFuncCall($1, $3,
                              15531                 :                :                                                  COERCE_EXPLICIT_CALL,
                              15532                 :         142669 :                                                  @1);
                              15533                 :                : 
 3765 tgl@sss.pgh.pa.us       15534                 :         142669 :                     n->agg_order = $4;
  702 peter@eisentraut.org    15535                 :         142669 :                     $$ = (Node *) n;
                              15536                 :                :                 }
                              15537                 :                :             | func_name '(' VARIADIC func_arg_expr opt_sort_clause ')'
                              15538                 :                :                 {
                              15539                 :            288 :                     FuncCall   *n = makeFuncCall($1, list_make1($4),
                              15540                 :                :                                                  COERCE_EXPLICIT_CALL,
                              15541                 :            288 :                                                  @1);
                              15542                 :                : 
 2433 peter_e@gmx.net         15543                 :            288 :                     n->func_variadic = true;
 3765 tgl@sss.pgh.pa.us       15544                 :            288 :                     n->agg_order = $5;
  702 peter@eisentraut.org    15545                 :            288 :                     $$ = (Node *) n;
                              15546                 :                :                 }
                              15547                 :                :             | func_name '(' func_arg_list ',' VARIADIC func_arg_expr opt_sort_clause ')'
                              15548                 :                :                 {
                              15549                 :             60 :                     FuncCall   *n = makeFuncCall($1, lappend($3, $6),
                              15550                 :                :                                                  COERCE_EXPLICIT_CALL,
                              15551                 :             60 :                                                  @1);
                              15552                 :                : 
 2433 peter_e@gmx.net         15553                 :             60 :                     n->func_variadic = true;
 3765 tgl@sss.pgh.pa.us       15554                 :             60 :                     n->agg_order = $7;
  702 peter@eisentraut.org    15555                 :             60 :                     $$ = (Node *) n;
                              15556                 :                :                 }
                              15557                 :                :             | func_name '(' ALL func_arg_list opt_sort_clause ')'
                              15558                 :                :                 {
  702 peter@eisentraut.org    15559                 :UBC           0 :                     FuncCall   *n = makeFuncCall($1, $4,
                              15560                 :                :                                                  COERCE_EXPLICIT_CALL,
                              15561                 :              0 :                                                  @1);
                              15562                 :                : 
 5234 tgl@sss.pgh.pa.us       15563                 :              0 :                     n->agg_order = $5;
                              15564                 :                :                     /* Ideally we'd mark the FuncCall node to indicate
                              15565                 :                :                      * "must be an aggregate", but there's no provision
                              15566                 :                :                      * for that in FuncCall at the moment.
                              15567                 :                :                      */
  702 peter@eisentraut.org    15568                 :              0 :                     $$ = (Node *) n;
                              15569                 :                :                 }
                              15570                 :                :             | func_name '(' DISTINCT func_arg_list opt_sort_clause ')'
                              15571                 :                :                 {
  702 peter@eisentraut.org    15572                 :CBC         263 :                     FuncCall   *n = makeFuncCall($1, $4,
                              15573                 :                :                                                  COERCE_EXPLICIT_CALL,
                              15574                 :            263 :                                                  @1);
                              15575                 :                : 
 5234 tgl@sss.pgh.pa.us       15576                 :            263 :                     n->agg_order = $5;
 2433 peter_e@gmx.net         15577                 :            263 :                     n->agg_distinct = true;
  702 peter@eisentraut.org    15578                 :            263 :                     $$ = (Node *) n;
                              15579                 :                :                 }
                              15580                 :                :             | func_name '(' '*' ')'
                              15581                 :                :                 {
                              15582                 :                :                     /*
                              15583                 :                :                      * We consider AGGREGATE(*) to invoke a parameterless
                              15584                 :                :                      * aggregate.  This does the right thing for COUNT(*),
                              15585                 :                :                      * and there are no other aggregates in SQL that accept
                              15586                 :                :                      * '*' as parameter.
                              15587                 :                :                      *
                              15588                 :                :                      * The FuncCall node is also marked agg_star = true,
                              15589                 :                :                      * so that later processing can detect what the argument
                              15590                 :                :                      * really was.
                              15591                 :                :                      */
                              15592                 :           6016 :                     FuncCall   *n = makeFuncCall($1, NIL,
                              15593                 :                :                                                  COERCE_EXPLICIT_CALL,
                              15594                 :           6016 :                                                  @1);
                              15595                 :                : 
 2433 peter_e@gmx.net         15596                 :           6016 :                     n->agg_star = true;
  702 peter@eisentraut.org    15597                 :           6016 :                     $$ = (Node *) n;
                              15598                 :                :                 }
                              15599                 :                :         ;
                              15600                 :                : 
                              15601                 :                : 
                              15602                 :                : /*
                              15603                 :                :  * func_expr and its cousin func_expr_windowless are split out from c_expr just
                              15604                 :                :  * so that we have classifications for "everything that is a function call or
                              15605                 :                :  * looks like one".  This isn't very important, but it saves us having to
                              15606                 :                :  * document which variants are legal in places like "FROM function()" or the
                              15607                 :                :  * backwards-compatible functional-index syntax for CREATE INDEX.
                              15608                 :                :  * (Note that many of the special SQL functions wouldn't actually make any
                              15609                 :                :  * sense as functional index entries, but we ignore that consideration here.)
                              15610                 :                :  */
                              15611                 :                : func_expr: func_application within_group_clause filter_clause over_clause
                              15612                 :                :                 {
                              15613                 :         151950 :                     FuncCall   *n = (FuncCall *) $1;
                              15614                 :                : 
                              15615                 :                :                     /*
                              15616                 :                :                      * The order clause for WITHIN GROUP and the one for
                              15617                 :                :                      * plain-aggregate ORDER BY share a field, so we have to
                              15618                 :                :                      * check here that at most one is present.  We also check
                              15619                 :                :                      * for DISTINCT and VARIADIC here to give a better error
                              15620                 :                :                      * location.  Other consistency checks are deferred to
                              15621                 :                :                      * parse analysis.
                              15622                 :                :                      */
 3765 tgl@sss.pgh.pa.us       15623         [ +  + ]:         151950 :                     if ($2 != NIL)
                              15624                 :                :                     {
                              15625         [ +  + ]:            174 :                         if (n->agg_order != NIL)
                              15626         [ +  - ]:              3 :                             ereport(ERROR,
                              15627                 :                :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              15628                 :                :                                      errmsg("cannot use multiple ORDER BY clauses with WITHIN GROUP"),
                              15629                 :                :                                      parser_errposition(@2)));
                              15630         [ -  + ]:            171 :                         if (n->agg_distinct)
 3765 tgl@sss.pgh.pa.us       15631         [ #  # ]:UBC           0 :                             ereport(ERROR,
                              15632                 :                :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              15633                 :                :                                      errmsg("cannot use DISTINCT with WITHIN GROUP"),
                              15634                 :                :                                      parser_errposition(@2)));
 3765 tgl@sss.pgh.pa.us       15635         [ -  + ]:CBC         171 :                         if (n->func_variadic)
 3765 tgl@sss.pgh.pa.us       15636         [ #  # ]:UBC           0 :                             ereport(ERROR,
                              15637                 :                :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              15638                 :                :                                      errmsg("cannot use VARIADIC with WITHIN GROUP"),
                              15639                 :                :                                      parser_errposition(@2)));
 3765 tgl@sss.pgh.pa.us       15640                 :CBC         171 :                         n->agg_order = $2;
 2433 peter_e@gmx.net         15641                 :            171 :                         n->agg_within_group = true;
                              15642                 :                :                     }
 3765 tgl@sss.pgh.pa.us       15643                 :         151947 :                     n->agg_filter = $3;
                              15644                 :         151947 :                     n->over = $4;
                              15645                 :         151947 :                     $$ = (Node *) n;
                              15646                 :                :                 }
                              15647                 :                :             | json_aggregate_func filter_clause over_clause
                              15648                 :                :                 {
  382 alvherre@alvh.no-ip.    15649                 :            306 :                     JsonAggConstructor *n = IsA($1, JsonObjectAgg) ?
                              15650         [ +  + ]:            153 :                         ((JsonObjectAgg *) $1)->constructor :
                              15651                 :             75 :                         ((JsonArrayAgg *) $1)->constructor;
                              15652                 :                : 
                              15653                 :            153 :                     n->agg_filter = $2;
                              15654                 :            153 :                     n->over = $3;
                              15655                 :            153 :                     $$ = (Node *) $1;
                              15656                 :                :                 }
                              15657                 :                :             | func_expr_common_subexpr
 3943 rhaas@postgresql.org    15658                 :          30281 :                 { $$ = $1; }
                              15659                 :                :         ;
                              15660                 :                : 
                              15661                 :                : /*
                              15662                 :                :  * As func_expr but does not accept WINDOW functions directly
                              15663                 :                :  * (but they can still be contained in arguments for functions etc).
                              15664                 :                :  * Use this when window expressions are not allowed, where needed to
                              15665                 :                :  * disambiguate the grammar (e.g. in CREATE INDEX).
                              15666                 :                :  */
                              15667                 :                : func_expr_windowless:
                              15668                 :          21119 :             func_application                        { $$ = $1; }
 3808 peter_e@gmx.net         15669                 :            198 :             | func_expr_common_subexpr              { $$ = $1; }
  382 alvherre@alvh.no-ip.    15670                 :UBC           0 :             | json_aggregate_func                   { $$ = $1; }
                              15671                 :                :         ;
                              15672                 :                : 
                              15673                 :                : /*
                              15674                 :                :  * Special expressions that are considered to be functions.
                              15675                 :                :  */
                              15676                 :                : func_expr_common_subexpr:
                              15677                 :                :             COLLATION FOR '(' a_expr ')'
                              15678                 :                :                 {
 3940 rhaas@postgresql.org    15679                 :CBC          15 :                     $$ = (Node *) makeFuncCall(SystemFuncName("pg_collation_for"),
                              15680                 :             15 :                                                list_make1($4),
                              15681                 :                :                                                COERCE_SQL_SYNTAX,
                              15682                 :             15 :                                                @1);
                              15683                 :                :                 }
                              15684                 :                :             | CURRENT_DATE
                              15685                 :                :                 {
  333 michael@paquier.xyz     15686                 :            132 :                     $$ = makeSQLValueFunction(SVFOP_CURRENT_DATE, -1, @1);
                              15687                 :                :                 }
                              15688                 :                :             | CURRENT_TIME
                              15689                 :                :                 {
                              15690                 :             12 :                     $$ = makeSQLValueFunction(SVFOP_CURRENT_TIME, -1, @1);
                              15691                 :                :                 }
                              15692                 :                :             | CURRENT_TIME '(' Iconst ')'
                              15693                 :                :                 {
                              15694                 :             12 :                     $$ = makeSQLValueFunction(SVFOP_CURRENT_TIME_N, $3, @1);
                              15695                 :                :                 }
                              15696                 :                :             | CURRENT_TIMESTAMP
                              15697                 :                :                 {
                              15698                 :            144 :                     $$ = makeSQLValueFunction(SVFOP_CURRENT_TIMESTAMP, -1, @1);
                              15699                 :                :                 }
                              15700                 :                :             | CURRENT_TIMESTAMP '(' Iconst ')'
                              15701                 :                :                 {
                              15702                 :             76 :                     $$ = makeSQLValueFunction(SVFOP_CURRENT_TIMESTAMP_N, $3, @1);
                              15703                 :                :                 }
                              15704                 :                :             | LOCALTIME
                              15705                 :                :                 {
                              15706                 :             12 :                     $$ = makeSQLValueFunction(SVFOP_LOCALTIME, -1, @1);
                              15707                 :                :                 }
                              15708                 :                :             | LOCALTIME '(' Iconst ')'
                              15709                 :                :                 {
                              15710                 :             12 :                     $$ = makeSQLValueFunction(SVFOP_LOCALTIME_N, $3, @1);
                              15711                 :                :                 }
                              15712                 :                :             | LOCALTIMESTAMP
                              15713                 :                :                 {
                              15714                 :             18 :                     $$ = makeSQLValueFunction(SVFOP_LOCALTIMESTAMP, -1, @1);
                              15715                 :                :                 }
                              15716                 :                :             | LOCALTIMESTAMP '(' Iconst ')'
                              15717                 :                :                 {
                              15718                 :             12 :                     $$ = makeSQLValueFunction(SVFOP_LOCALTIMESTAMP_N, $3, @1);
                              15719                 :                :                 }
                              15720                 :                :             | CURRENT_ROLE
                              15721                 :                :                 {
                              15722                 :             34 :                     $$ = makeSQLValueFunction(SVFOP_CURRENT_ROLE, -1, @1);
                              15723                 :                :                 }
                              15724                 :                :             | CURRENT_USER
                              15725                 :                :                 {
                              15726                 :            417 :                     $$ = makeSQLValueFunction(SVFOP_CURRENT_USER, -1, @1);
                              15727                 :                :                 }
                              15728                 :                :             | SESSION_USER
                              15729                 :                :                 {
                              15730                 :            283 :                     $$ = makeSQLValueFunction(SVFOP_SESSION_USER, -1, @1);
                              15731                 :                :                 }
                              15732                 :                :             | SYSTEM_USER
                              15733                 :                :                 {
  563                         15734                 :             12 :                     $$ = (Node *) makeFuncCall(SystemFuncName("system_user"),
                              15735                 :                :                                                NIL,
                              15736                 :                :                                                COERCE_SQL_SYNTAX,
                              15737                 :                :                                                @1);
                              15738                 :                :                 }
                              15739                 :                :             | USER
                              15740                 :                :                 {
  333                         15741                 :             12 :                     $$ = makeSQLValueFunction(SVFOP_USER, -1, @1);
                              15742                 :                :                 }
                              15743                 :                :             | CURRENT_CATALOG
                              15744                 :                :                 {
                              15745                 :             15 :                     $$ = makeSQLValueFunction(SVFOP_CURRENT_CATALOG, -1, @1);
                              15746                 :                :                 }
                              15747                 :                :             | CURRENT_SCHEMA
                              15748                 :                :                 {
                              15749                 :             15 :                     $$ = makeSQLValueFunction(SVFOP_CURRENT_SCHEMA, -1, @1);
                              15750                 :                :                 }
                              15751                 :                :             | CAST '(' a_expr AS Typename ')'
 5708 tgl@sss.pgh.pa.us       15752                 :          24161 :                 { $$ = makeTypeCast($3, $5, @1); }
                              15753                 :                :             | EXTRACT '(' extract_list ')'
                              15754                 :                :                 {
 1104 peter@eisentraut.org    15755                 :            596 :                     $$ = (Node *) makeFuncCall(SystemFuncName("extract"),
 1257 tgl@sss.pgh.pa.us       15756                 :            596 :                                                $3,
                              15757                 :                :                                                COERCE_SQL_SYNTAX,
                              15758                 :            596 :                                                @1);
                              15759                 :                :                 }
                              15760                 :                :             | NORMALIZE '(' a_expr ')'
                              15761                 :                :                 {
                              15762                 :              9 :                     $$ = (Node *) makeFuncCall(SystemFuncName("normalize"),
                              15763                 :              9 :                                                list_make1($3),
                              15764                 :                :                                                COERCE_SQL_SYNTAX,
                              15765                 :              9 :                                                @1);
                              15766                 :                :                 }
                              15767                 :                :             | NORMALIZE '(' a_expr ',' unicode_normal_form ')'
                              15768                 :                :                 {
                              15769                 :             18 :                     $$ = (Node *) makeFuncCall(SystemFuncName("normalize"),
                              15770                 :             18 :                                                list_make2($3, makeStringConst($5, @5)),
                              15771                 :                :                                                COERCE_SQL_SYNTAX,
                              15772                 :             18 :                                                @1);
                              15773                 :                :                 }
                              15774                 :                :             | OVERLAY '(' overlay_list ')'
                              15775                 :                :                 {
                              15776                 :             41 :                     $$ = (Node *) makeFuncCall(SystemFuncName("overlay"),
                              15777                 :             41 :                                                $3,
                              15778                 :                :                                                COERCE_SQL_SYNTAX,
                              15779                 :             41 :                                                @1);
                              15780                 :                :                 }
                              15781                 :                :             | OVERLAY '(' func_arg_list_opt ')'
                              15782                 :                :                 {
                              15783                 :                :                     /*
                              15784                 :                :                      * allow functions named overlay() to be called without
                              15785                 :                :                      * special syntax
                              15786                 :                :                      */
 1257 tgl@sss.pgh.pa.us       15787                 :UBC           0 :                     $$ = (Node *) makeFuncCall(list_make1(makeString("overlay")),
                              15788                 :              0 :                                                $3,
                              15789                 :                :                                                COERCE_EXPLICIT_CALL,
                              15790                 :              0 :                                                @1);
                              15791                 :                :                 }
                              15792                 :                :             | POSITION '(' position_list ')'
                              15793                 :                :                 {
                              15794                 :                :                     /*
                              15795                 :                :                      * position(A in B) is converted to position(B, A)
                              15796                 :                :                      *
                              15797                 :                :                      * We deliberately don't offer a "plain syntax" option
                              15798                 :                :                      * for position(), because the reversal of the arguments
                              15799                 :                :                      * creates too much risk of confusion.
                              15800                 :                :                      */
 1257 tgl@sss.pgh.pa.us       15801                 :CBC         174 :                     $$ = (Node *) makeFuncCall(SystemFuncName("position"),
                              15802                 :            174 :                                                $3,
                              15803                 :                :                                                COERCE_SQL_SYNTAX,
                              15804                 :            174 :                                                @1);
                              15805                 :                :                 }
                              15806                 :                :             | SUBSTRING '(' substr_list ')'
                              15807                 :                :                 {
                              15808                 :                :                     /* substring(A from B for C) is converted to
                              15809                 :                :                      * substring(A, B, C) - thomas 2000-11-28
                              15810                 :                :                      */
                              15811                 :            311 :                     $$ = (Node *) makeFuncCall(SystemFuncName("substring"),
                              15812                 :            311 :                                                $3,
                              15813                 :                :                                                COERCE_SQL_SYNTAX,
                              15814                 :            311 :                                                @1);
                              15815                 :                :                 }
                              15816                 :                :             | SUBSTRING '(' func_arg_list_opt ')'
                              15817                 :                :                 {
                              15818                 :                :                     /*
                              15819                 :                :                      * allow functions named substring() to be called without
                              15820                 :                :                      * special syntax
                              15821                 :                :                      */
                              15822                 :             93 :                     $$ = (Node *) makeFuncCall(list_make1(makeString("substring")),
                              15823                 :             93 :                                                $3,
                              15824                 :                :                                                COERCE_EXPLICIT_CALL,
                              15825                 :             93 :                                                @1);
                              15826                 :                :                 }
                              15827                 :                :             | TREAT '(' a_expr AS Typename ')'
                              15828                 :                :                 {
                              15829                 :                :                     /* TREAT(expr AS target) converts expr of a particular type to target,
                              15830                 :                :                      * which is defined to be a subtype of the original expression.
                              15831                 :                :                      * In SQL99, this is intended for use with structured UDTs,
                              15832                 :                :                      * but let's make this a generally useful form allowing stronger
                              15833                 :                :                      * coercions than are handled by implicit casting.
                              15834                 :                :                      *
                              15835                 :                :                      * Convert SystemTypeName() to SystemFuncName() even though
                              15836                 :                :                      * at the moment they result in the same thing.
                              15837                 :                :                      */
 1228 peter@eisentraut.org    15838                 :UBC           0 :                     $$ = (Node *) makeFuncCall(SystemFuncName(strVal(llast($5->names))),
 1257 tgl@sss.pgh.pa.us       15839                 :              0 :                                                list_make1($3),
                              15840                 :                :                                                COERCE_EXPLICIT_CALL,
                              15841                 :              0 :                                                @1);
                              15842                 :                :                 }
                              15843                 :                :             | TRIM '(' BOTH trim_list ')'
                              15844                 :                :                 {
                              15845                 :                :                     /* various trim expressions are defined in SQL
                              15846                 :                :                      * - thomas 1997-07-19
                              15847                 :                :                      */
 1257 tgl@sss.pgh.pa.us       15848                 :CBC           6 :                     $$ = (Node *) makeFuncCall(SystemFuncName("btrim"),
                              15849                 :              6 :                                                $4,
                              15850                 :                :                                                COERCE_SQL_SYNTAX,
                              15851                 :              6 :                                                @1);
                              15852                 :                :                 }
                              15853                 :                :             | TRIM '(' LEADING trim_list ')'
                              15854                 :                :                 {
                              15855                 :             12 :                     $$ = (Node *) makeFuncCall(SystemFuncName("ltrim"),
                              15856                 :             12 :                                                $4,
                              15857                 :                :                                                COERCE_SQL_SYNTAX,
                              15858                 :             12 :                                                @1);
                              15859                 :                :                 }
                              15860                 :                :             | TRIM '(' TRAILING trim_list ')'
                              15861                 :                :                 {
                              15862                 :            267 :                     $$ = (Node *) makeFuncCall(SystemFuncName("rtrim"),
                              15863                 :            267 :                                                $4,
                              15864                 :                :                                                COERCE_SQL_SYNTAX,
                              15865                 :            267 :                                                @1);
                              15866                 :                :                 }
                              15867                 :                :             | TRIM '(' trim_list ')'
                              15868                 :                :                 {
                              15869                 :             49 :                     $$ = (Node *) makeFuncCall(SystemFuncName("btrim"),
                              15870                 :             49 :                                                $3,
                              15871                 :                :                                                COERCE_SQL_SYNTAX,
                              15872                 :             49 :                                                @1);
                              15873                 :                :                 }
                              15874                 :                :             | NULLIF '(' a_expr ',' a_expr ')'
                              15875                 :                :                 {
 6606                         15876                 :            119 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_NULLIF, "=", $3, $5, @1);
                              15877                 :                :                 }
                              15878                 :                :             | COALESCE '(' expr_list ')'
                              15879                 :                :                 {
 7136                         15880                 :           1505 :                     CoalesceExpr *c = makeNode(CoalesceExpr);
                              15881                 :                : 
                              15882                 :           1505 :                     c->args = $3;
 5708                         15883                 :           1505 :                     c->location = @1;
  702 peter@eisentraut.org    15884                 :           1505 :                     $$ = (Node *) c;
                              15885                 :                :                 }
                              15886                 :                :             | GREATEST '(' expr_list ')'
                              15887                 :                :                 {
 6867 tgl@sss.pgh.pa.us       15888                 :             70 :                     MinMaxExpr *v = makeNode(MinMaxExpr);
                              15889                 :                : 
                              15890                 :             70 :                     v->args = $3;
                              15891                 :             70 :                     v->op = IS_GREATEST;
 5708                         15892                 :             70 :                     v->location = @1;
  702 peter@eisentraut.org    15893                 :             70 :                     $$ = (Node *) v;
                              15894                 :                :                 }
                              15895                 :                :             | LEAST '(' expr_list ')'
                              15896                 :                :                 {
 6867 tgl@sss.pgh.pa.us       15897                 :             71 :                     MinMaxExpr *v = makeNode(MinMaxExpr);
                              15898                 :                : 
                              15899                 :             71 :                     v->args = $3;
                              15900                 :             71 :                     v->op = IS_LEAST;
 5708                         15901                 :             71 :                     v->location = @1;
  702 peter@eisentraut.org    15902                 :             71 :                     $$ = (Node *) v;
                              15903                 :                :                 }
                              15904                 :                :             | XMLCONCAT '(' expr_list ')'
                              15905                 :                :                 {
 5708 tgl@sss.pgh.pa.us       15906                 :             31 :                     $$ = makeXmlExpr(IS_XMLCONCAT, NULL, NIL, $3, @1);
                              15907                 :                :                 }
                              15908                 :                :             | XMLELEMENT '(' NAME_P ColLabel ')'
                              15909                 :                :                 {
                              15910                 :              3 :                     $$ = makeXmlExpr(IS_XMLELEMENT, $4, NIL, NIL, @1);
                              15911                 :                :                 }
                              15912                 :                :             | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ')'
                              15913                 :                :                 {
                              15914                 :             18 :                     $$ = makeXmlExpr(IS_XMLELEMENT, $4, $6, NIL, @1);
                              15915                 :                :                 }
                              15916                 :                :             | XMLELEMENT '(' NAME_P ColLabel ',' expr_list ')'
                              15917                 :                :                 {
                              15918                 :             58 :                     $$ = makeXmlExpr(IS_XMLELEMENT, $4, NIL, $6, @1);
                              15919                 :                :                 }
                              15920                 :                :             | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ',' expr_list ')'
                              15921                 :                :                 {
                              15922                 :             10 :                     $$ = makeXmlExpr(IS_XMLELEMENT, $4, $6, $8, @1);
                              15923                 :                :                 }
                              15924                 :                :             | XMLEXISTS '(' c_expr xmlexists_argument ')'
                              15925                 :                :                 {
                              15926                 :                :                     /* xmlexists(A PASSING [BY REF] B [BY REF]) is
                              15927                 :                :                      * converted to xmlexists(A, B)*/
 1257                         15928                 :             27 :                     $$ = (Node *) makeFuncCall(SystemFuncName("xmlexists"),
                              15929                 :             27 :                                                list_make2($3, $4),
                              15930                 :                :                                                COERCE_SQL_SYNTAX,
                              15931                 :             27 :                                                @1);
                              15932                 :                :                 }
                              15933                 :                :             | XMLFOREST '(' xml_attribute_list ')'
                              15934                 :                :                 {
 5708                         15935                 :             16 :                     $$ = makeXmlExpr(IS_XMLFOREST, NULL, $3, NIL, @1);
                              15936                 :                :                 }
                              15937                 :                :             | XMLPARSE '(' document_or_content a_expr xml_whitespace_option ')'
                              15938                 :                :                 {
                              15939                 :                :                     XmlExpr *x = (XmlExpr *)
                              15940                 :             70 :                         makeXmlExpr(IS_XMLPARSE, NULL, NIL,
                              15941                 :             70 :                                     list_make2($4, makeBoolAConst($5, -1)),
                              15942                 :             70 :                                     @1);
                              15943                 :                : 
 6280 peter_e@gmx.net         15944                 :             70 :                     x->xmloption = $3;
  702 peter@eisentraut.org    15945                 :             70 :                     $$ = (Node *) x;
                              15946                 :                :                 }
                              15947                 :                :             | XMLPI '(' NAME_P ColLabel ')'
                              15948                 :                :                 {
 5708 tgl@sss.pgh.pa.us       15949                 :             15 :                     $$ = makeXmlExpr(IS_XMLPI, $4, NULL, NIL, @1);
                              15950                 :                :                 }
                              15951                 :                :             | XMLPI '(' NAME_P ColLabel ',' a_expr ')'
                              15952                 :                :                 {
                              15953                 :             25 :                     $$ = makeXmlExpr(IS_XMLPI, $4, NULL, list_make1($6), @1);
                              15954                 :                :                 }
                              15955                 :                :             | XMLROOT '(' a_expr ',' xml_root_version opt_xml_root_standalone ')'
                              15956                 :                :                 {
 6321                         15957                 :             34 :                     $$ = makeXmlExpr(IS_XMLROOT, NULL, NIL,
 5708                         15958                 :             34 :                                      list_make3($3, $5, $6), @1);
                              15959                 :                :                 }
                              15960                 :                :             | XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename xml_indent_option ')'
                              15961                 :                :                 {
 6280 peter_e@gmx.net         15962                 :             95 :                     XmlSerialize *n = makeNode(XmlSerialize);
                              15963                 :                : 
                              15964                 :             95 :                     n->xmloption = $3;
                              15965                 :             95 :                     n->expr = $4;
 5386                         15966                 :             95 :                     n->typeName = $6;
  396 tgl@sss.pgh.pa.us       15967                 :             95 :                     n->indent = $7;
 5708                         15968                 :             95 :                     n->location = @1;
  702 peter@eisentraut.org    15969                 :             95 :                     $$ = (Node *) n;
                              15970                 :                :                 }
                              15971                 :                :             | JSON_OBJECT '(' func_arg_list ')'
                              15972                 :                :                 {
                              15973                 :                :                     /* Support for legacy (non-standard) json_object() */
  382 alvherre@alvh.no-ip.    15974                 :             45 :                     $$ = (Node *) makeFuncCall(SystemFuncName("json_object"),
                              15975                 :             45 :                                                $3, COERCE_EXPLICIT_CALL, @1);
                              15976                 :                :                 }
                              15977                 :                :             | JSON_OBJECT '(' json_name_and_value_list
                              15978                 :                :                 json_object_constructor_null_clause_opt
                              15979                 :                :                 json_key_uniqueness_constraint_opt
                              15980                 :                :                 json_returning_clause_opt ')'
                              15981                 :                :                 {
                              15982                 :            141 :                     JsonObjectConstructor *n = makeNode(JsonObjectConstructor);
                              15983                 :                : 
                              15984                 :            141 :                     n->exprs = $3;
                              15985                 :            141 :                     n->absent_on_null = $4;
                              15986                 :            141 :                     n->unique = $5;
                              15987                 :            141 :                     n->output = (JsonOutput *) $6;
                              15988                 :            141 :                     n->location = @1;
                              15989                 :            141 :                     $$ = (Node *) n;
                              15990                 :                :                 }
                              15991                 :                :             | JSON_OBJECT '(' json_returning_clause_opt ')'
                              15992                 :                :                 {
                              15993                 :             44 :                     JsonObjectConstructor *n = makeNode(JsonObjectConstructor);
                              15994                 :                : 
                              15995                 :             44 :                     n->exprs = NULL;
                              15996                 :             44 :                     n->absent_on_null = false;
                              15997                 :             44 :                     n->unique = false;
                              15998                 :             44 :                     n->output = (JsonOutput *) $3;
                              15999                 :             44 :                     n->location = @1;
                              16000                 :             44 :                     $$ = (Node *) n;
                              16001                 :                :                 }
                              16002                 :                :             | JSON_ARRAY '('
                              16003                 :                :                 json_value_expr_list
                              16004                 :                :                 json_array_constructor_null_clause_opt
                              16005                 :                :                 json_returning_clause_opt
                              16006                 :                :             ')'
                              16007                 :                :                 {
                              16008                 :             48 :                     JsonArrayConstructor *n = makeNode(JsonArrayConstructor);
                              16009                 :                : 
                              16010                 :             48 :                     n->exprs = $3;
                              16011                 :             48 :                     n->absent_on_null = $4;
                              16012                 :             48 :                     n->output = (JsonOutput *) $5;
                              16013                 :             48 :                     n->location = @1;
                              16014                 :             48 :                     $$ = (Node *) n;
                              16015                 :                :                 }
                              16016                 :                :             | JSON_ARRAY '('
                              16017                 :                :                 select_no_parens
                              16018                 :                :                 json_format_clause_opt
                              16019                 :                :                 /* json_array_constructor_null_clause_opt */
                              16020                 :                :                 json_returning_clause_opt
                              16021                 :                :             ')'
                              16022                 :                :                 {
                              16023                 :             27 :                     JsonArrayQueryConstructor *n = makeNode(JsonArrayQueryConstructor);
                              16024                 :                : 
                              16025                 :             27 :                     n->query = $3;
                              16026                 :             27 :                     n->format = (JsonFormat *) $4;
                              16027                 :             27 :                     n->absent_on_null = true;    /* XXX */
                              16028                 :             27 :                     n->output = (JsonOutput *) $5;
                              16029                 :             27 :                     n->location = @1;
                              16030                 :             27 :                     $$ = (Node *) n;
                              16031                 :                :                 }
                              16032                 :                :             | JSON_ARRAY '('
                              16033                 :                :                 json_returning_clause_opt
                              16034                 :                :             ')'
                              16035                 :                :                 {
                              16036                 :             41 :                     JsonArrayConstructor *n = makeNode(JsonArrayConstructor);
                              16037                 :                : 
                              16038                 :             41 :                     n->exprs = NIL;
                              16039                 :             41 :                     n->absent_on_null = true;
                              16040                 :             41 :                     n->output = (JsonOutput *) $3;
                              16041                 :             41 :                     n->location = @1;
                              16042                 :             41 :                     $$ = (Node *) n;
                              16043                 :                :                 }
                              16044                 :                :             | JSON '(' json_value_expr json_key_uniqueness_constraint_opt ')'
                              16045                 :                :                 {
  269 amitlan@postgresql.o    16046                 :GNC          74 :                     JsonParseExpr *n = makeNode(JsonParseExpr);
                              16047                 :                : 
                              16048                 :             74 :                     n->expr = (JsonValueExpr *) $3;
                              16049                 :             74 :                     n->unique_keys = $4;
                              16050                 :             74 :                     n->output = NULL;
                              16051                 :             74 :                     n->location = @1;
                              16052                 :             74 :                     $$ = (Node *) n;
                              16053                 :                :                 }
                              16054                 :                :             | JSON_SCALAR '(' a_expr ')'
                              16055                 :                :                 {
                              16056                 :             49 :                     JsonScalarExpr *n = makeNode(JsonScalarExpr);
                              16057                 :                : 
                              16058                 :             49 :                     n->expr = (Expr *) $3;
                              16059                 :             49 :                     n->output = NULL;
                              16060                 :             49 :                     n->location = @1;
                              16061                 :             49 :                     $$ = (Node *) n;
                              16062                 :                :                 }
                              16063                 :                :             | JSON_SERIALIZE '(' json_value_expr json_returning_clause_opt ')'
                              16064                 :                :                 {
                              16065                 :             39 :                     JsonSerializeExpr *n = makeNode(JsonSerializeExpr);
                              16066                 :                : 
                              16067                 :             39 :                     n->expr = (JsonValueExpr *) $3;
                              16068                 :             39 :                     n->output = (JsonOutput *) $4;
                              16069                 :             39 :                     n->location = @1;
                              16070                 :             39 :                     $$ = (Node *) n;
                              16071                 :                :                 }
                              16072                 :                :             | MERGE_ACTION '(' ')'
                              16073                 :                :                 {
   28 dean.a.rasheed@gmail    16074                 :             84 :                     MergeSupportFunc *m = makeNode(MergeSupportFunc);
                              16075                 :                : 
                              16076                 :             84 :                     m->msftype = TEXTOID;
                              16077                 :             84 :                     m->location = @1;
                              16078                 :             84 :                     $$ = (Node *) m;
                              16079                 :                :                 }
                              16080                 :                :             | JSON_QUERY '('
                              16081                 :                :                 json_value_expr ',' a_expr json_passing_clause_opt
                              16082                 :                :                 json_returning_clause_opt
                              16083                 :                :                 json_wrapper_behavior
                              16084                 :                :                 json_quotes_clause_opt
                              16085                 :                :                 json_behavior_clause_opt
                              16086                 :                :             ')'
                              16087                 :                :                 {
   24 amitlan@postgresql.o    16088                 :            435 :                     JsonFuncExpr *n = makeNode(JsonFuncExpr);
                              16089                 :                : 
                              16090                 :            435 :                     n->op = JSON_QUERY_OP;
                              16091                 :            435 :                     n->context_item = (JsonValueExpr *) $3;
                              16092                 :            435 :                     n->pathspec = $5;
                              16093                 :            435 :                     n->passing = $6;
                              16094                 :            435 :                     n->output = (JsonOutput *) $7;
                              16095                 :            435 :                     n->wrapper = $8;
                              16096                 :            435 :                     n->quotes = $9;
                              16097                 :            435 :                     n->on_empty = (JsonBehavior *) linitial($10);
                              16098                 :            435 :                     n->on_error = (JsonBehavior *) lsecond($10);
                              16099                 :            435 :                     n->location = @1;
                              16100                 :            435 :                     $$ = (Node *) n;
                              16101                 :                :                 }
                              16102                 :                :             | JSON_EXISTS '('
                              16103                 :                :                 json_value_expr ',' a_expr json_passing_clause_opt
                              16104                 :                :                 json_on_error_clause_opt
                              16105                 :                :             ')'
                              16106                 :                :                 {
                              16107                 :             81 :                     JsonFuncExpr *n = makeNode(JsonFuncExpr);
                              16108                 :                : 
                              16109                 :             81 :                     n->op = JSON_EXISTS_OP;
                              16110                 :             81 :                     n->context_item = (JsonValueExpr *) $3;
                              16111                 :             81 :                     n->pathspec = $5;
                              16112                 :             81 :                     n->passing = $6;
                              16113                 :             81 :                     n->output = NULL;
                              16114                 :             81 :                     n->on_error = (JsonBehavior *) $7;
                              16115                 :             81 :                     n->location = @1;
                              16116                 :             81 :                     $$ = (Node *) n;
                              16117                 :                :                 }
                              16118                 :                :             | JSON_VALUE '('
                              16119                 :                :                 json_value_expr ',' a_expr json_passing_clause_opt
                              16120                 :                :                 json_returning_clause_opt
                              16121                 :                :                 json_behavior_clause_opt
                              16122                 :                :             ')'
                              16123                 :                :                 {
                              16124                 :            234 :                     JsonFuncExpr *n = makeNode(JsonFuncExpr);
                              16125                 :                : 
                              16126                 :            234 :                     n->op = JSON_VALUE_OP;
                              16127                 :            234 :                     n->context_item = (JsonValueExpr *) $3;
                              16128                 :            234 :                     n->pathspec = $5;
                              16129                 :            234 :                     n->passing = $6;
                              16130                 :            234 :                     n->output = (JsonOutput *) $7;
                              16131                 :            234 :                     n->on_empty = (JsonBehavior *) linitial($8);
                              16132                 :            234 :                     n->on_error = (JsonBehavior *) lsecond($8);
                              16133                 :            234 :                     n->location = @1;
                              16134                 :            234 :                     $$ = (Node *) n;
                              16135                 :                :                 }
                              16136                 :                :             ;
                              16137                 :                : 
                              16138                 :                : 
                              16139                 :                : /*
                              16140                 :                :  * SQL/XML support
                              16141                 :                :  */
                              16142                 :                : xml_root_version: VERSION_P a_expr
 6321 tgl@sss.pgh.pa.us       16143                 :CBC          12 :                 { $$ = $2; }
                              16144                 :                :             | VERSION_P NO VALUE_P
 5708                         16145                 :             22 :                 { $$ = makeNullAConst(-1); }
                              16146                 :                :         ;
                              16147                 :                : 
                              16148                 :                : opt_xml_root_standalone: ',' STANDALONE_P YES_P
                              16149                 :             13 :                 { $$ = makeIntConst(XML_STANDALONE_YES, -1); }
                              16150                 :                :             | ',' STANDALONE_P NO
                              16151                 :              6 :                 { $$ = makeIntConst(XML_STANDALONE_NO, -1); }
                              16152                 :                :             | ',' STANDALONE_P NO VALUE_P
                              16153                 :              6 :                 { $$ = makeIntConst(XML_STANDALONE_NO_VALUE, -1); }
                              16154                 :                :             | /*EMPTY*/
                              16155                 :              9 :                 { $$ = makeIntConst(XML_STANDALONE_OMITTED, -1); }
                              16156                 :                :         ;
                              16157                 :                : 
 6321                         16158                 :             28 : xml_attributes: XMLATTRIBUTES '(' xml_attribute_list ')'    { $$ = $3; }
                              16159                 :                :         ;
                              16160                 :                : 
 6324 peter_e@gmx.net         16161                 :             44 : xml_attribute_list: xml_attribute_el                    { $$ = list_make1($1); }
                              16162                 :             72 :             | xml_attribute_list ',' xml_attribute_el   { $$ = lappend($1, $3); }
                              16163                 :                :         ;
                              16164                 :                : 
                              16165                 :                : xml_attribute_el: a_expr AS ColLabel
                              16166                 :                :                 {
                              16167                 :             53 :                     $$ = makeNode(ResTarget);
                              16168                 :             53 :                     $$->name = $3;
 5706 tgl@sss.pgh.pa.us       16169                 :             53 :                     $$->indirection = NIL;
 6324 peter_e@gmx.net         16170                 :             53 :                     $$->val = (Node *) $1;
 6321 tgl@sss.pgh.pa.us       16171                 :             53 :                     $$->location = @1;
                              16172                 :                :                 }
                              16173                 :                :             | a_expr
                              16174                 :                :                 {
 6324 peter_e@gmx.net         16175                 :             63 :                     $$ = makeNode(ResTarget);
                              16176                 :             63 :                     $$->name = NULL;
 5706 tgl@sss.pgh.pa.us       16177                 :             63 :                     $$->indirection = NIL;
 6315                         16178                 :             63 :                     $$->val = (Node *) $1;
 6321                         16179                 :             63 :                     $$->location = @1;
                              16180                 :                :                 }
                              16181                 :                :         ;
                              16182                 :                : 
 6280 peter_e@gmx.net         16183                 :             81 : document_or_content: DOCUMENT_P                     { $$ = XMLOPTION_DOCUMENT; }
                              16184                 :             90 :             | CONTENT_P                             { $$ = XMLOPTION_CONTENT; }
                              16185                 :                :         ;
                              16186                 :                : 
  396 tgl@sss.pgh.pa.us       16187                 :             60 : xml_indent_option: INDENT                           { $$ = true; }
                              16188                 :             12 :             | NO INDENT                             { $$ = false; }
                              16189                 :             23 :             | /*EMPTY*/                             { $$ = false; }
                              16190                 :                :         ;
                              16191                 :                : 
 2433 peter_e@gmx.net         16192                 :UBC           0 : xml_whitespace_option: PRESERVE WHITESPACE_P        { $$ = true; }
 2433 peter_e@gmx.net         16193                 :CBC           1 :             | STRIP_P WHITESPACE_P                  { $$ = false; }
                              16194                 :             69 :             | /*EMPTY*/                             { $$ = false; }
                              16195                 :                :         ;
                              16196                 :                : 
                              16197                 :                : /* We allow several variants for SQL and other compatibility. */
                              16198                 :                : xmlexists_argument:
                              16199                 :                :             PASSING c_expr
                              16200                 :                :                 {
 5001                         16201                 :            113 :                     $$ = $2;
                              16202                 :                :                 }
                              16203                 :                :             | PASSING c_expr xml_passing_mech
                              16204                 :                :                 {
 5001 peter_e@gmx.net         16205                 :UBC           0 :                     $$ = $2;
                              16206                 :                :                 }
                              16207                 :                :             | PASSING xml_passing_mech c_expr
                              16208                 :                :                 {
 1865 alvherre@alvh.no-ip.    16209                 :CBC          21 :                     $$ = $3;
                              16210                 :                :                 }
                              16211                 :                :             | PASSING xml_passing_mech c_expr xml_passing_mech
                              16212                 :                :                 {
                              16213                 :              3 :                     $$ = $3;
                              16214                 :                :                 }
                              16215                 :                :         ;
                              16216                 :                : 
                              16217                 :                : xml_passing_mech:
                              16218                 :                :             BY REF_P
                              16219                 :                :             | BY VALUE_P
                              16220                 :                :         ;
                              16221                 :                : 
                              16222                 :                : 
                              16223                 :                : /*
                              16224                 :                :  * Aggregate decoration clauses
                              16225                 :                :  */
                              16226                 :                : within_group_clause:
 3765 tgl@sss.pgh.pa.us       16227                 :            174 :             WITHIN GROUP_P '(' sort_clause ')'      { $$ = $4; }
                              16228                 :         151779 :             | /*EMPTY*/                             { $$ = NIL; }
                              16229                 :                :         ;
                              16230                 :                : 
                              16231                 :                : filter_clause:
                              16232                 :            418 :             FILTER '(' WHERE a_expr ')'             { $$ = $4; }
                              16233                 :         151688 :             | /*EMPTY*/                             { $$ = NULL; }
                              16234                 :                :         ;
                              16235                 :                : 
                              16236                 :                : 
                              16237                 :                : /*
                              16238                 :                :  * Window Definitions
                              16239                 :                :  */
                              16240                 :                : window_clause:
 5586                         16241                 :            264 :             WINDOW window_definition_list           { $$ = $2; }
                              16242                 :         233400 :             | /*EMPTY*/                             { $$ = NIL; }
                              16243                 :                :         ;
                              16244                 :                : 
                              16245                 :                : window_definition_list:
                              16246                 :            264 :             window_definition                       { $$ = list_make1($1); }
                              16247                 :                :             | window_definition_list ',' window_definition
                              16248                 :              6 :                                                     { $$ = lappend($1, $3); }
                              16249                 :                :         ;
                              16250                 :                : 
                              16251                 :                : window_definition:
                              16252                 :                :             ColId AS window_specification
                              16253                 :                :                 {
  702 peter@eisentraut.org    16254                 :            270 :                     WindowDef  *n = $3;
                              16255                 :                : 
 5586 tgl@sss.pgh.pa.us       16256                 :            270 :                     n->name = $1;
                              16257                 :            270 :                     $$ = n;
                              16258                 :                :                 }
                              16259                 :                :         ;
                              16260                 :                : 
                              16261                 :                : over_clause: OVER window_specification
                              16262                 :           1229 :                 { $$ = $2; }
                              16263                 :                :             | OVER ColId
                              16264                 :                :                 {
  702 peter@eisentraut.org    16265                 :            471 :                     WindowDef  *n = makeNode(WindowDef);
                              16266                 :                : 
 5583 tgl@sss.pgh.pa.us       16267                 :            471 :                     n->name = $2;
                              16268                 :            471 :                     n->refname = NULL;
 5586                         16269                 :            471 :                     n->partitionClause = NIL;
                              16270                 :            471 :                     n->orderClause = NIL;
 5583                         16271                 :            471 :                     n->frameOptions = FRAMEOPTION_DEFAULTS;
 5175                         16272                 :            471 :                     n->startOffset = NULL;
                              16273                 :            471 :                     n->endOffset = NULL;
 5586                         16274                 :            471 :                     n->location = @2;
                              16275                 :            471 :                     $$ = n;
                              16276                 :                :                 }
                              16277                 :                :             | /*EMPTY*/
                              16278                 :         150403 :                 { $$ = NULL; }
                              16279                 :                :         ;
                              16280                 :                : 
                              16281                 :                : window_specification: '(' opt_existing_window_name opt_partition_clause
                              16282                 :                :                         opt_sort_clause opt_frame_clause ')'
                              16283                 :                :                 {
  702 peter@eisentraut.org    16284                 :           1499 :                     WindowDef  *n = makeNode(WindowDef);
                              16285                 :                : 
 5586 tgl@sss.pgh.pa.us       16286                 :           1499 :                     n->name = NULL;
                              16287                 :           1499 :                     n->refname = $2;
                              16288                 :           1499 :                     n->partitionClause = $3;
                              16289                 :           1499 :                     n->orderClause = $4;
                              16290                 :                :                     /* copy relevant fields of opt_frame_clause */
 5175                         16291                 :           1499 :                     n->frameOptions = $5->frameOptions;
                              16292                 :           1499 :                     n->startOffset = $5->startOffset;
                              16293                 :           1499 :                     n->endOffset = $5->endOffset;
 5586                         16294                 :           1499 :                     n->location = @1;
                              16295                 :           1499 :                     $$ = n;
                              16296                 :                :                 }
                              16297                 :                :         ;
                              16298                 :                : 
                              16299                 :                : /*
                              16300                 :                :  * If we see PARTITION, RANGE, ROWS or GROUPS as the first token after the '('
                              16301                 :                :  * of a window_specification, we want the assumption to be that there is
                              16302                 :                :  * no existing_window_name; but those keywords are unreserved and so could
                              16303                 :                :  * be ColIds.  We fix this by making them have the same precedence as IDENT
                              16304                 :                :  * and giving the empty production here a slightly higher precedence, so
                              16305                 :                :  * that the shift/reduce conflict is resolved in favor of reducing the rule.
                              16306                 :                :  * These keywords are thus precluded from being an existing_window_name but
                              16307                 :                :  * are not reserved for any other purpose.
                              16308                 :                :  */
                              16309                 :             15 : opt_existing_window_name: ColId                     { $$ = $1; }
                              16310                 :           1487 :             | /*EMPTY*/             %prec Op        { $$ = NULL; }
                              16311                 :                :         ;
                              16312                 :                : 
                              16313                 :            410 : opt_partition_clause: PARTITION BY expr_list        { $$ = $3; }
                              16314                 :           1089 :             | /*EMPTY*/                             { $$ = NIL; }
                              16315                 :                :         ;
                              16316                 :                : 
                              16317                 :                : /*
                              16318                 :                :  * For frame clauses, we return a WindowDef, but only some fields are used:
                              16319                 :                :  * frameOptions, startOffset, and endOffset.
                              16320                 :                :  */
                              16321                 :                : opt_frame_clause:
                              16322                 :                :             RANGE frame_extent opt_window_exclusion_clause
                              16323                 :                :                 {
  702 peter@eisentraut.org    16324                 :            398 :                     WindowDef  *n = $2;
                              16325                 :                : 
 5175 tgl@sss.pgh.pa.us       16326                 :            398 :                     n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_RANGE;
 2258                         16327                 :            398 :                     n->frameOptions |= $3;
 5175                         16328                 :            398 :                     $$ = n;
                              16329                 :                :                 }
                              16330                 :                :             | ROWS frame_extent opt_window_exclusion_clause
                              16331                 :                :                 {
  702 peter@eisentraut.org    16332                 :            309 :                     WindowDef  *n = $2;
                              16333                 :                : 
 5175 tgl@sss.pgh.pa.us       16334                 :            309 :                     n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_ROWS;
 2258                         16335                 :            309 :                     n->frameOptions |= $3;
                              16336                 :            309 :                     $$ = n;
                              16337                 :                :                 }
                              16338                 :                :             | GROUPS frame_extent opt_window_exclusion_clause
                              16339                 :                :                 {
  702 peter@eisentraut.org    16340                 :            102 :                     WindowDef  *n = $2;
                              16341                 :                : 
 2258 tgl@sss.pgh.pa.us       16342                 :            102 :                     n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_GROUPS;
                              16343                 :            102 :                     n->frameOptions |= $3;
 5175                         16344                 :            102 :                     $$ = n;
                              16345                 :                :                 }
                              16346                 :                :             | /*EMPTY*/
                              16347                 :                :                 {
  702 peter@eisentraut.org    16348                 :            690 :                     WindowDef  *n = makeNode(WindowDef);
                              16349                 :                : 
 5175 tgl@sss.pgh.pa.us       16350                 :            690 :                     n->frameOptions = FRAMEOPTION_DEFAULTS;
                              16351                 :            690 :                     n->startOffset = NULL;
                              16352                 :            690 :                     n->endOffset = NULL;
                              16353                 :            690 :                     $$ = n;
                              16354                 :                :                 }
                              16355                 :                :         ;
                              16356                 :                : 
                              16357                 :                : frame_extent: frame_bound
                              16358                 :                :                 {
  702 peter@eisentraut.org    16359                 :              3 :                     WindowDef  *n = $1;
                              16360                 :                : 
                              16361                 :                :                     /* reject invalid cases */
 5175 tgl@sss.pgh.pa.us       16362         [ -  + ]:              3 :                     if (n->frameOptions & FRAMEOPTION_START_UNBOUNDED_FOLLOWING)
 5583 tgl@sss.pgh.pa.us       16363         [ #  # ]:UBC           0 :                         ereport(ERROR,
                              16364                 :                :                                 (errcode(ERRCODE_WINDOWING_ERROR),
                              16365                 :                :                                  errmsg("frame start cannot be UNBOUNDED FOLLOWING"),
                              16366                 :                :                                  parser_errposition(@1)));
 2258 tgl@sss.pgh.pa.us       16367         [ -  + ]:CBC           3 :                     if (n->frameOptions & FRAMEOPTION_START_OFFSET_FOLLOWING)
 5583 tgl@sss.pgh.pa.us       16368         [ #  # ]:UBC           0 :                         ereport(ERROR,
                              16369                 :                :                                 (errcode(ERRCODE_WINDOWING_ERROR),
                              16370                 :                :                                  errmsg("frame starting from following row cannot end with current row"),
                              16371                 :                :                                  parser_errposition(@1)));
 5175 tgl@sss.pgh.pa.us       16372                 :CBC           3 :                     n->frameOptions |= FRAMEOPTION_END_CURRENT_ROW;
                              16373                 :              3 :                     $$ = n;
                              16374                 :                :                 }
                              16375                 :                :             | BETWEEN frame_bound AND frame_bound
                              16376                 :                :                 {
  702 peter@eisentraut.org    16377                 :            806 :                     WindowDef  *n1 = $2;
                              16378                 :            806 :                     WindowDef  *n2 = $4;
                              16379                 :                : 
                              16380                 :                :                     /* form merged options */
 5175 tgl@sss.pgh.pa.us       16381                 :            806 :                     int     frameOptions = n1->frameOptions;
                              16382                 :                :                     /* shift converts START_ options to END_ options */
                              16383                 :            806 :                     frameOptions |= n2->frameOptions << 1;
                              16384                 :            806 :                     frameOptions |= FRAMEOPTION_BETWEEN;
                              16385                 :                :                     /* reject invalid cases */
                              16386         [ -  + ]:            806 :                     if (frameOptions & FRAMEOPTION_START_UNBOUNDED_FOLLOWING)
 5583 tgl@sss.pgh.pa.us       16387         [ #  # ]:UBC           0 :                         ereport(ERROR,
                              16388                 :                :                                 (errcode(ERRCODE_WINDOWING_ERROR),
                              16389                 :                :                                  errmsg("frame start cannot be UNBOUNDED FOLLOWING"),
                              16390                 :                :                                  parser_errposition(@2)));
 5175 tgl@sss.pgh.pa.us       16391         [ -  + ]:CBC         806 :                     if (frameOptions & FRAMEOPTION_END_UNBOUNDED_PRECEDING)
 5583 tgl@sss.pgh.pa.us       16392         [ #  # ]:UBC           0 :                         ereport(ERROR,
                              16393                 :                :                                 (errcode(ERRCODE_WINDOWING_ERROR),
                              16394                 :                :                                  errmsg("frame end cannot be UNBOUNDED PRECEDING"),
                              16395                 :                :                                  parser_errposition(@4)));
 5175 tgl@sss.pgh.pa.us       16396         [ +  + ]:CBC         806 :                     if ((frameOptions & FRAMEOPTION_START_CURRENT_ROW) &&
 2258                         16397         [ -  + ]:            230 :                         (frameOptions & FRAMEOPTION_END_OFFSET_PRECEDING))
 5175 tgl@sss.pgh.pa.us       16398         [ #  # ]:UBC           0 :                         ereport(ERROR,
                              16399                 :                :                                 (errcode(ERRCODE_WINDOWING_ERROR),
                              16400                 :                :                                  errmsg("frame starting from current row cannot have preceding rows"),
                              16401                 :                :                                  parser_errposition(@4)));
 2258 tgl@sss.pgh.pa.us       16402         [ +  + ]:CBC         806 :                     if ((frameOptions & FRAMEOPTION_START_OFFSET_FOLLOWING) &&
                              16403         [ -  + ]:             84 :                         (frameOptions & (FRAMEOPTION_END_OFFSET_PRECEDING |
                              16404                 :                :                                          FRAMEOPTION_END_CURRENT_ROW)))
 5175 tgl@sss.pgh.pa.us       16405         [ #  # ]:UBC           0 :                         ereport(ERROR,
                              16406                 :                :                                 (errcode(ERRCODE_WINDOWING_ERROR),
                              16407                 :                :                                  errmsg("frame starting from following row cannot have preceding rows"),
                              16408                 :                :                                  parser_errposition(@4)));
 5175 tgl@sss.pgh.pa.us       16409                 :CBC         806 :                     n1->frameOptions = frameOptions;
                              16410                 :            806 :                     n1->endOffset = n2->startOffset;
                              16411                 :            806 :                     $$ = n1;
                              16412                 :                :                 }
                              16413                 :                :         ;
                              16414                 :                : 
                              16415                 :                : /*
                              16416                 :                :  * This is used for both frame start and frame end, with output set up on
                              16417                 :                :  * the assumption it's frame start; the frame_extent productions must reject
                              16418                 :                :  * invalid cases.
                              16419                 :                :  */
                              16420                 :                : frame_bound:
                              16421                 :                :             UNBOUNDED PRECEDING
                              16422                 :                :                 {
  702 peter@eisentraut.org    16423                 :             99 :                     WindowDef  *n = makeNode(WindowDef);
                              16424                 :                : 
 5175 tgl@sss.pgh.pa.us       16425                 :             99 :                     n->frameOptions = FRAMEOPTION_START_UNBOUNDED_PRECEDING;
                              16426                 :             99 :                     n->startOffset = NULL;
                              16427                 :             99 :                     n->endOffset = NULL;
                              16428                 :             99 :                     $$ = n;
                              16429                 :                :                 }
                              16430                 :                :             | UNBOUNDED FOLLOWING
                              16431                 :                :                 {
  702 peter@eisentraut.org    16432                 :            188 :                     WindowDef  *n = makeNode(WindowDef);
                              16433                 :                : 
 5175 tgl@sss.pgh.pa.us       16434                 :            188 :                     n->frameOptions = FRAMEOPTION_START_UNBOUNDED_FOLLOWING;
                              16435                 :            188 :                     n->startOffset = NULL;
                              16436                 :            188 :                     n->endOffset = NULL;
                              16437                 :            188 :                     $$ = n;
                              16438                 :                :                 }
                              16439                 :                :             | CURRENT_P ROW
                              16440                 :                :                 {
  702 peter@eisentraut.org    16441                 :            302 :                     WindowDef  *n = makeNode(WindowDef);
                              16442                 :                : 
 5175 tgl@sss.pgh.pa.us       16443                 :            302 :                     n->frameOptions = FRAMEOPTION_START_CURRENT_ROW;
                              16444                 :            302 :                     n->startOffset = NULL;
                              16445                 :            302 :                     n->endOffset = NULL;
                              16446                 :            302 :                     $$ = n;
                              16447                 :                :                 }
                              16448                 :                :             | a_expr PRECEDING
                              16449                 :                :                 {
  702 peter@eisentraut.org    16450                 :            450 :                     WindowDef  *n = makeNode(WindowDef);
                              16451                 :                : 
 2258 tgl@sss.pgh.pa.us       16452                 :            450 :                     n->frameOptions = FRAMEOPTION_START_OFFSET_PRECEDING;
 5175                         16453                 :            450 :                     n->startOffset = $1;
                              16454                 :            450 :                     n->endOffset = NULL;
                              16455                 :            450 :                     $$ = n;
                              16456                 :                :                 }
                              16457                 :                :             | a_expr FOLLOWING
                              16458                 :                :                 {
  702 peter@eisentraut.org    16459                 :            576 :                     WindowDef  *n = makeNode(WindowDef);
                              16460                 :                : 
 2258 tgl@sss.pgh.pa.us       16461                 :            576 :                     n->frameOptions = FRAMEOPTION_START_OFFSET_FOLLOWING;
 5175                         16462                 :            576 :                     n->startOffset = $1;
                              16463                 :            576 :                     n->endOffset = NULL;
                              16464                 :            576 :                     $$ = n;
                              16465                 :                :                 }
                              16466                 :                :         ;
                              16467                 :                : 
                              16468                 :                : opt_window_exclusion_clause:
 2258                         16469                 :             42 :             EXCLUDE CURRENT_P ROW   { $$ = FRAMEOPTION_EXCLUDE_CURRENT_ROW; }
                              16470                 :             48 :             | EXCLUDE GROUP_P       { $$ = FRAMEOPTION_EXCLUDE_GROUP; }
                              16471                 :             75 :             | EXCLUDE TIES          { $$ = FRAMEOPTION_EXCLUDE_TIES; }
                              16472                 :              9 :             | EXCLUDE NO OTHERS     { $$ = 0; }
                              16473                 :            635 :             | /*EMPTY*/             { $$ = 0; }
                              16474                 :                :         ;
                              16475                 :                : 
                              16476                 :                : 
                              16477                 :                : /*
                              16478                 :                :  * Supporting nonterminals for expressions.
                              16479                 :                :  */
                              16480                 :                : 
                              16481                 :                : /* Explicit row production.
                              16482                 :                :  *
                              16483                 :                :  * SQL99 allows an optional ROW keyword, so we can now do single-element rows
                              16484                 :                :  * without conflicting with the parenthesized a_expr production.  Without the
                              16485                 :                :  * ROW keyword, there must be more than one a_expr inside the parens.
                              16486                 :                :  */
 7279 tgl@sss.pgh.pa.us       16487                 :UBC           0 : row:        ROW '(' expr_list ')'                   { $$ = $3; }
                              16488                 :              0 :             | ROW '(' ')'                           { $$ = NIL; }
 7279 tgl@sss.pgh.pa.us       16489                 :CBC         768 :             | '(' expr_list ',' a_expr ')'          { $$ = lappend($2, $4); }
                              16490                 :                :         ;
                              16491                 :                : 
 3256 andres@anarazel.de      16492                 :           1874 : explicit_row:   ROW '(' expr_list ')'               { $$ = $3; }
                              16493                 :             15 :             | ROW '(' ')'                           { $$ = NIL; }
                              16494                 :                :         ;
                              16495                 :                : 
                              16496                 :           1050 : implicit_row:   '(' expr_list ',' a_expr ')'        { $$ = lappend($2, $4); }
                              16497                 :                :         ;
                              16498                 :                : 
 7279 tgl@sss.pgh.pa.us       16499                 :           7182 : sub_type:   ANY                                     { $$ = ANY_SUBLINK; }
 7279 tgl@sss.pgh.pa.us       16500                 :UBC           0 :             | SOME                                  { $$ = ANY_SUBLINK; }
 7279 tgl@sss.pgh.pa.us       16501                 :CBC         162 :             | ALL                                   { $$ = ALL_SUBLINK; }
                              16502                 :                :         ;
                              16503                 :                : 
                              16504                 :           5325 : all_Op:     Op                                      { $$ = $1; }
                              16505                 :          12156 :             | MathOp                                { $$ = $1; }
                              16506                 :                :         ;
                              16507                 :                : 
                              16508                 :             19 : MathOp:      '+'                                    { $$ = "+"; }
                              16509                 :             23 :             | '-'                                   { $$ = "-"; }
                              16510                 :              6 :             | '*'                                   { $$ = "*"; }
 7279 tgl@sss.pgh.pa.us       16511                 :UBC           0 :             | '/'                                   { $$ = "/"; }
 7279 tgl@sss.pgh.pa.us       16512                 :CBC           4 :             | '%'                                   { $$ = "%"; }
 7279 tgl@sss.pgh.pa.us       16513                 :UBC           0 :             | '^'                                   { $$ = "^"; }
 7279 tgl@sss.pgh.pa.us       16514                 :CBC         373 :             | '<'                                    { $$ = "<"; }
                              16515                 :            294 :             | '>'                                    { $$ = ">"; }
                              16516                 :          10605 :             | '='                                   { $$ = "="; }
 3322                         16517                 :            306 :             | LESS_EQUALS                           { $$ = "<="; }
                              16518                 :            302 :             | GREATER_EQUALS                        { $$ = ">="; }
                              16519                 :            224 :             | NOT_EQUALS                            { $$ = "<>"; }
                              16520                 :                :         ;
                              16521                 :                : 
                              16522                 :                : qual_Op:    Op
 7259 neilc@samurai.com       16523                 :          20229 :                     { $$ = list_make1(makeString($1)); }
                              16524                 :                :             | OPERATOR '(' any_operator ')'
 7279 tgl@sss.pgh.pa.us       16525                 :           6927 :                     { $$ = $3; }
                              16526                 :                :         ;
                              16527                 :                : 
                              16528                 :                : qual_all_Op:
                              16529                 :                :             all_Op
 7259 neilc@samurai.com       16530                 :            707 :                     { $$ = list_make1(makeString($1)); }
                              16531                 :                :             | OPERATOR '(' any_operator ')'
 7279 tgl@sss.pgh.pa.us       16532                 :             17 :                     { $$ = $3; }
                              16533                 :                :         ;
                              16534                 :                : 
                              16535                 :                : subquery_Op:
                              16536                 :                :             all_Op
 7259 neilc@samurai.com       16537                 :           7209 :                     { $$ = list_make1(makeString($1)); }
                              16538                 :                :             | OPERATOR '(' any_operator ')'
 7279 tgl@sss.pgh.pa.us       16539                 :            118 :                     { $$ = $3; }
                              16540                 :                :             | LIKE
 7259 neilc@samurai.com       16541                 :             12 :                     { $$ = list_make1(makeString("~~")); }
                              16542                 :                :             | NOT_LA LIKE
                              16543                 :              6 :                     { $$ = list_make1(makeString("!~~")); }
                              16544                 :                :             | ILIKE
                              16545                 :              6 :                     { $$ = list_make1(makeString("~~*")); }
                              16546                 :                :             | NOT_LA ILIKE
 7259 neilc@samurai.com       16547                 :UBC           0 :                     { $$ = list_make1(makeString("!~~*")); }
                              16548                 :                : /* cannot put SIMILAR TO here, because SIMILAR TO is a hack.
                              16549                 :                :  * the regular expression is preprocessed by a function (similar_to_escape),
                              16550                 :                :  * and the ~ operator for posix regular expressions is used.
                              16551                 :                :  *        x SIMILAR TO y     ->    x ~ similar_to_escape(y)
                              16552                 :                :  * this transformation is made on the fly by the parser upwards.
                              16553                 :                :  * however the SubLink structure which handles any/some/all stuff
                              16554                 :                :  * is not ready for such a thing.
                              16555                 :                :  */
                              16556                 :                :             ;
                              16557                 :                : 
                              16558                 :                : expr_list:  a_expr
                              16559                 :                :                 {
 7257 tgl@sss.pgh.pa.us       16560                 :CBC       75099 :                     $$ = list_make1($1);
                              16561                 :                :                 }
                              16562                 :                :             | expr_list ',' a_expr
                              16563                 :                :                 {
                              16564                 :          69251 :                     $$ = lappend($1, $3);
                              16565                 :                :                 }
                              16566                 :                :         ;
                              16567                 :                : 
                              16568                 :                : /* function arguments can have names */
                              16569                 :                : func_arg_list:  func_arg_expr
                              16570                 :                :                 {
 5302                         16571                 :         143130 :                     $$ = list_make1($1);
                              16572                 :                :                 }
                              16573                 :                :             | func_arg_list ',' func_arg_expr
                              16574                 :                :                 {
                              16575                 :         105208 :                     $$ = lappend($1, $3);
                              16576                 :                :                 }
                              16577                 :                :         ;
                              16578                 :                : 
                              16579                 :                : func_arg_expr:  a_expr
                              16580                 :                :                 {
                              16581                 :         223212 :                     $$ = $1;
                              16582                 :                :                 }
                              16583                 :                :             | param_name COLON_EQUALS a_expr
                              16584                 :                :                 {
                              16585                 :          24968 :                     NamedArgExpr *na = makeNode(NamedArgExpr);
                              16586                 :                : 
 5068                         16587                 :          24968 :                     na->name = $1;
                              16588                 :          24968 :                     na->arg = (Expr *) $3;
 5302                         16589                 :          24968 :                     na->argnumber = -1;      /* until determined */
 5068                         16590                 :          24968 :                     na->location = @1;
 5302                         16591                 :          24968 :                     $$ = (Node *) na;
                              16592                 :                :                 }
                              16593                 :                :             | param_name EQUALS_GREATER a_expr
                              16594                 :                :                 {
 3323 rhaas@postgresql.org    16595                 :            506 :                     NamedArgExpr *na = makeNode(NamedArgExpr);
                              16596                 :                : 
                              16597                 :            506 :                     na->name = $1;
                              16598                 :            506 :                     na->arg = (Expr *) $3;
                              16599                 :            506 :                     na->argnumber = -1;      /* until determined */
                              16600                 :            506 :                     na->location = @1;
                              16601                 :            506 :                     $$ = (Node *) na;
                              16602                 :                :                 }
                              16603                 :                :         ;
                              16604                 :                : 
 1257 tgl@sss.pgh.pa.us       16605                 :             93 : func_arg_list_opt:  func_arg_list                   { $$ = $1; }
 1257 tgl@sss.pgh.pa.us       16606                 :UBC           0 :             | /*EMPTY*/                             { $$ = NIL; }
                              16607                 :                :         ;
                              16608                 :                : 
 6291 tgl@sss.pgh.pa.us       16609                 :CBC         868 : type_list:  Typename                                { $$ = list_make1($1); }
                              16610                 :            191 :             | type_list ',' Typename                { $$ = lappend($1, $3); }
                              16611                 :                :         ;
                              16612                 :                : 
                              16613                 :                : array_expr: '[' expr_list ']'
                              16614                 :                :                 {
 5708                         16615                 :           3810 :                     $$ = makeAArrayExpr($2, @1);
                              16616                 :                :                 }
                              16617                 :                :             | '[' array_expr_list ']'
                              16618                 :                :                 {
                              16619                 :            203 :                     $$ = makeAArrayExpr($2, @1);
                              16620                 :                :                 }
                              16621                 :                :             | '[' ']'
                              16622                 :                :                 {
                              16623                 :             44 :                     $$ = makeAArrayExpr(NIL, @1);
                              16624                 :                :                 }
                              16625                 :                :         ;
                              16626                 :                : 
 5869                         16627                 :            203 : array_expr_list: array_expr                         { $$ = list_make1($1); }
                              16628                 :            165 :             | array_expr_list ',' array_expr        { $$ = lappend($1, $3); }
                              16629                 :                :         ;
                              16630                 :                : 
                              16631                 :                : 
                              16632                 :                : extract_list:
                              16633                 :                :             extract_arg FROM a_expr
                              16634                 :                :                 {
 5708                         16635                 :            596 :                     $$ = list_make2(makeStringConst($1, @1), $3);
                              16636                 :                :                 }
                              16637                 :                :         ;
                              16638                 :                : 
                              16639                 :                : /* Allow delimited string Sconst in extract_arg as an SQL extension.
                              16640                 :                :  * - thomas 2001-04-12
                              16641                 :                :  */
                              16642                 :                : extract_arg:
 7972 bruce@momjian.us        16643                 :            491 :             IDENT                                   { $$ = $1; }
                              16644                 :             27 :             | YEAR_P                                { $$ = "year"; }
                              16645                 :             18 :             | MONTH_P                               { $$ = "month"; }
                              16646                 :             24 :             | DAY_P                                 { $$ = "day"; }
                              16647                 :             12 :             | HOUR_P                                { $$ = "hour"; }
                              16648                 :             12 :             | MINUTE_P                              { $$ = "minute"; }
                              16649                 :             12 :             | SECOND_P                              { $$ = "second"; }
 5632 meskes@postgresql.or    16650                 :UBC           0 :             | Sconst                                { $$ = $1; }
                              16651                 :                :         ;
                              16652                 :                : 
                              16653                 :                : unicode_normal_form:
 1257 tgl@sss.pgh.pa.us       16654                 :CBC          12 :             NFC                                     { $$ = "NFC"; }
                              16655                 :              6 :             | NFD                                   { $$ = "NFD"; }
                              16656                 :              9 :             | NFKC                                  { $$ = "NFKC"; }
                              16657                 :              9 :             | NFKD                                  { $$ = "NFKD"; }
                              16658                 :                :         ;
                              16659                 :                : 
                              16660                 :                : /* OVERLAY() arguments */
                              16661                 :                : overlay_list:
                              16662                 :                :             a_expr PLACING a_expr FROM a_expr FOR a_expr
                              16663                 :                :                 {
                              16664                 :                :                     /* overlay(A PLACING B FROM C FOR D) is converted to overlay(A, B, C, D) */
 1385 peter@eisentraut.org    16665                 :             17 :                     $$ = list_make4($1, $3, $5, $7);
                              16666                 :                :                 }
                              16667                 :                :             | a_expr PLACING a_expr FROM a_expr
                              16668                 :                :                 {
                              16669                 :                :                     /* overlay(A PLACING B FROM C) is converted to overlay(A, B, C) */
                              16670                 :             24 :                     $$ = list_make3($1, $3, $5);
                              16671                 :                :                 }
                              16672                 :                :         ;
                              16673                 :                : 
                              16674                 :                : /* position_list uses b_expr not a_expr to avoid conflict with general IN */
                              16675                 :                : position_list:
 7259 neilc@samurai.com       16676                 :            174 :             b_expr IN_P b_expr                      { $$ = list_make2($3, $1); }
                              16677                 :                :         ;
                              16678                 :                : 
                              16679                 :                : /*
                              16680                 :                :  * SUBSTRING() arguments
                              16681                 :                :  *
                              16682                 :                :  * Note that SQL:1999 has both
                              16683                 :                :  *     text FROM int FOR int
                              16684                 :                :  * and
                              16685                 :                :  *     text FROM pattern FOR escape
                              16686                 :                :  *
                              16687                 :                :  * In the parser we map them both to a call to the substring() function and
                              16688                 :                :  * rely on type resolution to pick the right one.
                              16689                 :                :  *
                              16690                 :                :  * In SQL:2003, the second variant was changed to
                              16691                 :                :  *     text SIMILAR pattern ESCAPE escape
                              16692                 :                :  * We could in theory map that to a different function internally, but
                              16693                 :                :  * since we still support the SQL:1999 version, we don't.  However,
                              16694                 :                :  * ruleutils.c will reverse-list the call in the newer style.
                              16695                 :                :  */
                              16696                 :                : substr_list:
                              16697                 :                :             a_expr FROM a_expr FOR a_expr
                              16698                 :                :                 {
 1385 peter@eisentraut.org    16699                 :             61 :                     $$ = list_make3($1, $3, $5);
                              16700                 :                :                 }
                              16701                 :                :             | a_expr FOR a_expr FROM a_expr
                              16702                 :                :                 {
                              16703                 :                :                     /* not legal per SQL, but might as well allow it */
 1385 peter@eisentraut.org    16704                 :UBC           0 :                     $$ = list_make3($1, $5, $3);
                              16705                 :                :                 }
                              16706                 :                :             | a_expr FROM a_expr
                              16707                 :                :                 {
                              16708                 :                :                     /*
                              16709                 :                :                      * Because we aren't restricting data types here, this
                              16710                 :                :                      * syntax can end up resolving to textregexsubstr().
                              16711                 :                :                      * We've historically allowed that to happen, so continue
                              16712                 :                :                      * to accept it.  However, ruleutils.c will reverse-list
                              16713                 :                :                      * such a call in regular function call syntax.
                              16714                 :                :                      */
 1385 peter@eisentraut.org    16715                 :CBC         152 :                     $$ = list_make2($1, $3);
                              16716                 :                :                 }
                              16717                 :                :             | a_expr FOR a_expr
                              16718                 :                :                 {
                              16719                 :                :                     /* not legal per SQL */
                              16720                 :                : 
                              16721                 :                :                     /*
                              16722                 :                :                      * Since there are no cases where this syntax allows
                              16723                 :                :                      * a textual FOR value, we forcibly cast the argument
                              16724                 :                :                      * to int4.  The possible matches in pg_proc are
                              16725                 :                :                      * substring(text,int4) and substring(text,text),
                              16726                 :                :                      * and we don't want the parser to choose the latter,
                              16727                 :                :                      * which it is likely to do if the second argument
                              16728                 :                :                      * is unknown or doesn't have an implicit cast to int4.
                              16729                 :                :                      */
 5708 tgl@sss.pgh.pa.us       16730                 :             18 :                     $$ = list_make3($1, makeIntConst(1, -1),
                              16731                 :                :                                     makeTypeCast($3,
                              16732                 :                :                                                  SystemTypeName("int4"), -1));
                              16733                 :                :                 }
                              16734                 :                :             | a_expr SIMILAR a_expr ESCAPE a_expr
                              16735                 :                :                 {
 1385 peter@eisentraut.org    16736                 :             80 :                     $$ = list_make3($1, $3, $5);
                              16737                 :                :                 }
                              16738                 :                :         ;
                              16739                 :                : 
 7972 bruce@momjian.us        16740                 :            279 : trim_list:  a_expr FROM expr_list                   { $$ = lappend($3, $1); }
                              16741                 :             12 :             | FROM expr_list                        { $$ = $2; }
                              16742                 :             43 :             | expr_list                             { $$ = $1; }
                              16743                 :                :         ;
                              16744                 :                : 
                              16745                 :                : in_expr:    select_with_parens
                              16746                 :                :                 {
  702 peter@eisentraut.org    16747                 :           1196 :                     SubLink    *n = makeNode(SubLink);
                              16748                 :                : 
 9584 bruce@momjian.us        16749                 :           1196 :                     n->subselect = $1;
                              16750                 :                :                     /* other fields will be filled later */
  702 peter@eisentraut.org    16751                 :           1196 :                     $$ = (Node *) n;
                              16752                 :                :                 }
                              16753                 :           8418 :             | '(' expr_list ')'                     { $$ = (Node *) $2; }
                              16754                 :                :         ;
                              16755                 :                : 
                              16756                 :                : /*
                              16757                 :                :  * Define SQL-style CASE clause.
                              16758                 :                :  * - Full specification
                              16759                 :                :  *  CASE WHEN a = b THEN c ... ELSE d END
                              16760                 :                :  * - Implicit argument
                              16761                 :                :  *  CASE a WHEN b THEN c ... ELSE d END
                              16762                 :                :  */
                              16763                 :                : case_expr:  CASE case_arg when_clause_list case_default END_P
                              16764                 :                :                 {
                              16765                 :          27946 :                     CaseExpr   *c = makeNode(CaseExpr);
                              16766                 :                : 
 7333 tgl@sss.pgh.pa.us       16767                 :          27946 :                     c->casetype = InvalidOid; /* not analyzed yet */
 7794                         16768                 :          27946 :                     c->arg = (Expr *) $2;
 9263 lockhart@fourpalms.o    16769                 :          27946 :                     c->args = $3;
 7794 tgl@sss.pgh.pa.us       16770                 :          27946 :                     c->defresult = (Expr *) $4;
 5708                         16771                 :          27946 :                     c->location = @1;
  702 peter@eisentraut.org    16772                 :          27946 :                     $$ = (Node *) c;
                              16773                 :                :                 }
                              16774                 :                :         ;
                              16775                 :                : 
                              16776                 :                : when_clause_list:
                              16777                 :                :             /* There must be at least one */
 7259 neilc@samurai.com       16778                 :          27946 :             when_clause                             { $$ = list_make1($1); }
 7971 bruce@momjian.us        16779                 :          22951 :             | when_clause_list when_clause          { $$ = lappend($1, $2); }
                              16780                 :                :         ;
                              16781                 :                : 
                              16782                 :                : when_clause:
                              16783                 :                :             WHEN a_expr THEN a_expr
                              16784                 :                :                 {
  702 peter@eisentraut.org    16785                 :          50897 :                     CaseWhen   *w = makeNode(CaseWhen);
                              16786                 :                : 
 7794 tgl@sss.pgh.pa.us       16787                 :          50897 :                     w->expr = (Expr *) $2;
                              16788                 :          50897 :                     w->result = (Expr *) $4;
 5708                         16789                 :          50897 :                     w->location = @1;
  702 peter@eisentraut.org    16790                 :          50897 :                     $$ = (Node *) w;
                              16791                 :                :                 }
                              16792                 :                :         ;
                              16793                 :                : 
                              16794                 :                : case_default:
 7972 bruce@momjian.us        16795                 :          24106 :             ELSE a_expr                             { $$ = $2; }
                              16796                 :           3840 :             | /*EMPTY*/                             { $$ = NULL; }
                              16797                 :                :         ;
                              16798                 :                : 
                              16799                 :           2668 : case_arg:   a_expr                                  { $$ = $1; }
                              16800                 :          25278 :             | /*EMPTY*/                             { $$ = NULL; }
                              16801                 :                :         ;
                              16802                 :                : 
                              16803                 :                : columnref:  ColId
                              16804                 :                :                 {
 5389 tgl@sss.pgh.pa.us       16805                 :         297929 :                     $$ = makeColumnRef($1, NIL, @1, yyscanner);
                              16806                 :                :                 }
                              16807                 :                :             | ColId indirection
                              16808                 :                :                 {
                              16809                 :         465401 :                     $$ = makeColumnRef($1, $2, @1, yyscanner);
                              16810                 :                :                 }
                              16811                 :                :         ;
                              16812                 :                : 
                              16813                 :                : indirection_el:
                              16814                 :                :             '.' attr_name
                              16815                 :                :                 {
 7249                         16816                 :         629537 :                     $$ = (Node *) makeString($2);
                              16817                 :                :                 }
                              16818                 :                :             | '.' '*'
                              16819                 :                :                 {
 5706                         16820                 :           2954 :                     $$ = (Node *) makeNode(A_Star);
                              16821                 :                :                 }
                              16822                 :                :             | '[' a_expr ']'
                              16823                 :                :                 {
 7249                         16824                 :           5798 :                     A_Indices *ai = makeNode(A_Indices);
                              16825                 :                : 
 3036                         16826                 :           5798 :                     ai->is_slice = false;
 7249                         16827                 :           5798 :                     ai->lidx = NULL;
                              16828                 :           5798 :                     ai->uidx = $2;
                              16829                 :           5798 :                     $$ = (Node *) ai;
                              16830                 :                :                 }
                              16831                 :                :             | '[' opt_slice_bound ':' opt_slice_bound ']'
                              16832                 :                :                 {
                              16833                 :            279 :                     A_Indices *ai = makeNode(A_Indices);
                              16834                 :                : 
 3036                         16835                 :            279 :                     ai->is_slice = true;
 7249                         16836                 :            279 :                     ai->lidx = $2;
                              16837                 :            279 :                     ai->uidx = $4;
                              16838                 :            279 :                     $$ = (Node *) ai;
                              16839                 :                :                 }
                              16840                 :                :         ;
                              16841                 :                : 
                              16842                 :                : opt_slice_bound:
 3036                         16843                 :            468 :             a_expr                                  { $$ = $1; }
                              16844                 :             90 :             | /*EMPTY*/                             { $$ = NULL; }
                              16845                 :                :         ;
                              16846                 :                : 
                              16847                 :                : indirection:
 7249                         16848                 :         629865 :             indirection_el                          { $$ = list_make1($1); }
                              16849                 :           1371 :             | indirection indirection_el            { $$ = lappend($1, $2); }
                              16850                 :                :         ;
                              16851                 :                : 
                              16852                 :                : opt_indirection:
                              16853                 :         152912 :             /*EMPTY*/                               { $$ = NIL; }
                              16854                 :           7332 :             | opt_indirection indirection_el        { $$ = lappend($1, $2); }
                              16855                 :                :         ;
                              16856                 :                : 
                              16857                 :                : opt_asymmetric: ASYMMETRIC
                              16858                 :                :             | /*EMPTY*/
                              16859                 :                :         ;
                              16860                 :                : 
                              16861                 :                : /* SQL/JSON support */
                              16862                 :                : json_passing_clause_opt:
   24 amitlan@postgresql.o    16863                 :GNC         150 :             PASSING json_arguments                  { $$ = $2; }
                              16864                 :            800 :             | /*EMPTY*/                             { $$ = NIL; }
                              16865                 :                :         ;
                              16866                 :                : 
                              16867                 :                : json_arguments:
                              16868                 :            150 :             json_argument                           { $$ = list_make1($1); }
                              16869                 :             63 :             | json_arguments ',' json_argument      { $$ = lappend($1, $3); }
                              16870                 :                :         ;
                              16871                 :                : 
                              16872                 :                : json_argument:
                              16873                 :                :             json_value_expr AS ColLabel
                              16874                 :                :             {
                              16875                 :            213 :                 JsonArgument *n = makeNode(JsonArgument);
                              16876                 :                : 
                              16877                 :            213 :                 n->val = (JsonValueExpr *) $1;
                              16878                 :            213 :                 n->name = $3;
                              16879                 :            213 :                 $$ = (Node *) n;
                              16880                 :                :             }
                              16881                 :                :         ;
                              16882                 :                : 
                              16883                 :                : /* ARRAY is a noise word */
                              16884                 :                : json_wrapper_behavior:
                              16885                 :             21 :               WITHOUT WRAPPER                   { $$ = JSW_NONE; }
   24 amitlan@postgresql.o    16886                 :UNC           0 :             | WITHOUT ARRAY WRAPPER             { $$ = JSW_NONE; }
   24 amitlan@postgresql.o    16887                 :GNC          39 :             | WITH WRAPPER                      { $$ = JSW_UNCONDITIONAL; }
                              16888                 :              6 :             | WITH ARRAY WRAPPER                { $$ = JSW_UNCONDITIONAL; }
   24 amitlan@postgresql.o    16889                 :UNC           0 :             | WITH CONDITIONAL ARRAY WRAPPER    { $$ = JSW_CONDITIONAL; }
   24 amitlan@postgresql.o    16890                 :GNC           6 :             | WITH UNCONDITIONAL ARRAY WRAPPER  { $$ = JSW_UNCONDITIONAL; }
                              16891                 :             18 :             | WITH CONDITIONAL WRAPPER          { $$ = JSW_CONDITIONAL; }
                              16892                 :              3 :             | WITH UNCONDITIONAL WRAPPER        { $$ = JSW_UNCONDITIONAL; }
                              16893                 :            719 :             | /* empty */                       { $$ = JSW_UNSPEC; }
                              16894                 :                :         ;
                              16895                 :                : 
                              16896                 :                : json_behavior:
                              16897                 :                :             DEFAULT a_expr
                              16898                 :            114 :                 { $$ = (Node *) makeJsonBehavior(JSON_BEHAVIOR_DEFAULT, $2, @1); }
                              16899                 :                :             | json_behavior_type
                              16900                 :            261 :                 { $$ = (Node *) makeJsonBehavior($1, NULL, @1); }
                              16901                 :                :         ;
                              16902                 :                : 
                              16903                 :                : json_behavior_type:
                              16904                 :            189 :             ERROR_P     { $$ = JSON_BEHAVIOR_ERROR; }
                              16905                 :             12 :             | NULL_P    { $$ = JSON_BEHAVIOR_NULL; }
                              16906                 :              3 :             | TRUE_P    { $$ = JSON_BEHAVIOR_TRUE; }
                              16907                 :              3 :             | FALSE_P   { $$ = JSON_BEHAVIOR_FALSE; }
                              16908                 :              6 :             | UNKNOWN   { $$ = JSON_BEHAVIOR_UNKNOWN; }
                              16909                 :             12 :             | EMPTY_P ARRAY { $$ = JSON_BEHAVIOR_EMPTY_ARRAY; }
                              16910                 :             30 :             | EMPTY_P OBJECT_P  { $$ = JSON_BEHAVIOR_EMPTY_OBJECT; }
                              16911                 :                :             /* non-standard, for Oracle compatibility only */
                              16912                 :              6 :             | EMPTY_P   { $$ = JSON_BEHAVIOR_EMPTY_ARRAY; }
                              16913                 :                :         ;
                              16914                 :                : 
                              16915                 :                : json_behavior_clause_opt:
                              16916                 :                :             json_behavior ON EMPTY_P
                              16917                 :             54 :                 { $$ = list_make2($1, NULL); }
                              16918                 :                :             | json_behavior ON ERROR_P
                              16919                 :            201 :                 { $$ = list_make2(NULL, $1); }
                              16920                 :                :             | json_behavior ON EMPTY_P json_behavior ON ERROR_P
                              16921                 :             48 :                 { $$ = list_make2($1, $4); }
                              16922                 :                :             | /* EMPTY */
                              16923                 :            785 :                 { $$ = list_make2(NULL, NULL); }
                              16924                 :                :         ;
                              16925                 :                : 
                              16926                 :                : json_on_error_clause_opt:
                              16927                 :                :             json_behavior ON ERROR_P
                              16928                 :             24 :                 { $$ = $1; }
                              16929                 :                :             | /* EMPTY */
                              16930                 :            254 :                 { $$ = NULL; }
                              16931                 :                :         ;
                              16932                 :                : 
                              16933                 :                : json_value_expr:
                              16934                 :                :             a_expr json_format_clause_opt
                              16935                 :                :             {
                              16936                 :                :                 /* formatted_expr will be set during parse-analysis. */
  268 amitlan@postgresql.o    16937                 :CBC        1793 :                 $$ = (Node *) makeJsonValueExpr((Expr *) $1, NULL,
                              16938                 :           1793 :                                                 castNode(JsonFormat, $2));
                              16939                 :                :             }
                              16940                 :                :         ;
                              16941                 :                : 
                              16942                 :                : json_format_clause:
                              16943                 :                :             FORMAT_LA JSON ENCODING name
                              16944                 :                :                 {
                              16945                 :                :                     int     encoding;
                              16946                 :                : 
  125 alvherre@alvh.no-ip.    16947         [ +  + ]:GNC          49 :                     if (!pg_strcasecmp($4, "utf8"))
                              16948                 :             31 :                         encoding = JS_ENC_UTF8;
                              16949         [ +  + ]:             18 :                     else if (!pg_strcasecmp($4, "utf16"))
                              16950                 :              6 :                         encoding = JS_ENC_UTF16;
                              16951         [ +  + ]:             12 :                     else if (!pg_strcasecmp($4, "utf32"))
                              16952                 :              6 :                         encoding = JS_ENC_UTF32;
                              16953                 :                :                     else
                              16954         [ +  - ]:              6 :                         ereport(ERROR,
                              16955                 :                :                                 errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                              16956                 :                :                                 errmsg("unrecognized JSON encoding: %s", $4));
                              16957                 :                : 
                              16958                 :             43 :                     $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, encoding, @1);
                              16959                 :                :                 }
                              16960                 :                :             | FORMAT_LA JSON
                              16961                 :                :                 {
                              16962                 :            175 :                     $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, JS_ENC_DEFAULT, @1);
                              16963                 :                :                 }
                              16964                 :                :         ;
                              16965                 :                : 
                              16966                 :                : json_format_clause_opt:
                              16967                 :                :             json_format_clause
                              16968                 :                :                 {
                              16969                 :            164 :                     $$ = $1;
                              16970                 :                :                 }
                              16971                 :                :             | /* EMPTY */
                              16972                 :                :                 {
  382 alvherre@alvh.no-ip.    16973                 :CBC        2245 :                     $$ = (Node *) makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
                              16974                 :                :                 }
                              16975                 :                :         ;
                              16976                 :                : 
                              16977                 :                : json_quotes_clause_opt:
   24 amitlan@postgresql.o    16978                 :GNC           6 :             KEEP QUOTES ON SCALAR STRING_P      { $$ = JS_QUOTES_KEEP; }
                              16979                 :             45 :             | KEEP QUOTES                       { $$ = JS_QUOTES_KEEP; }
                              16980                 :              6 :             | OMIT QUOTES ON SCALAR STRING_P    { $$ = JS_QUOTES_OMIT; }
                              16981                 :             75 :             | OMIT QUOTES                       { $$ = JS_QUOTES_OMIT; }
                              16982                 :            680 :             | /* EMPTY */                       { $$ = JS_QUOTES_UNSPEC; }
                              16983                 :                :         ;
                              16984                 :                : 
                              16985                 :                : json_returning_clause_opt:
                              16986                 :                :             RETURNING Typename json_format_clause_opt
                              16987                 :                :                 {
  382 alvherre@alvh.no-ip.    16988                 :CBC         589 :                     JsonOutput *n = makeNode(JsonOutput);
                              16989                 :                : 
                              16990                 :            589 :                     n->typeName = $2;
                              16991                 :            589 :                     n->returning = makeNode(JsonReturning);
                              16992                 :            589 :                     n->returning->format = (JsonFormat *) $3;
                              16993                 :            589 :                     $$ = (Node *) n;
                              16994                 :                :                 }
                              16995                 :            573 :             | /* EMPTY */                           { $$ = NULL; }
                              16996                 :                :         ;
                              16997                 :                : 
                              16998                 :                : /*
                              16999                 :                :  * We must assign the only-JSON production a precedence less than IDENT in
                              17000                 :                :  * order to favor shifting over reduction when JSON is followed by VALUE_P,
                              17001                 :                :  * OBJECT_P, or SCALAR.  (ARRAY doesn't need that treatment, because it's a
                              17002                 :                :  * fully reserved word.)  Because json_predicate_type_constraint is always
                              17003                 :                :  * followed by json_key_uniqueness_constraint_opt, we also need the only-JSON
                              17004                 :                :  * production to have precedence less than WITH and WITHOUT.  UNBOUNDED isn't
                              17005                 :                :  * really related to this syntax, but it's a convenient choice because it
                              17006                 :                :  * already has a precedence less than IDENT for other reasons.
                              17007                 :                :  */
                              17008                 :                : json_predicate_type_constraint:
  138 tgl@sss.pgh.pa.us       17009                 :GNC          97 :             JSON                    %prec UNBOUNDED { $$ = JS_TYPE_ANY; }
  380 alvherre@alvh.no-ip.    17010                 :CBC          13 :             | JSON VALUE_P                          { $$ = JS_TYPE_ANY; }
                              17011                 :             19 :             | JSON ARRAY                            { $$ = JS_TYPE_ARRAY; }
                              17012                 :             19 :             | JSON OBJECT_P                         { $$ = JS_TYPE_OBJECT; }
                              17013                 :             19 :             | JSON SCALAR                           { $$ = JS_TYPE_SCALAR; }
                              17014                 :                :         ;
                              17015                 :                : 
                              17016                 :                : /*
                              17017                 :                :  * KEYS is a noise word here.  To avoid shift/reduce conflicts, assign the
                              17018                 :                :  * KEYS-less productions a precedence less than IDENT (i.e., less than KEYS).
                              17019                 :                :  * This prevents reducing them when the next token is KEYS.
                              17020                 :                :  */
                              17021                 :                : json_key_uniqueness_constraint_opt:
                              17022                 :             51 :             WITH UNIQUE KEYS                            { $$ = true; }
  138 tgl@sss.pgh.pa.us       17023                 :GNC          40 :             | WITH UNIQUE               %prec UNBOUNDED { $$ = true; }
  376 alvherre@alvh.no-ip.    17024                 :CBC          20 :             | WITHOUT UNIQUE KEYS                       { $$ = false; }
  138 tgl@sss.pgh.pa.us       17025                 :GNC           7 :             | WITHOUT UNIQUE            %prec UNBOUNDED { $$ = false; }
                              17026                 :            342 :             | /* EMPTY */               %prec UNBOUNDED { $$ = false; }
                              17027                 :                :         ;
                              17028                 :                : 
                              17029                 :                : json_name_and_value_list:
                              17030                 :                :             json_name_and_value
  382 alvherre@alvh.no-ip.    17031                 :CBC         141 :                 { $$ = list_make1($1); }
                              17032                 :                :             | json_name_and_value_list ',' json_name_and_value
                              17033                 :            112 :                 { $$ = lappend($1, $3); }
                              17034                 :                :         ;
                              17035                 :                : 
                              17036                 :                : json_name_and_value:
                              17037                 :                : /* Supporting this syntax seems to require major surgery
                              17038                 :                :             KEY c_expr VALUE_P json_value_expr
                              17039                 :                :                 { $$ = makeJsonKeyValue($2, $4); }
                              17040                 :                :             |
                              17041                 :                : */
                              17042                 :                :             c_expr VALUE_P json_value_expr
                              17043                 :             12 :                 { $$ = makeJsonKeyValue($1, $3); }
                              17044                 :                :             |
                              17045                 :                :             a_expr ':' json_value_expr
                              17046                 :            319 :                 { $$ = makeJsonKeyValue($1, $3); }
                              17047                 :                :         ;
                              17048                 :                : 
                              17049                 :                : /* empty means false for objects, true for arrays */
                              17050                 :                : json_object_constructor_null_clause_opt:
                              17051                 :             15 :             NULL_P ON NULL_P                    { $$ = false; }
                              17052                 :             53 :             | ABSENT ON NULL_P                  { $$ = true; }
                              17053                 :            151 :             | /* EMPTY */                       { $$ = false; }
                              17054                 :                :         ;
                              17055                 :                : 
                              17056                 :                : json_array_constructor_null_clause_opt:
                              17057                 :             27 :             NULL_P ON NULL_P                        { $$ = false; }
                              17058                 :             18 :             | ABSENT ON NULL_P                      { $$ = true; }
                              17059                 :             78 :             | /* EMPTY */                           { $$ = true; }
                              17060                 :                :         ;
                              17061                 :                : 
                              17062                 :                : json_value_expr_list:
                              17063                 :             48 :             json_value_expr                             { $$ = list_make1($1); }
                              17064                 :             63 :             | json_value_expr_list ',' json_value_expr  { $$ = lappend($1, $3);}
                              17065                 :                :         ;
                              17066                 :                : 
                              17067                 :                : json_aggregate_func:
                              17068                 :                :             JSON_OBJECTAGG '('
                              17069                 :                :                 json_name_and_value
                              17070                 :                :                 json_object_constructor_null_clause_opt
                              17071                 :                :                 json_key_uniqueness_constraint_opt
                              17072                 :                :                 json_returning_clause_opt
                              17073                 :                :             ')'
                              17074                 :                :                 {
                              17075                 :             78 :                     JsonObjectAgg *n = makeNode(JsonObjectAgg);
                              17076                 :                : 
                              17077                 :             78 :                     n->arg = (JsonKeyValue *) $3;
                              17078                 :             78 :                     n->absent_on_null = $4;
                              17079                 :             78 :                     n->unique = $5;
                              17080                 :             78 :                     n->constructor = makeNode(JsonAggConstructor);
                              17081                 :             78 :                     n->constructor->output = (JsonOutput *) $6;
                              17082                 :             78 :                     n->constructor->agg_order = NULL;
                              17083                 :             78 :                     n->constructor->location = @1;
                              17084                 :             78 :                     $$ = (Node *) n;
                              17085                 :                :                 }
                              17086                 :                :             | JSON_ARRAYAGG '('
                              17087                 :                :                 json_value_expr
                              17088                 :                :                 json_array_aggregate_order_by_clause_opt
                              17089                 :                :                 json_array_constructor_null_clause_opt
                              17090                 :                :                 json_returning_clause_opt
                              17091                 :                :             ')'
                              17092                 :                :                 {
                              17093                 :             75 :                     JsonArrayAgg *n = makeNode(JsonArrayAgg);
                              17094                 :                : 
                              17095                 :             75 :                     n->arg = (JsonValueExpr *) $3;
                              17096                 :             75 :                     n->absent_on_null = $5;
                              17097                 :             75 :                     n->constructor = makeNode(JsonAggConstructor);
                              17098                 :             75 :                     n->constructor->agg_order = $4;
                              17099                 :             75 :                     n->constructor->output = (JsonOutput *) $6;
                              17100                 :             75 :                     n->constructor->location = @1;
                              17101                 :             75 :                     $$ = (Node *) n;
                              17102                 :                :                 }
                              17103                 :                :         ;
                              17104                 :                : 
                              17105                 :                : json_array_aggregate_order_by_clause_opt:
                              17106                 :              9 :             ORDER BY sortby_list                    { $$ = $3; }
                              17107                 :             66 :             | /* EMPTY */                           { $$ = NIL; }
                              17108                 :                :         ;
                              17109                 :                : 
                              17110                 :                : /*****************************************************************************
                              17111                 :                :  *
                              17112                 :                :  *  target list for SELECT
                              17113                 :                :  *
                              17114                 :                :  *****************************************************************************/
                              17115                 :                : 
 3774 tgl@sss.pgh.pa.us       17116                 :         232012 : opt_target_list: target_list                        { $$ = $1; }
                              17117                 :            155 :             | /* EMPTY */                           { $$ = NIL; }
                              17118                 :                :         ;
                              17119                 :                : 
                              17120                 :                : target_list:
 7259 neilc@samurai.com       17121                 :         234868 :             target_el                               { $$ = list_make1($1); }
 7971 bruce@momjian.us        17122                 :         275732 :             | target_list ',' target_el             { $$ = lappend($1, $3); }
                              17123                 :                :         ;
                              17124                 :                : 
                              17125                 :                : target_el:  a_expr AS ColLabel
                              17126                 :                :                 {
 9715                         17127                 :          91422 :                     $$ = makeNode(ResTarget);
                              17128                 :          91422 :                     $$->name = $3;
 8060 tgl@sss.pgh.pa.us       17129                 :          91422 :                     $$->indirection = NIL;
  702 peter@eisentraut.org    17130                 :          91422 :                     $$->val = (Node *) $1;
 6597 tgl@sss.pgh.pa.us       17131                 :          91422 :                     $$->location = @1;
                              17132                 :                :                 }
                              17133                 :                :             | a_expr BareColLabel
                              17134                 :                :                 {
 5903                         17135                 :           1562 :                     $$ = makeNode(ResTarget);
                              17136                 :           1562 :                     $$->name = $2;
                              17137                 :           1562 :                     $$->indirection = NIL;
  702 peter@eisentraut.org    17138                 :           1562 :                     $$->val = (Node *) $1;
 5903 tgl@sss.pgh.pa.us       17139                 :           1562 :                     $$->location = @1;
                              17140                 :                :                 }
                              17141                 :                :             | a_expr
                              17142                 :                :                 {
 9715 bruce@momjian.us        17143                 :         392916 :                     $$ = makeNode(ResTarget);
                              17144                 :         392916 :                     $$->name = NULL;
 8060 tgl@sss.pgh.pa.us       17145                 :         392916 :                     $$->indirection = NIL;
  702 peter@eisentraut.org    17146                 :         392916 :                     $$->val = (Node *) $1;
 6597 tgl@sss.pgh.pa.us       17147                 :         392916 :                     $$->location = @1;
                              17148                 :                :                 }
                              17149                 :                :             | '*'
                              17150                 :                :                 {
  702 peter@eisentraut.org    17151                 :          24700 :                     ColumnRef  *n = makeNode(ColumnRef);
                              17152                 :                : 
 5706 tgl@sss.pgh.pa.us       17153                 :          24700 :                     n->fields = list_make1(makeNode(A_Star));
 6606                         17154                 :          24700 :                     n->location = @1;
                              17155                 :                : 
 9715 bruce@momjian.us        17156                 :          24700 :                     $$ = makeNode(ResTarget);
                              17157                 :          24700 :                     $$->name = NULL;
 8060 tgl@sss.pgh.pa.us       17158                 :          24700 :                     $$->indirection = NIL;
  702 peter@eisentraut.org    17159                 :          24700 :                     $$->val = (Node *) n;
 6597 tgl@sss.pgh.pa.us       17160                 :          24700 :                     $$->location = @1;
                              17161                 :                :                 }
                              17162                 :                :         ;
                              17163                 :                : 
                              17164                 :                : 
                              17165                 :                : /*****************************************************************************
                              17166                 :                :  *
                              17167                 :                :  *  Names and constants
                              17168                 :                :  *
                              17169                 :                :  *****************************************************************************/
                              17170                 :                : 
                              17171                 :                : qualified_name_list:
 7259 neilc@samurai.com       17172                 :           6504 :             qualified_name                          { $$ = list_make1($1); }
 7972 bruce@momjian.us        17173                 :            280 :             | qualified_name_list ',' qualified_name { $$ = lappend($1, $3); }
                              17174                 :                :         ;
                              17175                 :                : 
                              17176                 :                : /*
                              17177                 :                :  * The production for a qualified relation name has to exactly match the
                              17178                 :                :  * production for a qualified func_name, because in a FROM clause we cannot
                              17179                 :                :  * tell which we are parsing until we see what comes after it ('(' for a
                              17180                 :                :  * func_name, something else for a relation). Therefore we allow 'indirection'
                              17181                 :                :  * which may contain subscripts, and reject that case in the C code.
                              17182                 :                :  */
                              17183                 :                : qualified_name:
                              17184                 :                :             ColId
                              17185                 :                :                 {
 4871 rhaas@postgresql.org    17186                 :         186682 :                     $$ = makeRangeVar(NULL, $1, @1);
                              17187                 :                :                 }
                              17188                 :                :             | ColId indirection
                              17189                 :                :                 {
  900 akapila@postgresql.o    17190                 :         109408 :                     $$ = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner);
                              17191                 :                :                 }
                              17192                 :                :         ;
                              17193                 :                : 
                              17194                 :                : name_list:  name
 7259 neilc@samurai.com       17195                 :          11813 :                     { $$ = list_make1(makeString($1)); }
                              17196                 :                :             | name_list ',' name
 7971 bruce@momjian.us        17197                 :          23658 :                     { $$ = lappend($1, makeString($3)); }
                              17198                 :                :         ;
                              17199                 :                : 
                              17200                 :                : 
 7972                         17201                 :          69816 : name:       ColId                                   { $$ = $1; };
                              17202                 :                : 
 7173 tgl@sss.pgh.pa.us       17203                 :         676722 : attr_name:  ColLabel                                { $$ = $1; };
                              17204                 :                : 
 7972 bruce@momjian.us        17205                 :             29 : file_name:  Sconst                                  { $$ = $1; };
                              17206                 :                : 
                              17207                 :                : /*
                              17208                 :                :  * The production for a qualified func_name has to exactly match the
                              17209                 :                :  * production for a qualified columnref, because we cannot tell which we
                              17210                 :                :  * are parsing until we see what comes after it ('(' or Sconst for a func_name,
                              17211                 :                :  * anything else for a columnref).  Therefore we allow 'indirection' which
                              17212                 :                :  * may contain subscripts, and reject that case in the C code.  (If we
                              17213                 :                :  * ever implement SQL99-like methods, such syntax may actually become legal!)
                              17214                 :                :  */
                              17215                 :                : func_name:  type_function_name
 7259 neilc@samurai.com       17216                 :         142142 :                     { $$ = list_make1(makeString($1)); }
                              17217                 :                :             | ColId indirection
                              17218                 :                :                     {
 5389 tgl@sss.pgh.pa.us       17219                 :          55017 :                         $$ = check_func_name(lcons(makeString($1), $2),
                              17220                 :                :                                              yyscanner);
                              17221                 :                :                     }
                              17222                 :                :         ;
                              17223                 :                : 
                              17224                 :                : 
                              17225                 :                : /*
                              17226                 :                :  * Constants
                              17227                 :                :  */
                              17228                 :                : AexprConst: Iconst
                              17229                 :                :                 {
 5708                         17230                 :         216003 :                     $$ = makeIntConst($1, @1);
                              17231                 :                :                 }
                              17232                 :                :             | FCONST
                              17233                 :                :                 {
                              17234                 :           5293 :                     $$ = makeFloatConst($1, @1);
                              17235                 :                :                 }
                              17236                 :                :             | Sconst
                              17237                 :                :                 {
                              17238                 :         274169 :                     $$ = makeStringConst($1, @1);
                              17239                 :                :                 }
                              17240                 :                :             | BCONST
                              17241                 :                :                 {
                              17242                 :            376 :                     $$ = makeBitStringConst($1, @1);
                              17243                 :                :                 }
                              17244                 :                :             | XCONST
                              17245                 :                :                 {
                              17246                 :                :                     /* This is a bit constant per SQL99:
                              17247                 :                :                      * Without Feature F511, "BIT data type",
                              17248                 :                :                      * a <general literal> shall not be a
                              17249                 :                :                      * <bit string literal> or a <hex string literal>.
                              17250                 :                :                      */
                              17251                 :           1659 :                     $$ = makeBitStringConst($1, @1);
                              17252                 :                :                 }
                              17253                 :                :             | func_name Sconst
                              17254                 :                :                 {
                              17255                 :                :                     /* generic type 'literal' syntax */
  702 peter@eisentraut.org    17256                 :           4672 :                     TypeName   *t = makeTypeNameFromNameList($1);
                              17257                 :                : 
 5829 alvherre@alvh.no-ip.    17258                 :           4672 :                     t->location = @1;
 5708 tgl@sss.pgh.pa.us       17259                 :           4672 :                     $$ = makeStringConstCast($2, @2, t);
                              17260                 :                :                 }
                              17261                 :                :             | func_name '(' func_arg_list opt_sort_clause ')' Sconst
                              17262                 :                :                 {
                              17263                 :                :                     /* generic syntax with a type modifier */
  702 peter@eisentraut.org    17264                 :UBC           0 :                     TypeName   *t = makeTypeNameFromNameList($1);
                              17265                 :                :                     ListCell   *lc;
                              17266                 :                : 
                              17267                 :                :                     /*
                              17268                 :                :                      * We must use func_arg_list and opt_sort_clause in the
                              17269                 :                :                      * production to avoid reduce/reduce conflicts, but we
                              17270                 :                :                      * don't actually wish to allow NamedArgExpr in this
                              17271                 :                :                      * context, nor ORDER BY.
                              17272                 :                :                      */
 5302 tgl@sss.pgh.pa.us       17273   [ #  #  #  #  :              0 :                     foreach(lc, $3)
                                              #  # ]
                              17274                 :                :                     {
                              17275                 :              0 :                         NamedArgExpr *arg = (NamedArgExpr *) lfirst(lc);
                              17276                 :                : 
                              17277         [ #  # ]:              0 :                         if (IsA(arg, NamedArgExpr))
                              17278         [ #  # ]:              0 :                             ereport(ERROR,
                              17279                 :                :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              17280                 :                :                                      errmsg("type modifier cannot have parameter name"),
                              17281                 :                :                                      parser_errposition(arg->location)));
                              17282                 :                :                     }
 3765                         17283         [ #  # ]:              0 :                     if ($4 != NIL)
                              17284         [ #  # ]:              0 :                             ereport(ERROR,
                              17285                 :                :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              17286                 :                :                                      errmsg("type modifier cannot have ORDER BY"),
                              17287                 :                :                                      parser_errposition(@4)));
                              17288                 :                : 
 5829 alvherre@alvh.no-ip.    17289                 :              0 :                     t->typmods = $3;
                              17290                 :              0 :                     t->location = @1;
 3765 tgl@sss.pgh.pa.us       17291                 :              0 :                     $$ = makeStringConstCast($6, @6, t);
                              17292                 :                :                 }
                              17293                 :                :             | ConstTypename Sconst
                              17294                 :                :                 {
 5708 tgl@sss.pgh.pa.us       17295                 :CBC        1454 :                     $$ = makeStringConstCast($2, @2, $1);
                              17296                 :                :                 }
                              17297                 :                :             | ConstInterval Sconst opt_interval
                              17298                 :                :                 {
  702 peter@eisentraut.org    17299                 :           1616 :                     TypeName   *t = $1;
                              17300                 :                : 
 5694 tgl@sss.pgh.pa.us       17301                 :           1616 :                     t->typmods = $3;
 5708                         17302                 :           1616 :                     $$ = makeStringConstCast($2, @2, t);
                              17303                 :                :                 }
                              17304                 :                :             | ConstInterval '(' Iconst ')' Sconst
                              17305                 :                :                 {
  702 peter@eisentraut.org    17306                 :              6 :                     TypeName   *t = $1;
                              17307                 :                : 
 3466 bruce@momjian.us        17308                 :              6 :                     t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
                              17309                 :                :                                             makeIntConst($3, @3));
 5708 tgl@sss.pgh.pa.us       17310                 :              6 :                     $$ = makeStringConstCast($5, @5, t);
                              17311                 :                :                 }
                              17312                 :                :             | TRUE_P
                              17313                 :                :                 {
 2433 peter_e@gmx.net         17314                 :          11666 :                     $$ = makeBoolAConst(true, @1);
                              17315                 :                :                 }
                              17316                 :                :             | FALSE_P
                              17317                 :                :                 {
                              17318                 :          16463 :                     $$ = makeBoolAConst(false, @1);
                              17319                 :                :                 }
                              17320                 :                :             | NULL_P
                              17321                 :                :                 {
 5708 tgl@sss.pgh.pa.us       17322                 :          28162 :                     $$ = makeNullAConst(@1);
                              17323                 :                :                 }
                              17324                 :                :         ;
                              17325                 :                : 
 7972 bruce@momjian.us        17326                 :         227351 : Iconst:     ICONST                                  { $$ = $1; };
                              17327                 :         306788 : Sconst:     SCONST                                  { $$ = $1; };
                              17328                 :                : 
 5632 meskes@postgresql.or    17329                 :           7365 : SignedIconst: Iconst                                { $$ = $1; }
 5632 meskes@postgresql.or    17330                 :UBC           0 :             | '+' Iconst                            { $$ = + $2; }
 5632 meskes@postgresql.or    17331                 :CBC         133 :             | '-' Iconst                            { $$ = - $2; }
                              17332                 :                :         ;
                              17333                 :                : 
                              17334                 :                : /* Role specifications */
                              17335                 :                : RoleId:     RoleSpec
                              17336                 :                :                 {
  702 peter@eisentraut.org    17337                 :            884 :                     RoleSpec   *spc = (RoleSpec *) $1;
                              17338                 :                : 
 3324 alvherre@alvh.no-ip.    17339   [ +  +  +  +  :            884 :                     switch (spc->roletype)
                                              +  - ]
                              17340                 :                :                     {
                              17341                 :            879 :                         case ROLESPEC_CSTRING:
                              17342                 :            879 :                             $$ = spc->rolename;
                              17343                 :            879 :                             break;
                              17344                 :              2 :                         case ROLESPEC_PUBLIC:
                              17345         [ +  - ]:              2 :                             ereport(ERROR,
                              17346                 :                :                                     (errcode(ERRCODE_RESERVED_NAME),
                              17347                 :                :                                      errmsg("role name \"%s\" is reserved",
                              17348                 :                :                                             "public"),
                              17349                 :                :                                      parser_errposition(@1)));
                              17350                 :                :                             break;
                              17351                 :              1 :                         case ROLESPEC_SESSION_USER:
                              17352         [ +  - ]:              1 :                             ereport(ERROR,
                              17353                 :                :                                     (errcode(ERRCODE_RESERVED_NAME),
                              17354                 :                :                                      errmsg("%s cannot be used as a role name here",
                              17355                 :                :                                             "SESSION_USER"),
                              17356                 :                :                                      parser_errposition(@1)));
                              17357                 :                :                             break;
                              17358                 :              1 :                         case ROLESPEC_CURRENT_USER:
                              17359         [ +  - ]:              1 :                             ereport(ERROR,
                              17360                 :                :                                     (errcode(ERRCODE_RESERVED_NAME),
                              17361                 :                :                                      errmsg("%s cannot be used as a role name here",
                              17362                 :                :                                             "CURRENT_USER"),
                              17363                 :                :                                      parser_errposition(@1)));
                              17364                 :                :                             break;
 1305 peter@eisentraut.org    17365                 :              1 :                         case ROLESPEC_CURRENT_ROLE:
                              17366         [ +  - ]:              1 :                             ereport(ERROR,
                              17367                 :                :                                     (errcode(ERRCODE_RESERVED_NAME),
                              17368                 :                :                                      errmsg("%s cannot be used as a role name here",
                              17369                 :                :                                             "CURRENT_ROLE"),
                              17370                 :                :                                      parser_errposition(@1)));
                              17371                 :                :                             break;
                              17372                 :                :                     }
                              17373                 :                :                 }
                              17374                 :                :             ;
                              17375                 :                : 
                              17376                 :                : RoleSpec:   NonReservedWord
                              17377                 :                :                 {
                              17378                 :                :                     /*
                              17379                 :                :                      * "public" and "none" are not keywords, but they must
                              17380                 :                :                      * be treated specially here.
                              17381                 :                :                      */
                              17382                 :                :                     RoleSpec   *n;
                              17383                 :                : 
  702                         17384         [ +  + ]:          12363 :                     if (strcmp($1, "public") == 0)
                              17385                 :                :                     {
                              17386                 :           5921 :                         n = (RoleSpec *) makeRoleSpec(ROLESPEC_PUBLIC, @1);
                              17387                 :           5921 :                         n->roletype = ROLESPEC_PUBLIC;
                              17388                 :                :                     }
                              17389         [ +  + ]:           6442 :                     else if (strcmp($1, "none") == 0)
                              17390                 :                :                     {
                              17391         [ +  - ]:             13 :                         ereport(ERROR,
                              17392                 :                :                                 (errcode(ERRCODE_RESERVED_NAME),
                              17393                 :                :                                  errmsg("role name \"%s\" is reserved",
                              17394                 :                :                                         "none"),
                              17395                 :                :                                  parser_errposition(@1)));
                              17396                 :                :                     }
                              17397                 :                :                     else
                              17398                 :                :                     {
                              17399                 :           6429 :                         n = makeRoleSpec(ROLESPEC_CSTRING, @1);
                              17400                 :           6429 :                         n->rolename = pstrdup($1);
                              17401                 :                :                     }
                              17402                 :          12350 :                     $$ = n;
                              17403                 :                :                 }
                              17404                 :                :             | CURRENT_ROLE
                              17405                 :                :                 {
                              17406                 :             64 :                     $$ = makeRoleSpec(ROLESPEC_CURRENT_ROLE, @1);
                              17407                 :                :                 }
                              17408                 :                :             | CURRENT_USER
                              17409                 :                :                 {
                              17410                 :            114 :                     $$ = makeRoleSpec(ROLESPEC_CURRENT_USER, @1);
                              17411                 :                :                 }
                              17412                 :                :             | SESSION_USER
                              17413                 :                :                 {
                              17414                 :             18 :                     $$ = makeRoleSpec(ROLESPEC_SESSION_USER, @1);
                              17415                 :                :                 }
                              17416                 :                :         ;
                              17417                 :                : 
                              17418                 :                : role_list:  RoleSpec
                              17419                 :           1549 :                 { $$ = list_make1($1); }
                              17420                 :                :             | role_list ',' RoleSpec
                              17421                 :            129 :                 { $$ = lappend($1, $3); }
                              17422                 :                :         ;
                              17423                 :                : 
                              17424                 :                : 
                              17425                 :                : /*****************************************************************************
                              17426                 :                :  *
                              17427                 :                :  * PL/pgSQL extensions
                              17428                 :                :  *
                              17429                 :                :  * You'd think a PL/pgSQL "expression" should be just an a_expr, but
                              17430                 :                :  * historically it can include just about anything that can follow SELECT.
                              17431                 :                :  * Therefore the returned struct is a SelectStmt.
                              17432                 :                :  *****************************************************************************/
                              17433                 :                : 
                              17434                 :                : PLpgSQL_Expr: opt_distinct_clause opt_target_list
                              17435                 :                :             from_clause where_clause
                              17436                 :                :             group_clause having_clause window_clause
                              17437                 :                :             opt_sort_clause opt_select_limit opt_for_locking_clause
                              17438                 :                :                 {
 1196 tgl@sss.pgh.pa.us       17439                 :          20482 :                     SelectStmt *n = makeNode(SelectStmt);
                              17440                 :                : 
 1178                         17441                 :          20482 :                     n->distinctClause = $1;
                              17442                 :          20482 :                     n->targetList = $2;
                              17443                 :          20482 :                     n->fromClause = $3;
                              17444                 :          20482 :                     n->whereClause = $4;
 1123 tomas.vondra@postgre    17445                 :          20482 :                     n->groupClause = ($5)->list;
                              17446                 :          20482 :                     n->groupDistinct = ($5)->distinct;
 1178 tgl@sss.pgh.pa.us       17447                 :          20482 :                     n->havingClause = $6;
                              17448                 :          20482 :                     n->windowClause = $7;
                              17449                 :          20482 :                     n->sortClause = $8;
                              17450         [ +  + ]:          20482 :                     if ($9)
                              17451                 :                :                     {
                              17452                 :              2 :                         n->limitOffset = $9->limitOffset;
                              17453                 :              2 :                         n->limitCount = $9->limitCount;
 1196                         17454         [ +  - ]:              2 :                         if (!n->sortClause &&
 1178                         17455         [ -  + ]:              2 :                             $9->limitOption == LIMIT_OPTION_WITH_TIES)
 1196 tgl@sss.pgh.pa.us       17456         [ #  # ]:UBC           0 :                             ereport(ERROR,
                              17457                 :                :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              17458                 :                :                                      errmsg("WITH TIES cannot be specified without ORDER BY clause")));
 1178 tgl@sss.pgh.pa.us       17459                 :CBC           2 :                         n->limitOption = $9->limitOption;
                              17460                 :                :                     }
                              17461                 :          20482 :                     n->lockingClause = $10;
 1196                         17462                 :          20482 :                     $$ = (Node *) n;
                              17463                 :                :                 }
                              17464                 :                :         ;
                              17465                 :                : 
                              17466                 :                : /*
                              17467                 :                :  * PL/pgSQL Assignment statement: name opt_indirection := PLpgSQL_Expr
                              17468                 :                :  */
                              17469                 :                : 
                              17470                 :                : PLAssignStmt: plassign_target opt_indirection plassign_equals PLpgSQL_Expr
                              17471                 :                :                 {
                              17472                 :           3837 :                     PLAssignStmt *n = makeNode(PLAssignStmt);
                              17473                 :                : 
                              17474                 :           3837 :                     n->name = $1;
                              17475                 :           3837 :                     n->indirection = check_indirection($2, yyscanner);
                              17476                 :                :                     /* nnames will be filled by calling production */
                              17477                 :           3837 :                     n->val = (SelectStmt *) $4;
                              17478                 :           3837 :                     n->location = @1;
                              17479                 :           3837 :                     $$ = (Node *) n;
                              17480                 :                :                 }
                              17481                 :                :         ;
                              17482                 :                : 
                              17483                 :           3825 : plassign_target: ColId                          { $$ = $1; }
                              17484                 :             12 :             | PARAM                             { $$ = psprintf("$%d", $1); }
                              17485                 :                :         ;
                              17486                 :                : 
                              17487                 :                : plassign_equals: COLON_EQUALS
                              17488                 :                :             | '='
                              17489                 :                :         ;
                              17490                 :                : 
                              17491                 :                : 
                              17492                 :                : /*
                              17493                 :                :  * Name classification hierarchy.
                              17494                 :                :  *
                              17495                 :                :  * IDENT is the lexeme returned by the lexer for identifiers that match
                              17496                 :                :  * no known keyword.  In most cases, we can accept certain keywords as
                              17497                 :                :  * names, not only IDENTs.  We prefer to accept as many such keywords
                              17498                 :                :  * as possible to minimize the impact of "reserved words" on programmers.
                              17499                 :                :  * So, we divide names into several possible classes.  The classification
                              17500                 :                :  * is chosen in part to make keywords acceptable as names wherever possible.
                              17501                 :                :  */
                              17502                 :                : 
                              17503                 :                : /* Column identifier --- names that can be column, table, etc names.
                              17504                 :                :  */
 7972 bruce@momjian.us        17505                 :        1439828 : ColId:      IDENT                                   { $$ = $1; }
                              17506                 :          27424 :             | unreserved_keyword                    { $$ = pstrdup($1); }
                              17507                 :           2346 :             | col_name_keyword                      { $$ = pstrdup($1); }
                              17508                 :                :         ;
                              17509                 :                : 
                              17510                 :                : /* Type/function identifier --- names that can be type or function names.
                              17511                 :                :  */
 6315 tgl@sss.pgh.pa.us       17512                 :         311590 : type_function_name: IDENT                           { $$ = $1; }
 7972 bruce@momjian.us        17513                 :          33761 :             | unreserved_keyword                    { $$ = pstrdup($1); }
 6315 tgl@sss.pgh.pa.us       17514                 :             21 :             | type_func_name_keyword                { $$ = pstrdup($1); }
                              17515                 :                :         ;
                              17516                 :                : 
                              17517                 :                : /* Any not-fully-reserved word --- these names can be, eg, role names.
                              17518                 :                :  */
 3969                         17519                 :          32665 : NonReservedWord:    IDENT                           { $$ = $1; }
                              17520                 :          12567 :             | unreserved_keyword                    { $$ = pstrdup($1); }
                              17521                 :             88 :             | col_name_keyword                      { $$ = pstrdup($1); }
                              17522                 :           1781 :             | type_func_name_keyword                { $$ = pstrdup($1); }
                              17523                 :                :         ;
                              17524                 :                : 
                              17525                 :                : /* Column label --- allowed labels in "AS" clauses.
                              17526                 :                :  * This presently includes *all* Postgres keywords.
                              17527                 :                :  */
 7972 bruce@momjian.us        17528                 :         761550 : ColLabel:   IDENT                                   { $$ = $1; }
                              17529                 :          16866 :             | unreserved_keyword                    { $$ = pstrdup($1); }
                              17530                 :            136 :             | col_name_keyword                      { $$ = pstrdup($1); }
 6315 tgl@sss.pgh.pa.us       17531                 :            881 :             | type_func_name_keyword                { $$ = pstrdup($1); }
 7972 bruce@momjian.us        17532                 :           3501 :             | reserved_keyword                      { $$ = pstrdup($1); }
                              17533                 :                :         ;
                              17534                 :                : 
                              17535                 :                : /* Bare column label --- names that can be column labels without writing "AS".
                              17536                 :                :  * This classification is orthogonal to the other keyword categories.
                              17537                 :                :  */
 1304 tgl@sss.pgh.pa.us       17538                 :           1559 : BareColLabel:   IDENT                               { $$ = $1; }
                              17539                 :              3 :             | bare_label_keyword                    { $$ = pstrdup($1); }
                              17540                 :                :         ;
                              17541                 :                : 
                              17542                 :                : 
                              17543                 :                : /*
                              17544                 :                :  * Keyword category lists.  Generally, every keyword present in
                              17545                 :                :  * the Postgres grammar should appear in exactly one of these lists.
                              17546                 :                :  *
                              17547                 :                :  * Put a new keyword into the first list that it can go into without causing
                              17548                 :                :  * shift or reduce conflicts.  The earlier lists define "less reserved"
                              17549                 :                :  * categories of keywords.
                              17550                 :                :  *
                              17551                 :                :  * Make sure that each keyword's category in kwlist.h matches where
                              17552                 :                :  * it is listed here.  (Someday we may be able to generate these lists and
                              17553                 :                :  * kwlist.h's table from one source of truth.)
                              17554                 :                :  */
                              17555                 :                : 
                              17556                 :                : /* "Unreserved" keywords --- available for use as any kind of name.
                              17557                 :                :  */
                              17558                 :                : unreserved_keyword:
                              17559                 :                :               ABORT_P
                              17560                 :                :             | ABSENT
                              17561                 :                :             | ABSOLUTE_P
                              17562                 :                :             | ACCESS
                              17563                 :                :             | ACTION
                              17564                 :                :             | ADD_P
                              17565                 :                :             | ADMIN
                              17566                 :                :             | AFTER
                              17567                 :                :             | AGGREGATE
                              17568                 :                :             | ALSO
                              17569                 :                :             | ALTER
                              17570                 :                :             | ALWAYS
                              17571                 :                :             | ASENSITIVE
                              17572                 :                :             | ASSERTION
                              17573                 :                :             | ASSIGNMENT
                              17574                 :                :             | AT
                              17575                 :                :             | ATOMIC
                              17576                 :                :             | ATTACH
                              17577                 :                :             | ATTRIBUTE
                              17578                 :                :             | BACKWARD
                              17579                 :                :             | BEFORE
                              17580                 :                :             | BEGIN_P
                              17581                 :                :             | BREADTH
                              17582                 :                :             | BY
                              17583                 :                :             | CACHE
                              17584                 :                :             | CALL
                              17585                 :                :             | CALLED
                              17586                 :                :             | CASCADE
                              17587                 :                :             | CASCADED
                              17588                 :                :             | CATALOG_P
                              17589                 :                :             | CHAIN
                              17590                 :                :             | CHARACTERISTICS
                              17591                 :                :             | CHECKPOINT
                              17592                 :                :             | CLASS
                              17593                 :                :             | CLOSE
                              17594                 :                :             | CLUSTER
                              17595                 :                :             | COLUMNS
                              17596                 :                :             | COMMENT
                              17597                 :                :             | COMMENTS
                              17598                 :                :             | COMMIT
                              17599                 :                :             | COMMITTED
                              17600                 :                :             | COMPRESSION
                              17601                 :                :             | CONDITIONAL
                              17602                 :                :             | CONFIGURATION
                              17603                 :                :             | CONFLICT
                              17604                 :                :             | CONNECTION
                              17605                 :                :             | CONSTRAINTS
                              17606                 :                :             | CONTENT_P
                              17607                 :                :             | CONTINUE_P
                              17608                 :                :             | CONVERSION_P
                              17609                 :                :             | COPY
                              17610                 :                :             | COST
                              17611                 :                :             | CSV
                              17612                 :                :             | CUBE
                              17613                 :                :             | CURRENT_P
                              17614                 :                :             | CURSOR
                              17615                 :                :             | CYCLE
                              17616                 :                :             | DATA_P
                              17617                 :                :             | DATABASE
                              17618                 :                :             | DAY_P
                              17619                 :                :             | DEALLOCATE
                              17620                 :                :             | DECLARE
                              17621                 :                :             | DEFAULTS
                              17622                 :                :             | DEFERRED
                              17623                 :                :             | DEFINER
                              17624                 :                :             | DELETE_P
                              17625                 :                :             | DELIMITER
                              17626                 :                :             | DELIMITERS
                              17627                 :                :             | DEPENDS
                              17628                 :                :             | DEPTH
                              17629                 :                :             | DETACH
                              17630                 :                :             | DICTIONARY
                              17631                 :                :             | DISABLE_P
                              17632                 :                :             | DISCARD
                              17633                 :                :             | DOCUMENT_P
                              17634                 :                :             | DOMAIN_P
                              17635                 :                :             | DOUBLE_P
                              17636                 :                :             | DROP
                              17637                 :                :             | EACH
                              17638                 :                :             | EMPTY_P
                              17639                 :                :             | ENABLE_P
                              17640                 :                :             | ENCODING
                              17641                 :                :             | ENCRYPTED
                              17642                 :                :             | ENUM_P
                              17643                 :                :             | ERROR_P
                              17644                 :                :             | ESCAPE
                              17645                 :                :             | EVENT
                              17646                 :                :             | EXCLUDE
                              17647                 :                :             | EXCLUDING
                              17648                 :                :             | EXCLUSIVE
                              17649                 :                :             | EXECUTE
                              17650                 :                :             | EXPLAIN
                              17651                 :                :             | EXPRESSION
                              17652                 :                :             | EXTENSION
                              17653                 :                :             | EXTERNAL
                              17654                 :                :             | FAMILY
                              17655                 :                :             | FILTER
                              17656                 :                :             | FINALIZE
                              17657                 :                :             | FIRST_P
                              17658                 :                :             | FOLLOWING
                              17659                 :                :             | FORCE
                              17660                 :                :             | FORMAT
                              17661                 :                :             | FORWARD
                              17662                 :                :             | FUNCTION
                              17663                 :                :             | FUNCTIONS
                              17664                 :                :             | GENERATED
                              17665                 :                :             | GLOBAL
                              17666                 :                :             | GRANTED
                              17667                 :                :             | GROUPS
                              17668                 :                :             | HANDLER
                              17669                 :                :             | HEADER_P
                              17670                 :                :             | HOLD
                              17671                 :                :             | HOUR_P
                              17672                 :                :             | IDENTITY_P
                              17673                 :                :             | IF_P
                              17674                 :                :             | IMMEDIATE
                              17675                 :                :             | IMMUTABLE
                              17676                 :                :             | IMPLICIT_P
                              17677                 :                :             | IMPORT_P
                              17678                 :                :             | INCLUDE
                              17679                 :                :             | INCLUDING
                              17680                 :                :             | INCREMENT
                              17681                 :                :             | INDENT
                              17682                 :                :             | INDEX
                              17683                 :                :             | INDEXES
                              17684                 :                :             | INHERIT
                              17685                 :                :             | INHERITS
                              17686                 :                :             | INLINE_P
                              17687                 :                :             | INPUT_P
                              17688                 :                :             | INSENSITIVE
                              17689                 :                :             | INSERT
                              17690                 :                :             | INSTEAD
                              17691                 :                :             | INVOKER
                              17692                 :                :             | ISOLATION
                              17693                 :                :             | KEEP
                              17694                 :                :             | KEY
                              17695                 :                :             | KEYS
                              17696                 :                :             | LABEL
                              17697                 :                :             | LANGUAGE
                              17698                 :                :             | LARGE_P
                              17699                 :                :             | LAST_P
                              17700                 :                :             | LEAKPROOF
                              17701                 :                :             | LEVEL
                              17702                 :                :             | LISTEN
                              17703                 :                :             | LOAD
                              17704                 :                :             | LOCAL
                              17705                 :                :             | LOCATION
                              17706                 :                :             | LOCK_P
                              17707                 :                :             | LOCKED
                              17708                 :                :             | LOGGED
                              17709                 :                :             | MAPPING
                              17710                 :                :             | MATCH
                              17711                 :                :             | MATCHED
                              17712                 :                :             | MATERIALIZED
                              17713                 :                :             | MAXVALUE
                              17714                 :                :             | MERGE
                              17715                 :                :             | METHOD
                              17716                 :                :             | MINUTE_P
                              17717                 :                :             | MINVALUE
                              17718                 :                :             | MODE
                              17719                 :                :             | MONTH_P
                              17720                 :                :             | MOVE
                              17721                 :                :             | NAME_P
                              17722                 :                :             | NAMES
                              17723                 :                :             | NESTED
                              17724                 :                :             | NEW
                              17725                 :                :             | NEXT
                              17726                 :                :             | NFC
                              17727                 :                :             | NFD
                              17728                 :                :             | NFKC
                              17729                 :                :             | NFKD
                              17730                 :                :             | NO
                              17731                 :                :             | NORMALIZED
                              17732                 :                :             | NOTHING
                              17733                 :                :             | NOTIFY
                              17734                 :                :             | NOWAIT
                              17735                 :                :             | NULLS_P
                              17736                 :                :             | OBJECT_P
                              17737                 :                :             | OF
                              17738                 :                :             | OFF
                              17739                 :                :             | OIDS
                              17740                 :                :             | OLD
                              17741                 :                :             | OMIT
                              17742                 :                :             | OPERATOR
                              17743                 :                :             | OPTION
                              17744                 :                :             | OPTIONS
                              17745                 :                :             | ORDINALITY
                              17746                 :                :             | OTHERS
                              17747                 :                :             | OVER
                              17748                 :                :             | OVERRIDING
                              17749                 :                :             | OWNED
                              17750                 :                :             | OWNER
                              17751                 :                :             | PARALLEL
                              17752                 :                :             | PARAMETER
                              17753                 :                :             | PARSER
                              17754                 :                :             | PARTIAL
                              17755                 :                :             | PARTITION
                              17756                 :                :             | PARTITIONS
                              17757                 :                :             | PASSING
                              17758                 :                :             | PASSWORD
                              17759                 :                :             | PATH
                              17760                 :                :             | PERIOD
                              17761                 :                :             | PLAN
                              17762                 :                :             | PLANS
                              17763                 :                :             | POLICY
                              17764                 :                :             | PRECEDING
                              17765                 :                :             | PREPARE
                              17766                 :                :             | PREPARED
                              17767                 :                :             | PRESERVE
                              17768                 :                :             | PRIOR
                              17769                 :                :             | PRIVILEGES
                              17770                 :                :             | PROCEDURAL
                              17771                 :                :             | PROCEDURE
                              17772                 :                :             | PROCEDURES
                              17773                 :                :             | PROGRAM
                              17774                 :                :             | PUBLICATION
                              17775                 :                :             | QUOTE
                              17776                 :                :             | QUOTES
                              17777                 :                :             | RANGE
                              17778                 :                :             | READ
                              17779                 :                :             | REASSIGN
                              17780                 :                :             | RECHECK
                              17781                 :                :             | RECURSIVE
                              17782                 :                :             | REF_P
                              17783                 :                :             | REFERENCING
                              17784                 :                :             | REFRESH
                              17785                 :                :             | REINDEX
                              17786                 :                :             | RELATIVE_P
                              17787                 :                :             | RELEASE
                              17788                 :                :             | RENAME
                              17789                 :                :             | REPEATABLE
                              17790                 :                :             | REPLACE
                              17791                 :                :             | REPLICA
                              17792                 :                :             | RESET
                              17793                 :                :             | RESTART
                              17794                 :                :             | RESTRICT
                              17795                 :                :             | RETURN
                              17796                 :                :             | RETURNS
                              17797                 :                :             | REVOKE
                              17798                 :                :             | ROLE
                              17799                 :                :             | ROLLBACK
                              17800                 :                :             | ROLLUP
                              17801                 :                :             | ROUTINE
                              17802                 :                :             | ROUTINES
                              17803                 :                :             | ROWS
                              17804                 :                :             | RULE
                              17805                 :                :             | SAVEPOINT
                              17806                 :                :             | SCALAR
                              17807                 :                :             | SCHEMA
                              17808                 :                :             | SCHEMAS
                              17809                 :                :             | SCROLL
                              17810                 :                :             | SEARCH
                              17811                 :                :             | SECOND_P
                              17812                 :                :             | SECURITY
                              17813                 :                :             | SEQUENCE
                              17814                 :                :             | SEQUENCES
                              17815                 :                :             | SERIALIZABLE
                              17816                 :                :             | SERVER
                              17817                 :                :             | SESSION
                              17818                 :                :             | SET
                              17819                 :                :             | SETS
                              17820                 :                :             | SHARE
                              17821                 :                :             | SHOW
                              17822                 :                :             | SIMPLE
                              17823                 :                :             | SKIP
                              17824                 :                :             | SNAPSHOT
                              17825                 :                :             | SOURCE
                              17826                 :                :             | SPLIT
                              17827                 :                :             | SQL_P
                              17828                 :                :             | STABLE
                              17829                 :                :             | STANDALONE_P
                              17830                 :                :             | START
                              17831                 :                :             | STATEMENT
                              17832                 :                :             | STATISTICS
                              17833                 :                :             | STDIN
                              17834                 :                :             | STDOUT
                              17835                 :                :             | STORAGE
                              17836                 :                :             | STORED
                              17837                 :                :             | STRICT_P
                              17838                 :                :             | STRING_P
                              17839                 :                :             | STRIP_P
                              17840                 :                :             | SUBSCRIPTION
                              17841                 :                :             | SUPPORT
                              17842                 :                :             | SYSID
                              17843                 :                :             | SYSTEM_P
                              17844                 :                :             | TABLES
                              17845                 :                :             | TABLESPACE
                              17846                 :                :             | TARGET
                              17847                 :                :             | TEMP
                              17848                 :                :             | TEMPLATE
                              17849                 :                :             | TEMPORARY
                              17850                 :                :             | TEXT_P
                              17851                 :                :             | TIES
                              17852                 :                :             | TRANSACTION
                              17853                 :                :             | TRANSFORM
                              17854                 :                :             | TRIGGER
                              17855                 :                :             | TRUNCATE
                              17856                 :                :             | TRUSTED
                              17857                 :                :             | TYPE_P
                              17858                 :                :             | TYPES_P
                              17859                 :                :             | UESCAPE
                              17860                 :                :             | UNBOUNDED
                              17861                 :                :             | UNCOMMITTED
                              17862                 :                :             | UNCONDITIONAL
                              17863                 :                :             | UNENCRYPTED
                              17864                 :                :             | UNKNOWN
                              17865                 :                :             | UNLISTEN
                              17866                 :                :             | UNLOGGED
                              17867                 :                :             | UNTIL
                              17868                 :                :             | UPDATE
                              17869                 :                :             | VACUUM
                              17870                 :                :             | VALID
                              17871                 :                :             | VALIDATE
                              17872                 :                :             | VALIDATOR
                              17873                 :                :             | VALUE_P
                              17874                 :                :             | VARYING
                              17875                 :                :             | VERSION_P
                              17876                 :                :             | VIEW
                              17877                 :                :             | VIEWS
                              17878                 :                :             | VOLATILE
                              17879                 :                :             | WHITESPACE_P
                              17880                 :                :             | WITHIN
                              17881                 :                :             | WITHOUT
                              17882                 :                :             | WORK
                              17883                 :                :             | WRAPPER
                              17884                 :                :             | WRITE
                              17885                 :                :             | XML_P
                              17886                 :                :             | YEAR_P
                              17887                 :                :             | YES_P
                              17888                 :                :             | ZONE
                              17889                 :                :         ;
                              17890                 :                : 
                              17891                 :                : /* Column identifier --- keywords that can be column, table, etc names.
                              17892                 :                :  *
                              17893                 :                :  * Many of these keywords will in fact be recognized as type or function
                              17894                 :                :  * names too; but they have special productions for the purpose, and so
                              17895                 :                :  * can't be treated as "generic" type or function names.
                              17896                 :                :  *
                              17897                 :                :  * The type names appearing here are not usable as function names
                              17898                 :                :  * because they can be followed by '(' in typename productions, which
                              17899                 :                :  * looks too much like a function call for an LR(1) parser.
                              17900                 :                :  */
                              17901                 :                : col_name_keyword:
                              17902                 :                :               BETWEEN
                              17903                 :                :             | BIGINT
                              17904                 :                :             | BIT
                              17905                 :                :             | BOOLEAN_P
                              17906                 :                :             | CHAR_P
                              17907                 :                :             | CHARACTER
                              17908                 :                :             | COALESCE
                              17909                 :                :             | DEC
                              17910                 :                :             | DECIMAL_P
                              17911                 :                :             | EXISTS
                              17912                 :                :             | EXTRACT
                              17913                 :                :             | FLOAT_P
                              17914                 :                :             | GREATEST
                              17915                 :                :             | GROUPING
                              17916                 :                :             | INOUT
                              17917                 :                :             | INT_P
                              17918                 :                :             | INTEGER
                              17919                 :                :             | INTERVAL
                              17920                 :                :             | JSON
                              17921                 :                :             | JSON_ARRAY
                              17922                 :                :             | JSON_ARRAYAGG
                              17923                 :                :             | JSON_EXISTS
                              17924                 :                :             | JSON_OBJECT
                              17925                 :                :             | JSON_OBJECTAGG
                              17926                 :                :             | JSON_QUERY
                              17927                 :                :             | JSON_SCALAR
                              17928                 :                :             | JSON_SERIALIZE
                              17929                 :                :             | JSON_TABLE
                              17930                 :                :             | JSON_VALUE
                              17931                 :                :             | LEAST
                              17932                 :                :             | MERGE_ACTION
                              17933                 :                :             | NATIONAL
                              17934                 :                :             | NCHAR
                              17935                 :                :             | NONE
                              17936                 :                :             | NORMALIZE
                              17937                 :                :             | NULLIF
                              17938                 :                :             | NUMERIC
                              17939                 :                :             | OUT_P
                              17940                 :                :             | OVERLAY
                              17941                 :                :             | POSITION
                              17942                 :                :             | PRECISION
                              17943                 :                :             | REAL
                              17944                 :                :             | ROW
                              17945                 :                :             | SETOF
                              17946                 :                :             | SMALLINT
                              17947                 :                :             | SUBSTRING
                              17948                 :                :             | TIME
                              17949                 :                :             | TIMESTAMP
                              17950                 :                :             | TREAT
                              17951                 :                :             | TRIM
                              17952                 :                :             | VALUES
                              17953                 :                :             | VARCHAR
                              17954                 :                :             | XMLATTRIBUTES
                              17955                 :                :             | XMLCONCAT
                              17956                 :                :             | XMLELEMENT
                              17957                 :                :             | XMLEXISTS
                              17958                 :                :             | XMLFOREST
                              17959                 :                :             | XMLNAMESPACES
                              17960                 :                :             | XMLPARSE
                              17961                 :                :             | XMLPI
                              17962                 :                :             | XMLROOT
                              17963                 :                :             | XMLSERIALIZE
                              17964                 :                :             | XMLTABLE
                              17965                 :                :         ;
                              17966                 :                : 
                              17967                 :                : /* Type/function identifier --- keywords that can be type or function names.
                              17968                 :                :  *
                              17969                 :                :  * Most of these are keywords that are used as operators in expressions;
                              17970                 :                :  * in general such keywords can't be column names because they would be
                              17971                 :                :  * ambiguous with variables, but they are unambiguous as function identifiers.
                              17972                 :                :  *
                              17973                 :                :  * Do not include POSITION, SUBSTRING, etc here since they have explicit
                              17974                 :                :  * productions in a_expr to support the goofy SQL9x argument syntax.
                              17975                 :                :  * - thomas 2000-11-28
                              17976                 :                :  */
                              17977                 :                : type_func_name_keyword:
                              17978                 :                :               AUTHORIZATION
                              17979                 :                :             | BINARY
                              17980                 :                :             | COLLATION
                              17981                 :                :             | CONCURRENTLY
                              17982                 :                :             | CROSS
                              17983                 :                :             | CURRENT_SCHEMA
                              17984                 :                :             | FREEZE
                              17985                 :                :             | FULL
                              17986                 :                :             | ILIKE
                              17987                 :                :             | INNER_P
                              17988                 :                :             | IS
                              17989                 :                :             | ISNULL
                              17990                 :                :             | JOIN
                              17991                 :                :             | LEFT
                              17992                 :                :             | LIKE
                              17993                 :                :             | NATURAL
                              17994                 :                :             | NOTNULL
                              17995                 :                :             | OUTER_P
                              17996                 :                :             | OVERLAPS
                              17997                 :                :             | RIGHT
                              17998                 :                :             | SIMILAR
                              17999                 :                :             | TABLESAMPLE
                              18000                 :                :             | VERBOSE
                              18001                 :                :         ;
                              18002                 :                : 
                              18003                 :                : /* Reserved keyword --- these keywords are usable only as a ColLabel.
                              18004                 :                :  *
                              18005                 :                :  * Keywords appear here if they could not be distinguished from variable,
                              18006                 :                :  * type, or function names in some contexts.  Don't put things here unless
                              18007                 :                :  * forced to.
                              18008                 :                :  */
                              18009                 :                : reserved_keyword:
                              18010                 :                :               ALL
                              18011                 :                :             | ANALYSE
                              18012                 :                :             | ANALYZE
                              18013                 :                :             | AND
                              18014                 :                :             | ANY
                              18015                 :                :             | ARRAY
                              18016                 :                :             | AS
                              18017                 :                :             | ASC
                              18018                 :                :             | ASYMMETRIC
                              18019                 :                :             | BOTH
                              18020                 :                :             | CASE
                              18021                 :                :             | CAST
                              18022                 :                :             | CHECK
                              18023                 :                :             | COLLATE
                              18024                 :                :             | COLUMN
                              18025                 :                :             | CONSTRAINT
                              18026                 :                :             | CREATE
                              18027                 :                :             | CURRENT_CATALOG
                              18028                 :                :             | CURRENT_DATE
                              18029                 :                :             | CURRENT_ROLE
                              18030                 :                :             | CURRENT_TIME
                              18031                 :                :             | CURRENT_TIMESTAMP
                              18032                 :                :             | CURRENT_USER
                              18033                 :                :             | DEFAULT
                              18034                 :                :             | DEFERRABLE
                              18035                 :                :             | DESC
                              18036                 :                :             | DISTINCT
                              18037                 :                :             | DO
                              18038                 :                :             | ELSE
                              18039                 :                :             | END_P
                              18040                 :                :             | EXCEPT
                              18041                 :                :             | FALSE_P
                              18042                 :                :             | FETCH
                              18043                 :                :             | FOR
                              18044                 :                :             | FOREIGN
                              18045                 :                :             | FROM
                              18046                 :                :             | GRANT
                              18047                 :                :             | GROUP_P
                              18048                 :                :             | HAVING
                              18049                 :                :             | IN_P
                              18050                 :                :             | INITIALLY
                              18051                 :                :             | INTERSECT
                              18052                 :                :             | INTO
                              18053                 :                :             | LATERAL_P
                              18054                 :                :             | LEADING
                              18055                 :                :             | LIMIT
                              18056                 :                :             | LOCALTIME
                              18057                 :                :             | LOCALTIMESTAMP
                              18058                 :                :             | NOT
                              18059                 :                :             | NULL_P
                              18060                 :                :             | OFFSET
                              18061                 :                :             | ON
                              18062                 :                :             | ONLY
                              18063                 :                :             | OR
                              18064                 :                :             | ORDER
                              18065                 :                :             | PLACING
                              18066                 :                :             | PRIMARY
                              18067                 :                :             | REFERENCES
                              18068                 :                :             | RETURNING
                              18069                 :                :             | SELECT
                              18070                 :                :             | SESSION_USER
                              18071                 :                :             | SOME
                              18072                 :                :             | SYMMETRIC
                              18073                 :                :             | SYSTEM_USER
                              18074                 :                :             | TABLE
                              18075                 :                :             | THEN
                              18076                 :                :             | TO
                              18077                 :                :             | TRAILING
                              18078                 :                :             | TRUE_P
                              18079                 :                :             | UNION
                              18080                 :                :             | UNIQUE
                              18081                 :                :             | USER
                              18082                 :                :             | USING
                              18083                 :                :             | VARIADIC
                              18084                 :                :             | WHEN
                              18085                 :                :             | WHERE
                              18086                 :                :             | WINDOW
                              18087                 :                :             | WITH
                              18088                 :                :         ;
                              18089                 :                : 
                              18090                 :                : /*
                              18091                 :                :  * While all keywords can be used as column labels when preceded by AS,
                              18092                 :                :  * not all of them can be used as a "bare" column label without AS.
                              18093                 :                :  * Those that can be used as a bare label must be listed here,
                              18094                 :                :  * in addition to appearing in one of the category lists above.
                              18095                 :                :  *
                              18096                 :                :  * Always add a new keyword to this list if possible.  Mark it BARE_LABEL
                              18097                 :                :  * in kwlist.h if it is included here, or AS_LABEL if it is not.
                              18098                 :                :  */
                              18099                 :                : bare_label_keyword:
                              18100                 :                :               ABORT_P
                              18101                 :                :             | ABSENT
                              18102                 :                :             | ABSOLUTE_P
                              18103                 :                :             | ACCESS
                              18104                 :                :             | ACTION
                              18105                 :                :             | ADD_P
                              18106                 :                :             | ADMIN
                              18107                 :                :             | AFTER
                              18108                 :                :             | AGGREGATE
                              18109                 :                :             | ALL
                              18110                 :                :             | ALSO
                              18111                 :                :             | ALTER
                              18112                 :                :             | ALWAYS
                              18113                 :                :             | ANALYSE
                              18114                 :                :             | ANALYZE
                              18115                 :                :             | AND
                              18116                 :                :             | ANY
                              18117                 :                :             | ASC
                              18118                 :                :             | ASENSITIVE
                              18119                 :                :             | ASSERTION
                              18120                 :                :             | ASSIGNMENT
                              18121                 :                :             | ASYMMETRIC
                              18122                 :                :             | AT
                              18123                 :                :             | ATOMIC
                              18124                 :                :             | ATTACH
                              18125                 :                :             | ATTRIBUTE
                              18126                 :                :             | AUTHORIZATION
                              18127                 :                :             | BACKWARD
                              18128                 :                :             | BEFORE
                              18129                 :                :             | BEGIN_P
                              18130                 :                :             | BETWEEN
                              18131                 :                :             | BIGINT
                              18132                 :                :             | BINARY
                              18133                 :                :             | BIT
                              18134                 :                :             | BOOLEAN_P
                              18135                 :                :             | BOTH
                              18136                 :                :             | BREADTH
                              18137                 :                :             | BY
                              18138                 :                :             | CACHE
                              18139                 :                :             | CALL
                              18140                 :                :             | CALLED
                              18141                 :                :             | CASCADE
                              18142                 :                :             | CASCADED
                              18143                 :                :             | CASE
                              18144                 :                :             | CAST
                              18145                 :                :             | CATALOG_P
                              18146                 :                :             | CHAIN
                              18147                 :                :             | CHARACTERISTICS
                              18148                 :                :             | CHECK
                              18149                 :                :             | CHECKPOINT
                              18150                 :                :             | CLASS
                              18151                 :                :             | CLOSE
                              18152                 :                :             | CLUSTER
                              18153                 :                :             | COALESCE
                              18154                 :                :             | COLLATE
                              18155                 :                :             | COLLATION
                              18156                 :                :             | COLUMN
                              18157                 :                :             | COLUMNS
                              18158                 :                :             | COMMENT
                              18159                 :                :             | COMMENTS
                              18160                 :                :             | COMMIT
                              18161                 :                :             | COMMITTED
                              18162                 :                :             | COMPRESSION
                              18163                 :                :             | CONCURRENTLY
                              18164                 :                :             | CONDITIONAL
                              18165                 :                :             | CONFIGURATION
                              18166                 :                :             | CONFLICT
                              18167                 :                :             | CONNECTION
                              18168                 :                :             | CONSTRAINT
                              18169                 :                :             | CONSTRAINTS
                              18170                 :                :             | CONTENT_P
                              18171                 :                :             | CONTINUE_P
                              18172                 :                :             | CONVERSION_P
                              18173                 :                :             | COPY
                              18174                 :                :             | COST
                              18175                 :                :             | CROSS
                              18176                 :                :             | CSV
                              18177                 :                :             | CUBE
                              18178                 :                :             | CURRENT_P
                              18179                 :                :             | CURRENT_CATALOG
                              18180                 :                :             | CURRENT_DATE
                              18181                 :                :             | CURRENT_ROLE
                              18182                 :                :             | CURRENT_SCHEMA
                              18183                 :                :             | CURRENT_TIME
                              18184                 :                :             | CURRENT_TIMESTAMP
                              18185                 :                :             | CURRENT_USER
                              18186                 :                :             | CURSOR
                              18187                 :                :             | CYCLE
                              18188                 :                :             | DATA_P
                              18189                 :                :             | DATABASE
                              18190                 :                :             | DEALLOCATE
                              18191                 :                :             | DEC
                              18192                 :                :             | DECIMAL_P
                              18193                 :                :             | DECLARE
                              18194                 :                :             | DEFAULT
                              18195                 :                :             | DEFAULTS
                              18196                 :                :             | DEFERRABLE
                              18197                 :                :             | DEFERRED
                              18198                 :                :             | DEFINER
                              18199                 :                :             | DELETE_P
                              18200                 :                :             | DELIMITER
                              18201                 :                :             | DELIMITERS
                              18202                 :                :             | DEPENDS
                              18203                 :                :             | DEPTH
                              18204                 :                :             | DESC
                              18205                 :                :             | DETACH
                              18206                 :                :             | DICTIONARY
                              18207                 :                :             | DISABLE_P
                              18208                 :                :             | DISCARD
                              18209                 :                :             | DISTINCT
                              18210                 :                :             | DO
                              18211                 :                :             | DOCUMENT_P
                              18212                 :                :             | DOMAIN_P
                              18213                 :                :             | DOUBLE_P
                              18214                 :                :             | DROP
                              18215                 :                :             | EACH
                              18216                 :                :             | ELSE
                              18217                 :                :             | EMPTY_P
                              18218                 :                :             | ENABLE_P
                              18219                 :                :             | ENCODING
                              18220                 :                :             | ENCRYPTED
                              18221                 :                :             | END_P
                              18222                 :                :             | ENUM_P
                              18223                 :                :             | ERROR_P
                              18224                 :                :             | ESCAPE
                              18225                 :                :             | EVENT
                              18226                 :                :             | EXCLUDE
                              18227                 :                :             | EXCLUDING
                              18228                 :                :             | EXCLUSIVE
                              18229                 :                :             | EXECUTE
                              18230                 :                :             | EXISTS
                              18231                 :                :             | EXPLAIN
                              18232                 :                :             | EXPRESSION
                              18233                 :                :             | EXTENSION
                              18234                 :                :             | EXTERNAL
                              18235                 :                :             | EXTRACT
                              18236                 :                :             | FALSE_P
                              18237                 :                :             | FAMILY
                              18238                 :                :             | FINALIZE
                              18239                 :                :             | FIRST_P
                              18240                 :                :             | FLOAT_P
                              18241                 :                :             | FOLLOWING
                              18242                 :                :             | FORCE
                              18243                 :                :             | FOREIGN
                              18244                 :                :             | FORMAT
                              18245                 :                :             | FORWARD
                              18246                 :                :             | FREEZE
                              18247                 :                :             | FULL
                              18248                 :                :             | FUNCTION
                              18249                 :                :             | FUNCTIONS
                              18250                 :                :             | GENERATED
                              18251                 :                :             | GLOBAL
                              18252                 :                :             | GRANTED
                              18253                 :                :             | GREATEST
                              18254                 :                :             | GROUPING
                              18255                 :                :             | GROUPS
                              18256                 :                :             | HANDLER
                              18257                 :                :             | HEADER_P
                              18258                 :                :             | HOLD
                              18259                 :                :             | IDENTITY_P
                              18260                 :                :             | IF_P
                              18261                 :                :             | ILIKE
                              18262                 :                :             | IMMEDIATE
                              18263                 :                :             | IMMUTABLE
                              18264                 :                :             | IMPLICIT_P
                              18265                 :                :             | IMPORT_P
                              18266                 :                :             | IN_P
                              18267                 :                :             | INCLUDE
                              18268                 :                :             | INCLUDING
                              18269                 :                :             | INCREMENT
                              18270                 :                :             | INDENT
                              18271                 :                :             | INDEX
                              18272                 :                :             | INDEXES
                              18273                 :                :             | INHERIT
                              18274                 :                :             | INHERITS
                              18275                 :                :             | INITIALLY
                              18276                 :                :             | INLINE_P
                              18277                 :                :             | INNER_P
                              18278                 :                :             | INOUT
                              18279                 :                :             | INPUT_P
                              18280                 :                :             | INSENSITIVE
                              18281                 :                :             | INSERT
                              18282                 :                :             | INSTEAD
                              18283                 :                :             | INT_P
                              18284                 :                :             | INTEGER
                              18285                 :                :             | INTERVAL
                              18286                 :                :             | INVOKER
                              18287                 :                :             | IS
                              18288                 :                :             | ISOLATION
                              18289                 :                :             | JOIN
                              18290                 :                :             | JSON
                              18291                 :                :             | JSON_ARRAY
                              18292                 :                :             | JSON_ARRAYAGG
                              18293                 :                :             | JSON_EXISTS
                              18294                 :                :             | JSON_OBJECT
                              18295                 :                :             | JSON_OBJECTAGG
                              18296                 :                :             | JSON_QUERY
                              18297                 :                :             | JSON_SCALAR
                              18298                 :                :             | JSON_SERIALIZE
                              18299                 :                :             | JSON_TABLE
                              18300                 :                :             | JSON_VALUE
                              18301                 :                :             | KEEP
                              18302                 :                :             | KEY
                              18303                 :                :             | KEYS
                              18304                 :                :             | LABEL
                              18305                 :                :             | LANGUAGE
                              18306                 :                :             | LARGE_P
                              18307                 :                :             | LAST_P
                              18308                 :                :             | LATERAL_P
                              18309                 :                :             | LEADING
                              18310                 :                :             | LEAKPROOF
                              18311                 :                :             | LEAST
                              18312                 :                :             | LEFT
                              18313                 :                :             | LEVEL
                              18314                 :                :             | LIKE
                              18315                 :                :             | LISTEN
                              18316                 :                :             | LOAD
                              18317                 :                :             | LOCAL
                              18318                 :                :             | LOCALTIME
                              18319                 :                :             | LOCALTIMESTAMP
                              18320                 :                :             | LOCATION
                              18321                 :                :             | LOCK_P
                              18322                 :                :             | LOCKED
                              18323                 :                :             | LOGGED
                              18324                 :                :             | MAPPING
                              18325                 :                :             | MATCH
                              18326                 :                :             | MATCHED
                              18327                 :                :             | MATERIALIZED
                              18328                 :                :             | MAXVALUE
                              18329                 :                :             | MERGE
                              18330                 :                :             | MERGE_ACTION
                              18331                 :                :             | METHOD
                              18332                 :                :             | MINVALUE
                              18333                 :                :             | MODE
                              18334                 :                :             | MOVE
                              18335                 :                :             | NAME_P
                              18336                 :                :             | NAMES
                              18337                 :                :             | NATIONAL
                              18338                 :                :             | NATURAL
                              18339                 :                :             | NCHAR
                              18340                 :                :             | NESTED
                              18341                 :                :             | NEW
                              18342                 :                :             | NEXT
                              18343                 :                :             | NFC
                              18344                 :                :             | NFD
                              18345                 :                :             | NFKC
                              18346                 :                :             | NFKD
                              18347                 :                :             | NO
                              18348                 :                :             | NONE
                              18349                 :                :             | NORMALIZE
                              18350                 :                :             | NORMALIZED
                              18351                 :                :             | NOT
                              18352                 :                :             | NOTHING
                              18353                 :                :             | NOTIFY
                              18354                 :                :             | NOWAIT
                              18355                 :                :             | NULL_P
                              18356                 :                :             | NULLIF
                              18357                 :                :             | NULLS_P
                              18358                 :                :             | NUMERIC
                              18359                 :                :             | OBJECT_P
                              18360                 :                :             | OF
                              18361                 :                :             | OFF
                              18362                 :                :             | OIDS
                              18363                 :                :             | OLD
                              18364                 :                :             | OMIT
                              18365                 :                :             | ONLY
                              18366                 :                :             | OPERATOR
                              18367                 :                :             | OPTION
                              18368                 :                :             | OPTIONS
                              18369                 :                :             | OR
                              18370                 :                :             | ORDINALITY
                              18371                 :                :             | OTHERS
                              18372                 :                :             | OUT_P
                              18373                 :                :             | OUTER_P
                              18374                 :                :             | OVERLAY
                              18375                 :                :             | OVERRIDING
                              18376                 :                :             | OWNED
                              18377                 :                :             | OWNER
                              18378                 :                :             | PARALLEL
                              18379                 :                :             | PARAMETER
                              18380                 :                :             | PARSER
                              18381                 :                :             | PARTIAL
                              18382                 :                :             | PARTITION
                              18383                 :                :             | PARTITIONS
                              18384                 :                :             | PASSING
                              18385                 :                :             | PASSWORD
                              18386                 :                :             | PATH
                              18387                 :                :             | PERIOD
                              18388                 :                :             | PLACING
                              18389                 :                :             | PLAN
                              18390                 :                :             | PLANS
                              18391                 :                :             | POLICY
                              18392                 :                :             | POSITION
                              18393                 :                :             | PRECEDING
                              18394                 :                :             | PREPARE
                              18395                 :                :             | PREPARED
                              18396                 :                :             | PRESERVE
                              18397                 :                :             | PRIMARY
                              18398                 :                :             | PRIOR
                              18399                 :                :             | PRIVILEGES
                              18400                 :                :             | PROCEDURAL
                              18401                 :                :             | PROCEDURE
                              18402                 :                :             | PROCEDURES
                              18403                 :                :             | PROGRAM
                              18404                 :                :             | PUBLICATION
                              18405                 :                :             | QUOTE
                              18406                 :                :             | QUOTES
                              18407                 :                :             | RANGE
                              18408                 :                :             | READ
                              18409                 :                :             | REAL
                              18410                 :                :             | REASSIGN
                              18411                 :                :             | RECHECK
                              18412                 :                :             | RECURSIVE
                              18413                 :                :             | REF_P
                              18414                 :                :             | REFERENCES
                              18415                 :                :             | REFERENCING
                              18416                 :                :             | REFRESH
                              18417                 :                :             | REINDEX
                              18418                 :                :             | RELATIVE_P
                              18419                 :                :             | RELEASE
                              18420                 :                :             | RENAME
                              18421                 :                :             | REPEATABLE
                              18422                 :                :             | REPLACE
                              18423                 :                :             | REPLICA
                              18424                 :                :             | RESET
                              18425                 :                :             | RESTART
                              18426                 :                :             | RESTRICT
                              18427                 :                :             | RETURN
                              18428                 :                :             | RETURNS
                              18429                 :                :             | REVOKE
                              18430                 :                :             | RIGHT
                              18431                 :                :             | ROLE
                              18432                 :                :             | ROLLBACK
                              18433                 :                :             | ROLLUP
                              18434                 :                :             | ROUTINE
                              18435                 :                :             | ROUTINES
                              18436                 :                :             | ROW
                              18437                 :                :             | ROWS
                              18438                 :                :             | RULE
                              18439                 :                :             | SAVEPOINT
                              18440                 :                :             | SCALAR
                              18441                 :                :             | SCHEMA
                              18442                 :                :             | SCHEMAS
                              18443                 :                :             | SCROLL
                              18444                 :                :             | SEARCH
                              18445                 :                :             | SECURITY
                              18446                 :                :             | SELECT
                              18447                 :                :             | SEQUENCE
                              18448                 :                :             | SEQUENCES
                              18449                 :                :             | SERIALIZABLE
                              18450                 :                :             | SERVER
                              18451                 :                :             | SESSION
                              18452                 :                :             | SESSION_USER
                              18453                 :                :             | SET
                              18454                 :                :             | SETOF
                              18455                 :                :             | SETS
                              18456                 :                :             | SHARE
                              18457                 :                :             | SHOW
                              18458                 :                :             | SIMILAR
                              18459                 :                :             | SIMPLE
                              18460                 :                :             | SKIP
                              18461                 :                :             | SMALLINT
                              18462                 :                :             | SNAPSHOT
                              18463                 :                :             | SOME
                              18464                 :                :             | SOURCE
                              18465                 :                :             | SPLIT
                              18466                 :                :             | SQL_P
                              18467                 :                :             | STABLE
                              18468                 :                :             | STANDALONE_P
                              18469                 :                :             | START
                              18470                 :                :             | STATEMENT
                              18471                 :                :             | STATISTICS
                              18472                 :                :             | STDIN
                              18473                 :                :             | STDOUT
                              18474                 :                :             | STORAGE
                              18475                 :                :             | STORED
                              18476                 :                :             | STRICT_P
                              18477                 :                :             | STRING_P
                              18478                 :                :             | STRIP_P
                              18479                 :                :             | SUBSCRIPTION
                              18480                 :                :             | SUBSTRING
                              18481                 :                :             | SUPPORT
                              18482                 :                :             | SYMMETRIC
                              18483                 :                :             | SYSID
                              18484                 :                :             | SYSTEM_P
                              18485                 :                :             | SYSTEM_USER
                              18486                 :                :             | TABLE
                              18487                 :                :             | TABLES
                              18488                 :                :             | TABLESAMPLE
                              18489                 :                :             | TABLESPACE
                              18490                 :                :             | TARGET
                              18491                 :                :             | TEMP
                              18492                 :                :             | TEMPLATE
                              18493                 :                :             | TEMPORARY
                              18494                 :                :             | TEXT_P
                              18495                 :                :             | THEN
                              18496                 :                :             | TIES
                              18497                 :                :             | TIME
                              18498                 :                :             | TIMESTAMP
                              18499                 :                :             | TRAILING
                              18500                 :                :             | TRANSACTION
                              18501                 :                :             | TRANSFORM
                              18502                 :                :             | TREAT
                              18503                 :                :             | TRIGGER
                              18504                 :                :             | TRIM
                              18505                 :                :             | TRUE_P
                              18506                 :                :             | TRUNCATE
                              18507                 :                :             | TRUSTED
                              18508                 :                :             | TYPE_P
                              18509                 :                :             | TYPES_P
                              18510                 :                :             | UESCAPE
                              18511                 :                :             | UNBOUNDED
                              18512                 :                :             | UNCOMMITTED
                              18513                 :                :             | UNCONDITIONAL
                              18514                 :                :             | UNENCRYPTED
                              18515                 :                :             | UNIQUE
                              18516                 :                :             | UNKNOWN
                              18517                 :                :             | UNLISTEN
                              18518                 :                :             | UNLOGGED
                              18519                 :                :             | UNTIL
                              18520                 :                :             | UPDATE
                              18521                 :                :             | USER
                              18522                 :                :             | USING
                              18523                 :                :             | VACUUM
                              18524                 :                :             | VALID
                              18525                 :                :             | VALIDATE
                              18526                 :                :             | VALIDATOR
                              18527                 :                :             | VALUE_P
                              18528                 :                :             | VALUES
                              18529                 :                :             | VARCHAR
                              18530                 :                :             | VARIADIC
                              18531                 :                :             | VERBOSE
                              18532                 :                :             | VERSION_P
                              18533                 :                :             | VIEW
                              18534                 :                :             | VIEWS
                              18535                 :                :             | VOLATILE
                              18536                 :                :             | WHEN
                              18537                 :                :             | WHITESPACE_P
                              18538                 :                :             | WORK
                              18539                 :                :             | WRAPPER
                              18540                 :                :             | WRITE
                              18541                 :                :             | XML_P
                              18542                 :                :             | XMLATTRIBUTES
                              18543                 :                :             | XMLCONCAT
                              18544                 :                :             | XMLELEMENT
                              18545                 :                :             | XMLEXISTS
                              18546                 :                :             | XMLFOREST
                              18547                 :                :             | XMLNAMESPACES
                              18548                 :                :             | XMLPARSE
                              18549                 :                :             | XMLPI
                              18550                 :                :             | XMLROOT
                              18551                 :                :             | XMLSERIALIZE
                              18552                 :                :             | XMLTABLE
                              18553                 :                :             | YES_P
                              18554                 :                :             | ZONE
                              18555                 :                :         ;
                              18556                 :                : 
                              18557                 :                : %%
                              18558                 :                : 
                              18559                 :                : /*
                              18560                 :                :  * The signature of this function is required by bison.  However, we
                              18561                 :                :  * ignore the passed yylloc and instead use the last token position
                              18562                 :                :  * available from the scanner.
                              18563                 :                :  */
                              18564                 :                : static void
 5270                         18565                 :            338 : base_yyerror(YYLTYPE *yylloc, core_yyscan_t yyscanner, const char *msg)
                              18566                 :                : {
 5389                         18567                 :            338 :     parser_yyerror(msg);
                              18568                 :                : }
                              18569                 :                : 
                              18570                 :                : static RawStmt *
 2647                         18571                 :         383893 : makeRawStmt(Node *stmt, int stmt_location)
                              18572                 :                : {
                              18573                 :         383893 :     RawStmt    *rs = makeNode(RawStmt);
                              18574                 :                : 
                              18575                 :         383893 :     rs->stmt = stmt;
                              18576                 :         383893 :     rs->stmt_location = stmt_location;
                              18577                 :         383893 :     rs->stmt_len = 0;            /* might get changed later */
                              18578                 :         383893 :     return rs;
                              18579                 :                : }
                              18580                 :                : 
                              18581                 :                : /* Adjust a RawStmt to reflect that it doesn't run to the end of the string */
                              18582                 :                : static void
                              18583                 :         275774 : updateRawStmtEnd(RawStmt *rs, int end_location)
                              18584                 :                : {
                              18585                 :                :     /*
                              18586                 :                :      * If we already set the length, don't change it.  This is for situations
                              18587                 :                :      * like "select foo ;; select bar" where the same statement will be last
                              18588                 :                :      * in the string for more than one semicolon.
                              18589                 :                :      */
                              18590         [ +  + ]:         275774 :     if (rs->stmt_len > 0)
                              18591                 :              5 :         return;
                              18592                 :                : 
                              18593                 :                :     /* OK, update length of RawStmt */
                              18594                 :         275769 :     rs->stmt_len = end_location - rs->stmt_location;
                              18595                 :                : }
                              18596                 :                : 
                              18597                 :                : static Node *
 5389                         18598                 :         763337 : makeColumnRef(char *colname, List *indirection,
                              18599                 :                :               int location, core_yyscan_t yyscanner)
                              18600                 :                : {
                              18601                 :                :     /*
                              18602                 :                :      * Generate a ColumnRef node, with an A_Indirection node added if there
                              18603                 :                :      * is any subscripting in the specified indirection list.  However,
                              18604                 :                :      * any field selection at the start of the indirection list must be
                              18605                 :                :      * transposed into the "fields" part of the ColumnRef node.
                              18606                 :                :      */
 7249                         18607                 :         763337 :     ColumnRef  *c = makeNode(ColumnRef);
  702 peter@eisentraut.org    18608                 :         763337 :     int         nfields = 0;
                              18609                 :                :     ListCell   *l;
                              18610                 :                : 
 6606 tgl@sss.pgh.pa.us       18611                 :         763337 :     c->location = location;
 7249                         18612   [ +  +  +  +  :        1225629 :     foreach(l, indirection)
                                              +  + ]
                              18613                 :                :     {
                              18614         [ +  + ]:         466635 :         if (IsA(lfirst(l), A_Indices))
                              18615                 :                :         {
                              18616                 :           4343 :             A_Indirection *i = makeNode(A_Indirection);
                              18617                 :                : 
                              18618         [ +  + ]:           4343 :             if (nfields == 0)
                              18619                 :                :             {
                              18620                 :                :                 /* easy case - all indirection goes to A_Indirection */
 5706                         18621                 :           3149 :                 c->fields = list_make1(makeString(colname));
 5389                         18622                 :           3149 :                 i->indirection = check_indirection(indirection, yyscanner);
                              18623                 :                :             }
                              18624                 :                :             else
                              18625                 :                :             {
                              18626                 :                :                 /* got to split the list in two */
 5706                         18627                 :           1194 :                 i->indirection = check_indirection(list_copy_tail(indirection,
                              18628                 :                :                                                                   nfields),
                              18629                 :                :                                                    yyscanner);
 7249                         18630                 :           1194 :                 indirection = list_truncate(indirection, nfields);
 5706                         18631                 :           1194 :                 c->fields = lcons(makeString(colname), indirection);
                              18632                 :                :             }
 7249                         18633                 :           4343 :             i->arg = (Node *) c;
                              18634                 :           4343 :             return (Node *) i;
                              18635                 :                :         }
 5706                         18636         [ +  + ]:         462292 :         else if (IsA(lfirst(l), A_Star))
                              18637                 :                :         {
                              18638                 :                :             /* We only allow '*' at the end of a ColumnRef */
 1735                         18639         [ -  + ]:           2346 :             if (lnext(indirection, l) != NULL)
 5389 tgl@sss.pgh.pa.us       18640                 :UBC           0 :                 parser_yyerror("improper use of \"*\"");
                              18641                 :                :         }
 7249 tgl@sss.pgh.pa.us       18642                 :CBC      462292 :         nfields++;
                              18643                 :                :     }
                              18644                 :                :     /* No subscripting, so all indirection gets added to field list */
 5706                         18645                 :         758994 :     c->fields = lcons(makeString(colname), indirection);
 7249                         18646                 :         758994 :     return (Node *) c;
                              18647                 :                : }
                              18648                 :                : 
                              18649                 :                : static Node *
 5708                         18650                 :         120023 : makeTypeCast(Node *arg, TypeName *typename, int location)
                              18651                 :                : {
  702 peter@eisentraut.org    18652                 :         120023 :     TypeCast   *n = makeNode(TypeCast);
                              18653                 :                : 
 7953 bruce@momjian.us        18654                 :         120023 :     n->arg = arg;
 5386 peter_e@gmx.net         18655                 :         120023 :     n->typeName = typename;
 5708 tgl@sss.pgh.pa.us       18656                 :         120023 :     n->location = location;
 7953 bruce@momjian.us        18657                 :         120023 :     return (Node *) n;
                              18658                 :                : }
                              18659                 :                : 
                              18660                 :                : static Node *
 5708 tgl@sss.pgh.pa.us       18661                 :           7748 : makeStringConstCast(char *str, int location, TypeName *typename)
                              18662                 :                : {
  702 peter@eisentraut.org    18663                 :           7748 :     Node       *s = makeStringConst(str, location);
                              18664                 :                : 
 5708 tgl@sss.pgh.pa.us       18665                 :           7748 :     return makeTypeCast(s, typename, -1);
                              18666                 :                : }
                              18667                 :                : 
                              18668                 :                : static Node *
                              18669                 :         220339 : makeIntConst(int val, int location)
                              18670                 :                : {
  702 peter@eisentraut.org    18671                 :         220339 :     A_Const    *n = makeNode(A_Const);
                              18672                 :                : 
  948                         18673                 :         220339 :     n->val.ival.type = T_Integer;
  821                         18674                 :         220339 :     n->val.ival.ival = val;
 5708 tgl@sss.pgh.pa.us       18675                 :         220339 :     n->location = location;
                              18676                 :                : 
  702 peter@eisentraut.org    18677                 :         220339 :    return (Node *) n;
                              18678                 :                : }
                              18679                 :                : 
                              18680                 :                : static Node *
 5708 tgl@sss.pgh.pa.us       18681                 :           5402 : makeFloatConst(char *str, int location)
                              18682                 :                : {
  702 peter@eisentraut.org    18683                 :           5402 :     A_Const    *n = makeNode(A_Const);
                              18684                 :                : 
  948                         18685                 :           5402 :     n->val.fval.type = T_Float;
  821                         18686                 :           5402 :     n->val.fval.fval = str;
 5708 tgl@sss.pgh.pa.us       18687                 :           5402 :     n->location = location;
                              18688                 :                : 
  702 peter@eisentraut.org    18689                 :           5402 :    return (Node *) n;
                              18690                 :                : }
                              18691                 :                : 
                              18692                 :                : static Node *
  821                         18693                 :          28259 : makeBoolAConst(bool state, int location)
                              18694                 :                : {
  702                         18695                 :          28259 :     A_Const    *n = makeNode(A_Const);
                              18696                 :                : 
  821                         18697                 :          28259 :     n->val.boolval.type = T_Boolean;
                              18698                 :          28259 :     n->val.boolval.boolval = state;
                              18699                 :          28259 :     n->location = location;
                              18700                 :                : 
  702                         18701                 :          28259 :    return (Node *) n;
                              18702                 :                : }
                              18703                 :                : 
                              18704                 :                : static Node *
 5708 tgl@sss.pgh.pa.us       18705                 :           2035 : makeBitStringConst(char *str, int location)
                              18706                 :                : {
  702 peter@eisentraut.org    18707                 :           2035 :     A_Const    *n = makeNode(A_Const);
                              18708                 :                : 
  948                         18709                 :           2035 :     n->val.bsval.type = T_BitString;
  821                         18710                 :           2035 :     n->val.bsval.bsval = str;
 5708 tgl@sss.pgh.pa.us       18711                 :           2035 :     n->location = location;
                              18712                 :                : 
  702 peter@eisentraut.org    18713                 :           2035 :    return (Node *) n;
                              18714                 :                : }
                              18715                 :                : 
                              18716                 :                : static Node *
 5708 tgl@sss.pgh.pa.us       18717                 :          28185 : makeNullAConst(int location)
                              18718                 :                : {
  702 peter@eisentraut.org    18719                 :          28185 :     A_Const    *n = makeNode(A_Const);
                              18720                 :                : 
  948                         18721                 :          28185 :     n->isnull = true;
 5708 tgl@sss.pgh.pa.us       18722                 :          28185 :     n->location = location;
                              18723                 :                : 
  702 peter@eisentraut.org    18724                 :          28185 :     return (Node *) n;
                              18725                 :                : }
                              18726                 :                : 
                              18727                 :                : static Node *
  948                         18728                 :           2175 : makeAConst(Node *v, int location)
                              18729                 :                : {
                              18730                 :                :     Node       *n;
                              18731                 :                : 
 8029 lockhart@fourpalms.o    18732      [ +  +  - ]:           2175 :     switch (v->type)
                              18733                 :                :     {
                              18734                 :            109 :         case T_Float:
  821 peter@eisentraut.org    18735                 :            109 :             n = makeFloatConst(castNode(Float, v)->fval, location);
 8029 lockhart@fourpalms.o    18736                 :            109 :             break;
                              18737                 :                : 
                              18738                 :           2066 :         case T_Integer:
  821 peter@eisentraut.org    18739                 :           2066 :             n = makeIntConst(castNode(Integer, v)->ival, location);
 8029 lockhart@fourpalms.o    18740                 :           2066 :             break;
                              18741                 :                : 
 8029 lockhart@fourpalms.o    18742                 :UBC           0 :         default:
                              18743                 :                :             /* currently not used */
  821 peter@eisentraut.org    18744                 :              0 :             Assert(false);
                              18745                 :                :             n = NULL;
                              18746                 :                :     }
                              18747                 :                : 
 8029 lockhart@fourpalms.o    18748                 :CBC        2175 :     return n;
                              18749                 :                : }
                              18750                 :                : 
                              18751                 :                : /* makeRoleSpec
                              18752                 :                :  * Create a RoleSpec with the given type
                              18753                 :                :  */
                              18754                 :                : static RoleSpec *
 3324 alvherre@alvh.no-ip.    18755                 :          12833 : makeRoleSpec(RoleSpecType type, int location)
                              18756                 :                : {
  702 peter@eisentraut.org    18757                 :          12833 :     RoleSpec   *spec = makeNode(RoleSpec);
                              18758                 :                : 
 3324 alvherre@alvh.no-ip.    18759                 :          12833 :     spec->roletype = type;
                              18760                 :          12833 :     spec->location = location;
                              18761                 :                : 
 2664 peter_e@gmx.net         18762                 :          12833 :     return spec;
                              18763                 :                : }
                              18764                 :                : 
                              18765                 :                : /* check_qualified_name --- check the result of qualified_name production
                              18766                 :                :  *
                              18767                 :                :  * It's easiest to let the grammar production for qualified_name allow
                              18768                 :                :  * subscripts and '*', which we then must reject here.
                              18769                 :                :  */
                              18770                 :                : static void
 5270 tgl@sss.pgh.pa.us       18771                 :         109424 : check_qualified_name(List *names, core_yyscan_t yyscanner)
                              18772                 :                : {
                              18773                 :                :     ListCell   *i;
                              18774                 :                : 
 7097                         18775   [ +  -  +  +  :         218848 :     foreach(i, names)
                                              +  + ]
                              18776                 :                :     {
                              18777         [ -  + ]:         109424 :         if (!IsA(lfirst(i), String))
 5389 tgl@sss.pgh.pa.us       18778                 :UBC           0 :             parser_yyerror("syntax error");
                              18779                 :                :     }
 7097 tgl@sss.pgh.pa.us       18780                 :CBC      109424 : }
                              18781                 :                : 
                              18782                 :                : /* check_func_name --- check the result of func_name production
                              18783                 :                :  *
                              18784                 :                :  * It's easiest to let the grammar production for func_name allow subscripts
                              18785                 :                :  * and '*', which we then must reject here.
                              18786                 :                :  */
                              18787                 :                : static List *
 5270                         18788                 :          55031 : check_func_name(List *names, core_yyscan_t yyscanner)
                              18789                 :                : {
                              18790                 :                :     ListCell   *i;
                              18791                 :                : 
 7249                         18792   [ +  -  +  +  :         165093 :     foreach(i, names)
                                              +  + ]
                              18793                 :                :     {
                              18794         [ -  + ]:         110062 :         if (!IsA(lfirst(i), String))
 5389 tgl@sss.pgh.pa.us       18795                 :UBC           0 :             parser_yyerror("syntax error");
                              18796                 :                :     }
 7249 tgl@sss.pgh.pa.us       18797                 :CBC       55031 :     return names;
                              18798                 :                : }
                              18799                 :                : 
                              18800                 :                : /* check_indirection --- check the result of indirection production
                              18801                 :                :  *
                              18802                 :                :  * We only allow '*' at the end of the list, but it's hard to enforce that
                              18803                 :                :  * in the grammar, so do it here.
                              18804                 :                :  */
                              18805                 :                : static List *
 5270                         18806                 :          36812 : check_indirection(List *indirection, core_yyscan_t yyscanner)
                              18807                 :                : {
                              18808                 :                :     ListCell *l;
                              18809                 :                : 
 5706                         18810   [ +  +  +  +  :          48633 :     foreach(l, indirection)
                                              +  + ]
                              18811                 :                :     {
                              18812         [ +  + ]:          11821 :         if (IsA(lfirst(l), A_Star))
                              18813                 :                :         {
 1735                         18814         [ -  + ]:            608 :             if (lnext(indirection, l) != NULL)
 5389 tgl@sss.pgh.pa.us       18815                 :UBC           0 :                 parser_yyerror("improper use of \"*\"");
                              18816                 :                :         }
                              18817                 :                :     }
 5706 tgl@sss.pgh.pa.us       18818                 :CBC       36812 :     return indirection;
                              18819                 :                : }
                              18820                 :                : 
                              18821                 :                : /* extractArgTypes()
                              18822                 :                :  * Given a list of FunctionParameter nodes, extract a list of just the
                              18823                 :                :  * argument types (TypeNames) for input parameters only.  This is what
                              18824                 :                :  * is needed to look up an existing function, which is what is wanted by
                              18825                 :                :  * the productions that use this call.
                              18826                 :                :  */
                              18827                 :                : static List *
 1039                         18828                 :           6663 : extractArgTypes(List *parameters)
                              18829                 :                : {
 7404                         18830                 :           6663 :     List       *result = NIL;
                              18831                 :                :     ListCell   *i;
                              18832                 :                : 
                              18833   [ +  +  +  +  :          14881 :     foreach(i, parameters)
                                              +  + ]
                              18834                 :                :     {
                              18835                 :           8218 :         FunctionParameter *p = (FunctionParameter *) lfirst(i);
                              18836                 :                : 
 1039                         18837   [ +  +  +  - ]:           8218 :         if (p->mode != FUNC_PARAM_OUT && p->mode != FUNC_PARAM_TABLE)
 6956                         18838                 :           8143 :             result = lappend(result, p->argType);
                              18839                 :                :     }
 7404                         18840                 :           6663 :     return result;
                              18841                 :                : }
                              18842                 :                : 
                              18843                 :                : /* extractAggrArgTypes()
                              18844                 :                :  * As above, but work from the output of the aggr_args production.
                              18845                 :                :  */
                              18846                 :                : static List *
 3765                         18847                 :            181 : extractAggrArgTypes(List *aggrargs)
                              18848                 :                : {
                              18849         [ -  + ]:            181 :     Assert(list_length(aggrargs) == 2);
 1039                         18850                 :            181 :     return extractArgTypes((List *) linitial(aggrargs));
                              18851                 :                : }
                              18852                 :                : 
                              18853                 :                : /* makeOrderedSetArgs()
                              18854                 :                :  * Build the result of the aggr_args production (which see the comments for).
                              18855                 :                :  * This handles only the case where both given lists are nonempty, so that
                              18856                 :                :  * we have to deal with multiple VARIADIC arguments.
                              18857                 :                :  */
                              18858                 :                : static List *
 3765                         18859                 :             16 : makeOrderedSetArgs(List *directargs, List *orderedargs,
                              18860                 :                :                    core_yyscan_t yyscanner)
                              18861                 :                : {
                              18862                 :             16 :     FunctionParameter *lastd = (FunctionParameter *) llast(directargs);
                              18863                 :                :     Integer    *ndirectargs;
                              18864                 :                : 
                              18865                 :                :     /* No restriction unless last direct arg is VARIADIC */
                              18866         [ +  + ]:             16 :     if (lastd->mode == FUNC_PARAM_VARIADIC)
                              18867                 :                :     {
                              18868                 :              8 :         FunctionParameter *firsto = (FunctionParameter *) linitial(orderedargs);
                              18869                 :                : 
                              18870                 :                :         /*
                              18871                 :                :          * We ignore the names, though the aggr_arg production allows them;
                              18872                 :                :          * it doesn't allow default values, so those need not be checked.
                              18873                 :                :          */
                              18874         [ +  - ]:              8 :         if (list_length(orderedargs) != 1 ||
                              18875         [ +  - ]:              8 :             firsto->mode != FUNC_PARAM_VARIADIC ||
                              18876         [ -  + ]:              8 :             !equal(lastd->argType, firsto->argType))
 3765 tgl@sss.pgh.pa.us       18877         [ #  # ]:UBC           0 :             ereport(ERROR,
                              18878                 :                :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              18879                 :                :                      errmsg("an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type"),
                              18880                 :                :                      parser_errposition(exprLocation((Node *) firsto))));
                              18881                 :                : 
                              18882                 :                :         /* OK, drop the duplicate VARIADIC argument from the internal form */
 3765 tgl@sss.pgh.pa.us       18883                 :CBC           8 :         orderedargs = NIL;
                              18884                 :                :     }
                              18885                 :                : 
                              18886                 :                :     /* don't merge into the next line, as list_concat changes directargs */
 1285                         18887                 :             16 :     ndirectargs = makeInteger(list_length(directargs));
                              18888                 :                : 
 3765                         18889                 :             16 :     return list_make2(list_concat(directargs, orderedargs),
                              18890                 :                :                       ndirectargs);
                              18891                 :                : }
                              18892                 :                : 
                              18893                 :                : /* insertSelectOptions()
                              18894                 :                :  * Insert ORDER BY, etc into an already-constructed SelectStmt.
                              18895                 :                :  *
                              18896                 :                :  * This routine is just to avoid duplicating code in SelectStmt productions.
                              18897                 :                :  */
                              18898                 :                : static void
 8561                         18899                 :          33133 : insertSelectOptions(SelectStmt *stmt,
                              18900                 :                :                     List *sortClause, List *lockingClause,
                              18901                 :                :                     SelectLimit *limitClause,
                              18902                 :                :                     WithClause *withClause,
                              18903                 :                :                     core_yyscan_t yyscanner)
                              18904                 :                : {
 5671                         18905         [ -  + ]:          33133 :     Assert(IsA(stmt, SelectStmt));
                              18906                 :                : 
                              18907                 :                :     /*
                              18908                 :                :      * Tests here are to reject constructs like
                              18909                 :                :      *  (SELECT foo ORDER BY bar) ORDER BY baz
                              18910                 :                :      */
 8561                         18911         [ +  + ]:          33133 :     if (sortClause)
                              18912                 :                :     {
                              18913         [ -  + ]:          28703 :         if (stmt->sortClause)
 7575 tgl@sss.pgh.pa.us       18914         [ #  # ]:UBC           0 :             ereport(ERROR,
                              18915                 :                :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18916                 :                :                      errmsg("multiple ORDER BY clauses not allowed"),
                              18917                 :                :                      parser_errposition(exprLocation((Node *) sortClause))));
 8561 tgl@sss.pgh.pa.us       18918                 :CBC       28703 :         stmt->sortClause = sortClause;
                              18919                 :                :     }
                              18920                 :                :     /* We can handle multiple locking clauses, though */
 6559                         18921                 :          33133 :     stmt->lockingClause = list_concat(stmt->lockingClause, lockingClause);
 1468 alvherre@alvh.no-ip.    18922   [ +  +  +  + ]:          33133 :     if (limitClause && limitClause->limitOffset)
                              18923                 :                :     {
 8561 tgl@sss.pgh.pa.us       18924         [ -  + ]:            390 :         if (stmt->limitOffset)
 7575 tgl@sss.pgh.pa.us       18925         [ #  # ]:UBC           0 :             ereport(ERROR,
                              18926                 :                :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18927                 :                :                      errmsg("multiple OFFSET clauses not allowed"),
                              18928                 :                :                      parser_errposition(exprLocation(limitClause->limitOffset))));
 1468 alvherre@alvh.no-ip.    18929                 :CBC         390 :         stmt->limitOffset = limitClause->limitOffset;
                              18930                 :                :     }
                              18931   [ +  +  +  + ]:          33133 :     if (limitClause && limitClause->limitCount)
                              18932                 :                :     {
 8561 tgl@sss.pgh.pa.us       18933         [ -  + ]:           2226 :         if (stmt->limitCount)
 7575 tgl@sss.pgh.pa.us       18934         [ #  # ]:UBC           0 :             ereport(ERROR,
                              18935                 :                :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18936                 :                :                      errmsg("multiple LIMIT clauses not allowed"),
                              18937                 :                :                      parser_errposition(exprLocation(limitClause->limitCount))));
 1468 alvherre@alvh.no-ip.    18938                 :CBC        2226 :         stmt->limitCount = limitClause->limitCount;
                              18939                 :                :     }
  120 alvherre@alvh.no-ip.    18940         [ +  + ]:GNC       33133 :     if (limitClause)
                              18941                 :                :     {
 1468 alvherre@alvh.no-ip.    18942         [ -  + ]:CBC        2425 :         if (stmt->limitOption)
 1468 alvherre@alvh.no-ip.    18943         [ #  # ]:UBC           0 :             ereport(ERROR,
                              18944                 :                :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18945                 :                :                      errmsg("multiple limit options not allowed")));
 1468 alvherre@alvh.no-ip.    18946   [ +  +  +  + ]:CBC        2425 :         if (!stmt->sortClause && limitClause->limitOption == LIMIT_OPTION_WITH_TIES)
                              18947         [ +  - ]:              3 :             ereport(ERROR,
                              18948                 :                :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18949                 :                :                      errmsg("WITH TIES cannot be specified without ORDER BY clause")));
  926                         18950   [ +  +  +  + ]:           2422 :         if (limitClause->limitOption == LIMIT_OPTION_WITH_TIES && stmt->lockingClause)
                              18951                 :                :         {
                              18952                 :                :             ListCell   *lc;
                              18953                 :                : 
                              18954   [ +  -  +  -  :              3 :             foreach(lc, stmt->lockingClause)
                                              +  - ]
                              18955                 :                :             {
                              18956                 :              3 :                 LockingClause *lock = lfirst_node(LockingClause, lc);
                              18957                 :                : 
                              18958         [ +  - ]:              3 :                 if (lock->waitPolicy == LockWaitSkip)
                              18959         [ +  - ]:              3 :                     ereport(ERROR,
                              18960                 :                :                             (errcode(ERRCODE_SYNTAX_ERROR),
                              18961                 :                :                              errmsg("%s and %s options cannot be used together",
                              18962                 :                :                                     "SKIP LOCKED", "WITH TIES")));
                              18963                 :                :             }
                              18964                 :                :         }
 1468                         18965                 :           2419 :         stmt->limitOption = limitClause->limitOption;
                              18966                 :                :     }
 5671 tgl@sss.pgh.pa.us       18967         [ +  + ]:          33127 :     if (withClause)
                              18968                 :                :     {
                              18969         [ -  + ]:           1212 :         if (stmt->withClause)
 5671 tgl@sss.pgh.pa.us       18970         [ #  # ]:UBC           0 :             ereport(ERROR,
                              18971                 :                :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18972                 :                :                      errmsg("multiple WITH clauses not allowed"),
                              18973                 :                :                      parser_errposition(exprLocation((Node *) withClause))));
 5671 tgl@sss.pgh.pa.us       18974                 :CBC        1212 :         stmt->withClause = withClause;
                              18975                 :                :     }
 8561                         18976                 :          33127 : }
                              18977                 :                : 
                              18978                 :                : static Node *
                              18979                 :           6972 : makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg)
                              18980                 :                : {
                              18981                 :           6972 :     SelectStmt *n = makeNode(SelectStmt);
                              18982                 :                : 
                              18983                 :           6972 :     n->op = op;
                              18984                 :           6972 :     n->all = all;
                              18985                 :           6972 :     n->larg = (SelectStmt *) larg;
                              18986                 :           6972 :     n->rarg = (SelectStmt *) rarg;
                              18987                 :           6972 :     return (Node *) n;
                              18988                 :                : }
                              18989                 :                : 
                              18990                 :                : /* SystemFuncName()
                              18991                 :                :  * Build a properly-qualified reference to a built-in function.
                              18992                 :                :  */
                              18993                 :                : List *
 8041                         18994                 :           8419 : SystemFuncName(char *name)
                              18995                 :                : {
 7259 neilc@samurai.com       18996                 :           8419 :     return list_make2(makeString("pg_catalog"), makeString(name));
                              18997                 :                : }
                              18998                 :                : 
                              18999                 :                : /* SystemTypeName()
                              19000                 :                :  * Build a properly-qualified reference to a built-in type.
                              19001                 :                :  *
                              19002                 :                :  * typmod is defaulted, but may be changed afterwards by caller.
                              19003                 :                :  * Likewise for the location.
                              19004                 :                :  */
                              19005                 :                : TypeName *
 8017 tgl@sss.pgh.pa.us       19006                 :          45225 : SystemTypeName(char *name)
                              19007                 :                : {
 6315                         19008                 :          45225 :     return makeTypeNameFromNameList(list_make2(makeString("pg_catalog"),
                              19009                 :                :                                                makeString(name)));
                              19010                 :                : }
                              19011                 :                : 
                              19012                 :                : /* doNegate()
                              19013                 :                :  * Handle negation of a numeric constant.
                              19014                 :                :  *
                              19015                 :                :  * Formerly, we did this here because the optimizer couldn't cope with
                              19016                 :                :  * indexquals that looked like "var = -4" --- it wants "var = const"
                              19017                 :                :  * and a unary minus operator applied to a constant didn't qualify.
                              19018                 :                :  * As of Postgres 7.0, that problem doesn't exist anymore because there
                              19019                 :                :  * is a constant-subexpression simplifier in the optimizer.  However,
                              19020                 :                :  * there's still a good reason for doing this here, which is that we can
                              19021                 :                :  * postpone committing to a particular internal representation for simple
                              19022                 :                :  * negative constants.  It's better to leave "-123.456" in string form
                              19023                 :                :  * until we know what the desired type is.
                              19024                 :                :  */
                              19025                 :                : static Node *
 6606                         19026                 :          15322 : doNegate(Node *n, int location)
                              19027                 :                : {
 9159 bruce@momjian.us        19028         [ +  + ]:          15322 :     if (IsA(n, A_Const))
                              19029                 :                :     {
  702 peter@eisentraut.org    19030                 :          14857 :         A_Const    *con = (A_Const *) n;
                              19031                 :                : 
                              19032                 :                :         /* report the constant's location as that of the '-' sign */
 5708 tgl@sss.pgh.pa.us       19033                 :          14857 :         con->location = location;
                              19034                 :                : 
  948 peter@eisentraut.org    19035         [ +  + ]:          14857 :         if (IsA(&con->val, Integer))
                              19036                 :                :         {
  821                         19037                 :          14396 :             con->val.ival.ival = -con->val.ival.ival;
 9159 bruce@momjian.us        19038                 :          14396 :             return n;
                              19039                 :                :         }
  948 peter@eisentraut.org    19040         [ +  - ]:            461 :         if (IsA(&con->val, Float))
                              19041                 :                :         {
                              19042                 :            461 :             doNegateFloat(&con->val.fval);
 9159 bruce@momjian.us        19043                 :            461 :             return n;
                              19044                 :                :         }
                              19045                 :                :     }
                              19046                 :                : 
 6606 tgl@sss.pgh.pa.us       19047                 :            465 :     return (Node *) makeSimpleA_Expr(AEXPR_OP, "-", NULL, n, location);
                              19048                 :                : }
                              19049                 :                : 
                              19050                 :                : static void
  948 peter@eisentraut.org    19051                 :            471 : doNegateFloat(Float *v)
                              19052                 :                : {
  702                         19053                 :            471 :     char       *oldval = v->fval;
                              19054                 :                : 
 8819 tgl@sss.pgh.pa.us       19055         [ -  + ]:            471 :     if (*oldval == '+')
 8819 tgl@sss.pgh.pa.us       19056                 :UBC           0 :         oldval++;
 8819 tgl@sss.pgh.pa.us       19057         [ -  + ]:CBC         471 :     if (*oldval == '-')
  821 peter@eisentraut.org    19058                 :UBC           0 :         v->fval = oldval+1;  /* just strip the '-' */
                              19059                 :                :     else
  821 peter@eisentraut.org    19060                 :CBC         471 :         v->fval = psprintf("-%s", oldval);
 8819 tgl@sss.pgh.pa.us       19061                 :            471 : }
                              19062                 :                : 
                              19063                 :                : static Node *
 3590                         19064                 :         102865 : makeAndExpr(Node *lexpr, Node *rexpr, int location)
                              19065                 :                : {
                              19066                 :                :     /* Flatten "a AND b AND c ..." to a single BoolExpr on sight */
 1223                         19067         [ +  + ]:         102865 :     if (IsA(lexpr, BoolExpr))
                              19068                 :                :     {
  702 peter@eisentraut.org    19069                 :          47542 :         BoolExpr   *blexpr = (BoolExpr *) lexpr;
                              19070                 :                : 
 3590 tgl@sss.pgh.pa.us       19071         [ +  + ]:          47542 :         if (blexpr->boolop == AND_EXPR)
                              19072                 :                :         {
                              19073                 :          46359 :             blexpr->args = lappend(blexpr->args, rexpr);
                              19074                 :          46359 :             return (Node *) blexpr;
                              19075                 :                :         }
                              19076                 :                :     }
                              19077                 :          56506 :     return (Node *) makeBoolExpr(AND_EXPR, list_make2(lexpr, rexpr), location);
                              19078                 :                : }
                              19079                 :                : 
                              19080                 :                : static Node *
                              19081                 :           8024 : makeOrExpr(Node *lexpr, Node *rexpr, int location)
                              19082                 :                : {
                              19083                 :                :     /* Flatten "a OR b OR c ..." to a single BoolExpr on sight */
 1223                         19084         [ +  + ]:           8024 :     if (IsA(lexpr, BoolExpr))
                              19085                 :                :     {
  702 peter@eisentraut.org    19086                 :           3836 :         BoolExpr   *blexpr = (BoolExpr *) lexpr;
                              19087                 :                : 
 3590 tgl@sss.pgh.pa.us       19088         [ +  + ]:           3836 :         if (blexpr->boolop == OR_EXPR)
                              19089                 :                :         {
                              19090                 :           1672 :             blexpr->args = lappend(blexpr->args, rexpr);
                              19091                 :           1672 :             return (Node *) blexpr;
                              19092                 :                :         }
                              19093                 :                :     }
                              19094                 :           6352 :     return (Node *) makeBoolExpr(OR_EXPR, list_make2(lexpr, rexpr), location);
                              19095                 :                : }
                              19096                 :                : 
                              19097                 :                : static Node *
                              19098                 :           6978 : makeNotExpr(Node *expr, int location)
                              19099                 :                : {
                              19100                 :           6978 :     return (Node *) makeBoolExpr(NOT_EXPR, list_make1(expr), location);
                              19101                 :                : }
                              19102                 :                : 
                              19103                 :                : static Node *
 5708                         19104                 :           4057 : makeAArrayExpr(List *elements, int location)
                              19105                 :                : {
 5869                         19106                 :           4057 :     A_ArrayExpr *n = makeNode(A_ArrayExpr);
                              19107                 :                : 
                              19108                 :           4057 :     n->elements = elements;
 5708                         19109                 :           4057 :     n->location = location;
 5869                         19110                 :           4057 :     return (Node *) n;
                              19111                 :                : }
                              19112                 :                : 
                              19113                 :                : static Node *
  333 michael@paquier.xyz     19114                 :           1206 : makeSQLValueFunction(SQLValueFunctionOp op, int32 typmod, int location)
                              19115                 :                : {
                              19116                 :           1206 :     SQLValueFunction *svf = makeNode(SQLValueFunction);
                              19117                 :                : 
                              19118                 :           1206 :     svf->op = op;
                              19119                 :                :     /* svf->type will be filled during parse analysis */
                              19120                 :           1206 :     svf->typmod = typmod;
                              19121                 :           1206 :     svf->location = location;
                              19122                 :           1206 :     return (Node *) svf;
                              19123                 :                : }
                              19124                 :                : 
                              19125                 :                : static Node *
 5708 tgl@sss.pgh.pa.us       19126                 :            298 : makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args,
                              19127                 :                :             int location)
                              19128                 :                : {
 4548 peter_e@gmx.net         19129                 :            298 :     XmlExpr     *x = makeNode(XmlExpr);
                              19130                 :                : 
 6324                         19131                 :            298 :     x->op = op;
                              19132                 :            298 :     x->name = name;
                              19133                 :                :     /*
                              19134                 :                :      * named_args is a list of ResTarget; it'll be split apart into separate
                              19135                 :                :      * expression and name lists in transformXmlExpr().
                              19136                 :                :      */
                              19137                 :            298 :     x->named_args = named_args;
 6321 tgl@sss.pgh.pa.us       19138                 :            298 :     x->arg_names = NIL;
 6324 peter_e@gmx.net         19139                 :            298 :     x->args = args;
                              19140                 :                :     /* xmloption, if relevant, must be filled in by caller */
                              19141                 :                :     /* type and typmod will be filled in during parse analysis */
 4130 tgl@sss.pgh.pa.us       19142                 :            298 :     x->type = InvalidOid;            /* marks the node as not analyzed */
 5708                         19143                 :            298 :     x->location = location;
 6324 peter_e@gmx.net         19144                 :            298 :     return (Node *) x;
                              19145                 :                : }
                              19146                 :                : 
                              19147                 :                : /*
                              19148                 :                :  * Merge the input and output parameters of a table function.
                              19149                 :                :  */
                              19150                 :                : static List *
 5749 tgl@sss.pgh.pa.us       19151                 :             94 : mergeTableFuncParameters(List *func_args, List *columns)
                              19152                 :                : {
                              19153                 :                :     ListCell   *lc;
                              19154                 :                : 
                              19155                 :                :     /* Explicit OUT and INOUT parameters shouldn't be used in this syntax */
                              19156   [ +  +  +  +  :            191 :     foreach(lc, func_args)
                                              +  + ]
                              19157                 :                :     {
                              19158                 :             97 :         FunctionParameter *p = (FunctionParameter *) lfirst(lc);
                              19159                 :                : 
 1039                         19160         [ -  + ]:             97 :         if (p->mode != FUNC_PARAM_DEFAULT &&
 1039 tgl@sss.pgh.pa.us       19161         [ #  # ]:UBC           0 :             p->mode != FUNC_PARAM_IN &&
                              19162         [ #  # ]:              0 :             p->mode != FUNC_PARAM_VARIADIC)
 5749                         19163         [ #  # ]:              0 :             ereport(ERROR,
                              19164                 :                :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              19165                 :                :                      errmsg("OUT and INOUT arguments aren't allowed in TABLE functions")));
                              19166                 :                :     }
                              19167                 :                : 
 5749 tgl@sss.pgh.pa.us       19168                 :CBC          94 :     return list_concat(func_args, columns);
                              19169                 :                : }
                              19170                 :                : 
                              19171                 :                : /*
                              19172                 :                :  * Determine return type of a TABLE function.  A single result column
                              19173                 :                :  * returns setof that column's type; otherwise return setof record.
                              19174                 :                :  */
                              19175                 :                : static TypeName *
                              19176                 :             94 : TableFuncTypeName(List *columns)
                              19177                 :                : {
                              19178                 :                :     TypeName   *result;
                              19179                 :                : 
                              19180         [ +  + ]:             94 :     if (list_length(columns) == 1)
                              19181                 :                :     {
                              19182                 :             31 :         FunctionParameter *p = (FunctionParameter *) linitial(columns);
                              19183                 :                : 
 2593 peter_e@gmx.net         19184                 :             31 :         result = copyObject(p->argType);
                              19185                 :                :     }
                              19186                 :                :     else
 5749 tgl@sss.pgh.pa.us       19187                 :             63 :         result = SystemTypeName("record");
                              19188                 :                : 
                              19189                 :             94 :     result->setof = true;
                              19190                 :                : 
                              19191                 :             94 :     return result;
                              19192                 :                : }
                              19193                 :                : 
                              19194                 :                : /*
                              19195                 :                :  * Convert a list of (dotted) names to a RangeVar (like
                              19196                 :                :  * makeRangeVarFromNameList, but with position support).  The
                              19197                 :                :  * "AnyName" refers to the any_name production in the grammar.
                              19198                 :                :  */
                              19199                 :                : static RangeVar *
 4949 peter_e@gmx.net         19200                 :            462 : makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner)
                              19201                 :                : {
  702 peter@eisentraut.org    19202                 :            462 :     RangeVar   *r = makeNode(RangeVar);
                              19203                 :                : 
 4949 peter_e@gmx.net         19204   [ +  +  -  - ]:            462 :     switch (list_length(names))
                              19205                 :                :     {
                              19206                 :            421 :         case 1:
                              19207                 :            421 :             r->catalogname = NULL;
                              19208                 :            421 :             r->schemaname = NULL;
                              19209                 :            421 :             r->relname = strVal(linitial(names));
                              19210                 :            421 :             break;
                              19211                 :             41 :         case 2:
                              19212                 :             41 :             r->catalogname = NULL;
                              19213                 :             41 :             r->schemaname = strVal(linitial(names));
                              19214                 :             41 :             r->relname = strVal(lsecond(names));
                              19215                 :             41 :             break;
 4949 peter_e@gmx.net         19216                 :UBC           0 :         case 3:
 3302 heikki.linnakangas@i    19217                 :              0 :             r->catalogname = strVal(linitial(names));
 4949 peter_e@gmx.net         19218                 :              0 :             r->schemaname = strVal(lsecond(names));
                              19219                 :              0 :             r->relname = strVal(lthird(names));
                              19220                 :              0 :             break;
                              19221                 :              0 :         default:
                              19222         [ #  # ]:              0 :             ereport(ERROR,
                              19223                 :                :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              19224                 :                :                      errmsg("improper qualified name (too many dotted names): %s",
                              19225                 :                :                             NameListToString(names)),
                              19226                 :                :                      parser_errposition(position)));
                              19227                 :                :             break;
                              19228                 :                :     }
                              19229                 :                : 
 4871 rhaas@postgresql.org    19230                 :CBC         462 :     r->relpersistence = RELPERSISTENCE_PERMANENT;
 4949 peter_e@gmx.net         19231                 :            462 :     r->location = position;
                              19232                 :                : 
                              19233                 :            462 :     return r;
                              19234                 :                : }
                              19235                 :                : 
                              19236                 :                : /*
                              19237                 :                :  * Convert a relation_name with name and namelist to a RangeVar using
                              19238                 :                :  * makeRangeVar.
                              19239                 :                :  */
                              19240                 :                : static RangeVar *
  900 akapila@postgresql.o    19241                 :         109424 : makeRangeVarFromQualifiedName(char *name, List *namelist, int location,
                              19242                 :                :                               core_yyscan_t yyscanner)
                              19243                 :                : {
                              19244                 :                :     RangeVar   *r;
                              19245                 :                : 
                              19246                 :         109424 :     check_qualified_name(namelist, yyscanner);
                              19247                 :         109424 :     r = makeRangeVar(NULL, NULL, location);
                              19248                 :                : 
                              19249      [ +  -  - ]:         109424 :     switch (list_length(namelist))
                              19250                 :                :     {
                              19251                 :         109424 :         case 1:
                              19252                 :         109424 :             r->catalogname = NULL;
                              19253                 :         109424 :             r->schemaname = name;
                              19254                 :         109424 :             r->relname = strVal(linitial(namelist));
                              19255                 :         109424 :             break;
  900 akapila@postgresql.o    19256                 :UBC           0 :         case 2:
                              19257                 :              0 :             r->catalogname = name;
                              19258                 :              0 :             r->schemaname = strVal(linitial(namelist));
                              19259                 :              0 :             r->relname = strVal(lsecond(namelist));
                              19260                 :              0 :             break;
                              19261                 :              0 :         default:
                              19262         [ #  # ]:              0 :             ereport(ERROR,
                              19263                 :                :                     errcode(ERRCODE_SYNTAX_ERROR),
                              19264                 :                :                     errmsg("improper qualified name (too many dotted names): %s",
                              19265                 :                :                            NameListToString(lcons(makeString(name), namelist))),
                              19266                 :                :                            parser_errposition(location));
                              19267                 :                :             break;
                              19268                 :                :     }
                              19269                 :                : 
  900 akapila@postgresql.o    19270                 :CBC      109424 :     return r;
                              19271                 :                : }
                              19272                 :                : 
                              19273                 :                : /* Separate Constraint nodes from COLLATE clauses in a ColQualList */
                              19274                 :                : static void
 4785 tgl@sss.pgh.pa.us       19275                 :          32008 : SplitColQualList(List *qualList,
                              19276                 :                :                  List **constraintList, CollateClause **collClause,
                              19277                 :                :                  core_yyscan_t yyscanner)
                              19278                 :                : {
                              19279                 :                :     ListCell   *cell;
                              19280                 :                : 
                              19281                 :          32008 :     *collClause = NULL;
 1735                         19282   [ +  +  +  +  :          40519 :     foreach(cell, qualList)
                                              +  + ]
                              19283                 :                :     {
  702 peter@eisentraut.org    19284                 :           8511 :         Node       *n = (Node *) lfirst(cell);
                              19285                 :                : 
 4785 tgl@sss.pgh.pa.us       19286         [ +  + ]:           8511 :         if (IsA(n, Constraint))
                              19287                 :                :         {
                              19288                 :                :             /* keep it in list */
                              19289                 :           8206 :             continue;
                              19290                 :                :         }
                              19291         [ +  - ]:            305 :         if (IsA(n, CollateClause))
                              19292                 :                :         {
                              19293                 :            305 :             CollateClause *c = (CollateClause *) n;
                              19294                 :                : 
                              19295         [ -  + ]:            305 :             if (*collClause)
 4785 tgl@sss.pgh.pa.us       19296         [ #  # ]:UBC           0 :                 ereport(ERROR,
                              19297                 :                :                         (errcode(ERRCODE_SYNTAX_ERROR),
                              19298                 :                :                          errmsg("multiple COLLATE clauses not allowed"),
                              19299                 :                :                          parser_errposition(c->location)));
 4785 tgl@sss.pgh.pa.us       19300                 :CBC         305 :             *collClause = c;
                              19301                 :                :         }
                              19302                 :                :         else
 4785 tgl@sss.pgh.pa.us       19303         [ #  # ]:UBC           0 :             elog(ERROR, "unexpected node type %d", (int) n->type);
                              19304                 :                :         /* remove non-Constraint nodes from qualList */
 1735 tgl@sss.pgh.pa.us       19305                 :CBC         305 :         qualList = foreach_delete_current(qualList, cell);
                              19306                 :                :     }
 4785                         19307                 :          32008 :     *constraintList = qualList;
                              19308                 :          32008 : }
                              19309                 :                : 
                              19310                 :                : /*
                              19311                 :                :  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
                              19312                 :                :  * in the output command node.  Pass NULL for any flags the particular
                              19313                 :                :  * command doesn't support.
                              19314                 :                :  */
                              19315                 :                : static void
 4687                         19316                 :           7065 : processCASbits(int cas_bits, int location, const char *constrType,
                              19317                 :                :                bool *deferrable, bool *initdeferred, bool *not_valid,
                              19318                 :                :                bool *no_inherit, core_yyscan_t yyscanner)
                              19319                 :                : {
                              19320                 :                :     /* defaults */
                              19321         [ +  + ]:           7065 :     if (deferrable)
                              19322                 :           6389 :         *deferrable = false;
                              19323         [ +  + ]:           7065 :     if (initdeferred)
                              19324                 :           6389 :         *initdeferred = false;
                              19325         [ +  + ]:           7065 :     if (not_valid)
                              19326                 :           1451 :         *not_valid = false;
                              19327                 :                : 
                              19328         [ +  + ]:           7065 :     if (cas_bits & (CAS_DEFERRABLE | CAS_INITIALLY_DEFERRED))
                              19329                 :                :     {
                              19330         [ +  - ]:            123 :         if (deferrable)
                              19331                 :            123 :             *deferrable = true;
                              19332                 :                :         else
 4687 tgl@sss.pgh.pa.us       19333         [ #  # ]:UBC           0 :             ereport(ERROR,
                              19334                 :                :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              19335                 :                :                      /* translator: %s is CHECK, UNIQUE, or similar */
                              19336                 :                :                      errmsg("%s constraints cannot be marked DEFERRABLE",
                              19337                 :                :                             constrType),
                              19338                 :                :                      parser_errposition(location)));
                              19339                 :                :     }
                              19340                 :                : 
 4687 tgl@sss.pgh.pa.us       19341         [ +  + ]:CBC        7065 :     if (cas_bits & CAS_INITIALLY_DEFERRED)
                              19342                 :                :     {
                              19343         [ +  - ]:             78 :         if (initdeferred)
                              19344                 :             78 :             *initdeferred = true;
                              19345                 :                :         else
 4687 tgl@sss.pgh.pa.us       19346         [ #  # ]:UBC           0 :             ereport(ERROR,
                              19347                 :                :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              19348                 :                :                      /* translator: %s is CHECK, UNIQUE, or similar */
                              19349                 :                :                      errmsg("%s constraints cannot be marked DEFERRABLE",
                              19350                 :                :                             constrType),
                              19351                 :                :                      parser_errposition(location)));
                              19352                 :                :     }
                              19353                 :                : 
 4687 tgl@sss.pgh.pa.us       19354         [ +  + ]:CBC        7065 :     if (cas_bits & CAS_NOT_VALID)
                              19355                 :                :     {
                              19356         [ +  - ]:            258 :         if (not_valid)
                              19357                 :            258 :             *not_valid = true;
                              19358                 :                :         else
 4687 tgl@sss.pgh.pa.us       19359         [ #  # ]:UBC           0 :             ereport(ERROR,
                              19360                 :                :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              19361                 :                :                      /* translator: %s is CHECK, UNIQUE, or similar */
                              19362                 :                :                      errmsg("%s constraints cannot be marked NOT VALID",
                              19363                 :                :                             constrType),
                              19364                 :                :                      parser_errposition(location)));
                              19365                 :                :     }
                              19366                 :                : 
 4282 alvherre@alvh.no-ip.    19367         [ +  + ]:CBC        7065 :     if (cas_bits & CAS_NO_INHERIT)
                              19368                 :                :     {
                              19369         [ +  - ]:             71 :         if (no_inherit)
                              19370                 :             71 :             *no_inherit = true;
                              19371                 :                :         else
 4282 alvherre@alvh.no-ip.    19372         [ #  # ]:UBC           0 :             ereport(ERROR,
                              19373                 :                :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              19374                 :                :                      /* translator: %s is CHECK, UNIQUE, or similar */
                              19375                 :                :                      errmsg("%s constraints cannot be marked NO INHERIT",
                              19376                 :                :                             constrType),
                              19377                 :                :                      parser_errposition(location)));
                              19378                 :                :     }
 4687 tgl@sss.pgh.pa.us       19379                 :CBC        7065 : }
                              19380                 :                : 
                              19381                 :                : /*
                              19382                 :                :  * Parse a user-supplied partition strategy string into parse node
                              19383                 :                :  * PartitionStrategy representation, or die trying.
                              19384                 :                :  */
                              19385                 :                : static PartitionStrategy
  528 alvherre@alvh.no-ip.    19386                 :           2441 : parsePartitionStrategy(char *strategy)
                              19387                 :                : {
                              19388         [ +  + ]:           2441 :     if (pg_strcasecmp(strategy, "list") == 0)
                              19389                 :           1177 :         return PARTITION_STRATEGY_LIST;
                              19390         [ +  + ]:           1264 :     else if (pg_strcasecmp(strategy, "range") == 0)
                              19391                 :           1147 :         return PARTITION_STRATEGY_RANGE;
                              19392         [ +  + ]:            117 :     else if (pg_strcasecmp(strategy, "hash") == 0)
                              19393                 :            114 :         return PARTITION_STRATEGY_HASH;
                              19394                 :                : 
                              19395         [ +  - ]:              3 :     ereport(ERROR,
                              19396                 :                :             (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                              19397                 :                :              errmsg("unrecognized partitioning strategy \"%s\"",
                              19398                 :                :                     strategy)));
                              19399                 :                :     return PARTITION_STRATEGY_LIST;     /* keep compiler quiet */
                              19400                 :                : 
                              19401                 :                : }
                              19402                 :                : 
                              19403                 :                : /*
                              19404                 :                :  * Process pubobjspec_list to check for errors in any of the objects and
                              19405                 :                :  * convert PUBLICATIONOBJ_CONTINUATION into appropriate PublicationObjSpecType.
                              19406                 :                :  */
                              19407                 :                : static void
  900 akapila@postgresql.o    19408                 :            736 : preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner)
                              19409                 :                : {
                              19410                 :                :     ListCell   *cell;
                              19411                 :                :     PublicationObjSpec *pubobj;
                              19412                 :            736 :     PublicationObjSpecType prevobjtype = PUBLICATIONOBJ_CONTINUATION;
                              19413                 :                : 
                              19414         [ -  + ]:            736 :     if (!pubobjspec_list)
  900 akapila@postgresql.o    19415                 :UBC           0 :         return;
                              19416                 :                : 
  900 akapila@postgresql.o    19417                 :CBC         736 :     pubobj = (PublicationObjSpec *) linitial(pubobjspec_list);
                              19418         [ +  + ]:            736 :     if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION)
                              19419         [ +  - ]:              6 :         ereport(ERROR,
                              19420                 :                :                 errcode(ERRCODE_SYNTAX_ERROR),
                              19421                 :                :                 errmsg("invalid publication object list"),
                              19422                 :                :                 errdetail("One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name."),
                              19423                 :                :                 parser_errposition(pubobj->location));
                              19424                 :                : 
                              19425   [ +  -  +  +  :           1560 :     foreach(cell, pubobjspec_list)
                                              +  + ]
                              19426                 :                :     {
                              19427                 :            842 :         pubobj = (PublicationObjSpec *) lfirst(cell);
                              19428                 :                : 
                              19429         [ +  + ]:            842 :         if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION)
                              19430                 :             87 :             pubobj->pubobjtype = prevobjtype;
                              19431                 :                : 
  738 tomas.vondra@postgre    19432         [ +  + ]:            842 :         if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE)
                              19433                 :                :         {
                              19434                 :                :             /* relation name or pubtable must be set for this type of object */
  900 akapila@postgresql.o    19435   [ +  +  +  + ]:            640 :             if (!pubobj->name && !pubobj->pubtable)
                              19436         [ +  - ]:              3 :                 ereport(ERROR,
                              19437                 :                :                         errcode(ERRCODE_SYNTAX_ERROR),
                              19438                 :                :                         errmsg("invalid table name"),
                              19439                 :                :                         parser_errposition(pubobj->location));
                              19440                 :                : 
  782                         19441         [ +  + ]:            637 :             if (pubobj->name)
                              19442                 :                :             {
                              19443                 :                :                 /* convert it to PublicationTable */
  900                         19444                 :             29 :                 PublicationTable *pubtable = makeNode(PublicationTable);
                              19445                 :                : 
  836 alvherre@alvh.no-ip.    19446                 :             29 :                 pubtable->relation =
                              19447                 :             29 :                     makeRangeVar(NULL, pubobj->name, pubobj->location);
  900 akapila@postgresql.o    19448                 :             29 :                 pubobj->pubtable = pubtable;
                              19449                 :             29 :                 pubobj->name = NULL;
                              19450                 :                :             }
                              19451                 :                :         }
  836 alvherre@alvh.no-ip.    19452         [ +  + ]:            202 :         else if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLES_IN_SCHEMA ||
                              19453         [ +  - ]:             12 :                  pubobj->pubobjtype == PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA)
                              19454                 :                :         {
                              19455                 :                :             /* WHERE clause is not allowed on a schema object */
  782 akapila@postgresql.o    19456   [ +  +  +  + ]:            202 :             if (pubobj->pubtable && pubobj->pubtable->whereClause)
                              19457         [ +  - ]:              3 :                 ereport(ERROR,
                              19458                 :                :                         errcode(ERRCODE_SYNTAX_ERROR),
                              19459                 :                :                         errmsg("WHERE clause not allowed for schema"),
                              19460                 :                :                         parser_errposition(pubobj->location));
                              19461                 :                : 
                              19462                 :                :             /* Column list is not allowed on a schema object */
  750 tomas.vondra@postgre    19463   [ +  +  +  + ]:            199 :             if (pubobj->pubtable && pubobj->pubtable->columns)
                              19464         [ +  - ]:              3 :                 ereport(ERROR,
                              19465                 :                :                         errcode(ERRCODE_SYNTAX_ERROR),
                              19466                 :                :                         errmsg("column specification not allowed for schema"),
                              19467                 :                :                         parser_errposition(pubobj->location));
                              19468                 :                : 
                              19469                 :                :             /*
                              19470                 :                :              * We can distinguish between the different type of schema
                              19471                 :                :              * objects based on whether name and pubtable is set.
                              19472                 :                :              */
  900 akapila@postgresql.o    19473         [ +  + ]:            196 :             if (pubobj->name)
  836 alvherre@alvh.no-ip.    19474                 :            181 :                 pubobj->pubobjtype = PUBLICATIONOBJ_TABLES_IN_SCHEMA;
  900 akapila@postgresql.o    19475   [ +  -  +  + ]:             15 :             else if (!pubobj->name && !pubobj->pubtable)
  836 alvherre@alvh.no-ip.    19476                 :             12 :                 pubobj->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA;
                              19477                 :                :             else
  900 akapila@postgresql.o    19478         [ +  - ]:              3 :                 ereport(ERROR,
                              19479                 :                :                         errcode(ERRCODE_SYNTAX_ERROR),
                              19480                 :                :                         errmsg("invalid schema name"),
                              19481                 :                :                         parser_errposition(pubobj->location));
                              19482                 :                :         }
                              19483                 :                : 
                              19484                 :            830 :         prevobjtype = pubobj->pubobjtype;
                              19485                 :                :     }
                              19486                 :                : }
                              19487                 :                : 
                              19488                 :                : /*----------
                              19489                 :                :  * Recursive view transformation
                              19490                 :                :  *
                              19491                 :                :  * Convert
                              19492                 :                :  *
                              19493                 :                :  *     CREATE RECURSIVE VIEW relname (aliases) AS query
                              19494                 :                :  *
                              19495                 :                :  * to
                              19496                 :                :  *
                              19497                 :                :  *     CREATE VIEW relname (aliases) AS
                              19498                 :                :  *         WITH RECURSIVE relname (aliases) AS (query)
                              19499                 :                :  *         SELECT aliases FROM relname
                              19500                 :                :  *
                              19501                 :                :  * Actually, just the WITH ... part, which is then inserted into the original
                              19502                 :                :  * view definition as the query.
                              19503                 :                :  * ----------
                              19504                 :                :  */
                              19505                 :                : static Node *
 4091 peter_e@gmx.net         19506                 :              7 : makeRecursiveViewSelect(char *relname, List *aliases, Node *query)
                              19507                 :                : {
                              19508                 :              7 :     SelectStmt *s = makeNode(SelectStmt);
                              19509                 :              7 :     WithClause *w = makeNode(WithClause);
                              19510                 :              7 :     CommonTableExpr *cte = makeNode(CommonTableExpr);
                              19511                 :              7 :     List       *tl = NIL;
                              19512                 :                :     ListCell   *lc;
                              19513                 :                : 
                              19514                 :                :     /* create common table expression */
                              19515                 :              7 :     cte->ctename = relname;
                              19516                 :              7 :     cte->aliascolnames = aliases;
 1884 tgl@sss.pgh.pa.us       19517                 :              7 :     cte->ctematerialized = CTEMaterializeDefault;
 4091 peter_e@gmx.net         19518                 :              7 :     cte->ctequery = query;
                              19519                 :              7 :     cte->location = -1;
                              19520                 :                : 
                              19521                 :                :     /* create WITH clause and attach CTE */
                              19522                 :              7 :     w->recursive = true;
                              19523                 :              7 :     w->ctes = list_make1(cte);
                              19524                 :              7 :     w->location = -1;
                              19525                 :                : 
                              19526                 :                :     /* create target list for the new SELECT from the alias list of the
                              19527                 :                :      * recursive view specification */
                              19528   [ +  -  +  +  :             14 :     foreach (lc, aliases)
                                              +  + ]
                              19529                 :                :     {
                              19530                 :              7 :         ResTarget *rt = makeNode(ResTarget);
                              19531                 :                : 
                              19532                 :              7 :         rt->name = NULL;
                              19533                 :              7 :         rt->indirection = NIL;
                              19534                 :              7 :         rt->val = makeColumnRef(strVal(lfirst(lc)), NIL, -1, 0);
                              19535                 :              7 :         rt->location = -1;
                              19536                 :                : 
                              19537                 :              7 :         tl = lappend(tl, rt);
                              19538                 :                :     }
                              19539                 :                : 
                              19540                 :                :     /* create new SELECT combining WITH clause, target list, and fake FROM
                              19541                 :                :      * clause */
                              19542                 :              7 :     s->withClause = w;
                              19543                 :              7 :     s->targetList = tl;
                              19544                 :              7 :     s->fromClause = list_make1(makeRangeVar(NULL, relname, -1));
                              19545                 :                : 
                              19546                 :              7 :     return (Node *) s;
                              19547                 :                : }
                              19548                 :                : 
                              19549                 :                : /* parser_init()
                              19550                 :                :  * Initialize to parse one query string
                              19551                 :                :  */
                              19552                 :                : void
 4785 tgl@sss.pgh.pa.us       19553                 :         365534 : parser_init(base_yy_extra_type *yyext)
                              19554                 :                : {
                              19555                 :         365534 :     yyext->parsetree = NIL;      /* in case grammar forgets to set it */
                              19556                 :         365534 : }
        

Generated by: LCOV version 2.1-beta2-3-g6141622