LCOV - differential code coverage report
Current view: top level - src/backend/parser - gram.y (source / functions) Coverage Total Hit UNC LBC UIC UBC GBC GIC GNC CBC EUB ECB DUB DCB
Current: Differential Code Coverage HEAD vs 15 Lines: 89.5 % 7120 6375 7 274 408 56 268 3590 210 2307 418 3730 3 64
Current Date: 2023-04-08 17:13:01 Functions: 100.0 % 41 41 40 1 40 1
Baseline: 15 Line coverage date bins:
Baseline Date: 2023-04-08 15:09:40 [..60] days: 99.1 % 111 110 1 1 108 1
Legend: Lines: hit not hit (120,180] days: 87.0 % 46 40 6 1 39 2
(180,240] days: 100.0 % 25 25 1 22 2 1
(240..) days: 89.4 % 6938 6200 274 408 56 268 3587 41 2304 392 3595
Function coverage date bins:
(120,180] days: 100.0 % 1 1 1
(240..) days: 56.3 % 71 40 40 31

 Age         Owner                  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-2023, 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 *makeStringConst(char *str, int location);
                                174                 : static Node *makeStringConstCast(char *str, int location, TypeName *typename);
                                175                 : static Node *makeIntConst(int val, int location);
                                176                 : static Node *makeFloatConst(char *str, int location);
                                177                 : static Node *makeBoolAConst(bool state, int location);
                                178                 : static Node *makeBitStringConst(char *str, int location);
                                179                 : static Node *makeNullAConst(int location);
                                180                 : static Node *makeAConst(Node *v, int location);
                                181                 : static RoleSpec *makeRoleSpec(RoleSpecType type, int location);
                                182                 : static void check_qualified_name(List *names, core_yyscan_t yyscanner);
                                183                 : static List *check_func_name(List *names, core_yyscan_t yyscanner);
                                184                 : static List *check_indirection(List *indirection, core_yyscan_t yyscanner);
                                185                 : static List *extractArgTypes(List *parameters);
                                186                 : static List *extractAggrArgTypes(List *aggrargs);
                                187                 : static List *makeOrderedSetArgs(List *directargs, List *orderedargs,
                                188                 :                                 core_yyscan_t yyscanner);
                                189                 : static void insertSelectOptions(SelectStmt *stmt,
                                190                 :                                 List *sortClause, List *lockingClause,
                                191                 :                                 SelectLimit *limitClause,
                                192                 :                                 WithClause *withClause,
                                193                 :                                 core_yyscan_t yyscanner);
                                194                 : static Node *makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg);
                                195                 : static Node *doNegate(Node *n, int location);
                                196                 : static void doNegateFloat(Float *v);
                                197                 : static Node *makeAndExpr(Node *lexpr, Node *rexpr, int location);
                                198                 : static Node *makeOrExpr(Node *lexpr, Node *rexpr, int location);
                                199                 : static Node *makeNotExpr(Node *expr, int location);
                                200                 : static Node *makeAArrayExpr(List *elements, int location);
                                201                 : static Node *makeXmlExpr(XmlExprOp op, char *name, List *named_args,
                                202                 :                          List *args, int location);
                                203                 : static List *mergeTableFuncParameters(List *func_args, List *columns);
                                204                 : static TypeName *TableFuncTypeName(List *columns);
                                205                 : static RangeVar *makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner);
                                206                 : static RangeVar *makeRangeVarFromQualifiedName(char *name, List *namelist, int location,
                                207                 :                                                core_yyscan_t yyscanner);
                                208                 : static void SplitColQualList(List *qualList,
                                209                 :                              List **constraintList, CollateClause **collClause,
                                210                 :                              core_yyscan_t yyscanner);
                                211                 : static void processCASbits(int cas_bits, int location, const char *constrType,
                                212                 :                bool *deferrable, bool *initdeferred, bool *not_valid,
                                213                 :                bool *no_inherit, core_yyscan_t yyscanner);
                                214                 : static PartitionStrategy parsePartitionStrategy(char *strategy);
                                215                 : static void preprocess_pubobj_list(List *pubobjspec_list,
                                216                 :                                    core_yyscan_t yyscanner);
                                217                 : static Node *makeRecursiveViewSelect(char *relname, List *aliases, Node *query);
                                218                 : 
                                219                 : %}
                                220                 : 
                                221                 : %pure-parser
                                222                 : %expect 0
                                223                 : %name-prefix="base_yy"
                                224                 : %locations
                                225                 : 
                                226                 : %parse-param {core_yyscan_t yyscanner}
                                227                 : %lex-param   {core_yyscan_t yyscanner}
                                228                 : 
                                229                 : %union
                                230                 : {
                                231                 :     core_YYSTYPE core_yystype;
                                232                 :     /* these fields must match core_YYSTYPE: */
                                233                 :     int         ival;
                                234                 :     char       *str;
                                235                 :     const char *keyword;
                                236                 : 
                                237                 :     char        chr;
                                238                 :     bool        boolean;
                                239                 :     JoinType    jtype;
                                240                 :     DropBehavior dbehavior;
                                241                 :     OnCommitAction oncommit;
                                242                 :     List       *list;
                                243                 :     Node       *node;
                                244                 :     ObjectType  objtype;
                                245                 :     TypeName   *typnam;
                                246                 :     FunctionParameter *fun_param;
                                247                 :     FunctionParameterMode fun_param_mode;
                                248                 :     ObjectWithArgs *objwithargs;
                                249                 :     DefElem    *defelt;
                                250                 :     SortBy     *sortby;
                                251                 :     WindowDef  *windef;
                                252                 :     JoinExpr   *jexpr;
                                253                 :     IndexElem  *ielem;
                                254                 :     StatsElem  *selem;
                                255                 :     Alias      *alias;
                                256                 :     RangeVar   *range;
                                257                 :     IntoClause *into;
                                258                 :     WithClause *with;
                                259                 :     InferClause *infer;
                                260                 :     OnConflictClause *onconflict;
                                261                 :     A_Indices  *aind;
                                262                 :     ResTarget  *target;
                                263                 :     struct PrivTarget *privtarget;
                                264                 :     AccessPriv *accesspriv;
                                265                 :     struct ImportQual *importqual;
                                266                 :     InsertStmt *istmt;
                                267                 :     VariableSetStmt *vsetstmt;
                                268                 :     PartitionElem *partelem;
                                269                 :     PartitionSpec *partspec;
                                270                 :     PartitionBoundSpec *partboundspec;
                                271                 :     RoleSpec   *rolespec;
                                272                 :     PublicationObjSpec *publicationobjectspec;
                                273                 :     struct SelectLimit *selectlimit;
                                274                 :     SetQuantifier setquantifier;
                                275                 :     struct GroupClause *groupclause;
                                276                 :     MergeWhenClause *mergewhen;
                                277                 :     struct KeyActions *keyactions;
                                278                 :     struct KeyAction *keyaction;
                                279                 : }
                                280                 : 
                                281                 : %type <node>  stmt toplevel_stmt schema_stmt routine_body_stmt
                                282                 :         AlterEventTrigStmt AlterCollationStmt
                                283                 :         AlterDatabaseStmt AlterDatabaseSetStmt AlterDomainStmt AlterEnumStmt
                                284                 :         AlterFdwStmt AlterForeignServerStmt AlterGroupStmt
                                285                 :         AlterObjectDependsStmt AlterObjectSchemaStmt AlterOwnerStmt
                                286                 :         AlterOperatorStmt AlterTypeStmt AlterSeqStmt AlterSystemStmt AlterTableStmt
                                287                 :         AlterTblSpcStmt AlterExtensionStmt AlterExtensionContentsStmt
                                288                 :         AlterCompositeTypeStmt AlterUserMappingStmt
                                289                 :         AlterRoleStmt AlterRoleSetStmt AlterPolicyStmt AlterStatsStmt
                                290                 :         AlterDefaultPrivilegesStmt DefACLAction
                                291                 :         AnalyzeStmt CallStmt ClosePortalStmt ClusterStmt CommentStmt
                                292                 :         ConstraintsSetStmt CopyStmt CreateAsStmt CreateCastStmt
                                293                 :         CreateDomainStmt CreateExtensionStmt CreateGroupStmt CreateOpClassStmt
                                294                 :         CreateOpFamilyStmt AlterOpFamilyStmt CreatePLangStmt
                                295                 :         CreateSchemaStmt CreateSeqStmt CreateStmt CreateStatsStmt CreateTableSpaceStmt
                                296                 :         CreateFdwStmt CreateForeignServerStmt CreateForeignTableStmt
                                297                 :         CreateAssertionStmt CreateTransformStmt CreateTrigStmt CreateEventTrigStmt
                                298                 :         CreateUserStmt CreateUserMappingStmt CreateRoleStmt CreatePolicyStmt
                                299                 :         CreatedbStmt DeclareCursorStmt DefineStmt DeleteStmt DiscardStmt DoStmt
                                300                 :         DropOpClassStmt DropOpFamilyStmt DropStmt
                                301                 :         DropCastStmt DropRoleStmt
                                302                 :         DropdbStmt DropTableSpaceStmt
                                303                 :         DropTransformStmt
                                304                 :         DropUserMappingStmt ExplainStmt FetchStmt
                                305                 :         GrantStmt GrantRoleStmt ImportForeignSchemaStmt IndexStmt InsertStmt
                                306                 :         ListenStmt LoadStmt LockStmt MergeStmt NotifyStmt ExplainableStmt PreparableStmt
                                307                 :         CreateFunctionStmt AlterFunctionStmt ReindexStmt RemoveAggrStmt
                                308                 :         RemoveFuncStmt RemoveOperStmt RenameStmt ReturnStmt RevokeStmt RevokeRoleStmt
                                309                 :         RuleActionStmt RuleActionStmtOrEmpty RuleStmt
                                310                 :         SecLabelStmt SelectStmt TransactionStmt TransactionStmtLegacy TruncateStmt
                                311                 :         UnlistenStmt UpdateStmt VacuumStmt
                                312                 :         VariableResetStmt VariableSetStmt VariableShowStmt
                                313                 :         ViewStmt CheckPointStmt CreateConversionStmt
                                314                 :         DeallocateStmt PrepareStmt ExecuteStmt
                                315                 :         DropOwnedStmt ReassignOwnedStmt
                                316                 :         AlterTSConfigurationStmt AlterTSDictionaryStmt
                                317                 :         CreateMatViewStmt RefreshMatViewStmt CreateAmStmt
                                318                 :         CreatePublicationStmt AlterPublicationStmt
                                319                 :         CreateSubscriptionStmt AlterSubscriptionStmt DropSubscriptionStmt
                                320                 : 
                                321                 : %type <node>  select_no_parens select_with_parens select_clause
                                322                 :                 simple_select values_clause
                                323                 :                 PLpgSQL_Expr PLAssignStmt
                                324                 : 
                                325                 : %type <str>           opt_single_name
                                326                 : %type <list>      opt_qualified_name
                                327                 : %type <boolean>       opt_concurrently
                                328                 : %type <dbehavior> opt_drop_behavior
                                329                 : 
                                330                 : %type <node>  alter_column_default opclass_item opclass_drop alter_using
                                331                 : %type <ival>  add_drop opt_asc_desc opt_nulls_order
                                332                 : 
                                333                 : %type <node>  alter_table_cmd alter_type_cmd opt_collate_clause
                                334                 :        replica_identity partition_cmd index_partition_cmd
                                335                 : %type <list>  alter_table_cmds alter_type_cmds
                                336                 : %type <list>    alter_identity_column_option_list
                                337                 : %type <defelt>  alter_identity_column_option
                                338                 : 
                                339                 : %type <list>  createdb_opt_list createdb_opt_items copy_opt_list
                                340                 :                 transaction_mode_list
                                341                 :                 create_extension_opt_list alter_extension_opt_list
                                342                 : %type <defelt>    createdb_opt_item copy_opt_item
                                343                 :                 transaction_mode_item
                                344                 :                 create_extension_opt_item alter_extension_opt_item
                                345                 : 
                                346                 : %type <ival>  opt_lock lock_type cast_context
                                347                 : %type <str>       utility_option_name
                                348                 : %type <defelt>    utility_option_elem
                                349                 : %type <list>  utility_option_list
                                350                 : %type <node>  utility_option_arg
                                351                 : %type <defelt>    drop_option
                                352                 : %type <boolean>   opt_or_replace opt_no
                                353                 :                 opt_grant_grant_option
                                354                 :                 opt_nowait opt_if_exists opt_with_data
                                355                 :                 opt_transaction_chain
                                356                 : %type <list>  grant_role_opt_list
                                357                 : %type <defelt>    grant_role_opt
                                358                 : %type <node>  grant_role_opt_value
                                359                 : %type <ival>  opt_nowait_or_skip
                                360                 : 
                                361                 : %type <list>  OptRoleList AlterOptRoleList
                                362                 : %type <defelt>    CreateOptRoleElem AlterOptRoleElem
                                363                 : 
                                364                 : %type <str>       opt_type
                                365                 : %type <str>       foreign_server_version opt_foreign_server_version
                                366                 : %type <str>       opt_in_database
                                367                 : 
                                368                 : %type <str>       parameter_name
                                369                 : %type <list>  OptSchemaEltList parameter_name_list
                                370                 : 
                                371                 : %type <chr>       am_type
                                372                 : 
                                373                 : %type <boolean> TriggerForSpec TriggerForType
                                374                 : %type <ival>  TriggerActionTime
                                375                 : %type <list>  TriggerEvents TriggerOneEvent
                                376                 : %type <node>  TriggerFuncArg
                                377                 : %type <node>  TriggerWhen
                                378                 : %type <str>       TransitionRelName
                                379                 : %type <boolean>   TransitionRowOrTable TransitionOldOrNew
                                380                 : %type <node>  TriggerTransition
                                381                 : 
                                382                 : %type <list>  event_trigger_when_list event_trigger_value_list
                                383                 : %type <defelt>    event_trigger_when_item
                                384                 : %type <chr>       enable_trigger
                                385                 : 
                                386                 : %type <str>       copy_file_name
                                387                 :                 access_method_clause attr_name
                                388                 :                 table_access_method_clause name cursor_name file_name
                                389                 :                 cluster_index_specification
                                390                 : 
                                391                 : %type <list>  func_name handler_name qual_Op qual_all_Op subquery_Op
                                392                 :                 opt_inline_handler opt_validator validator_clause
                                393                 :                 opt_collate
                                394                 : 
                                395                 : %type <range> qualified_name insert_target OptConstrFromTable
                                396                 : 
                                397                 : %type <str>       all_Op MathOp
                                398                 : 
                                399                 : %type <str>       row_security_cmd RowSecurityDefaultForCmd
                                400                 : %type <boolean> RowSecurityDefaultPermissive
                                401                 : %type <node>  RowSecurityOptionalWithCheck RowSecurityOptionalExpr
                                402                 : %type <list>  RowSecurityDefaultToRole RowSecurityOptionalToRole
                                403                 : 
                                404                 : %type <str>       iso_level opt_encoding
                                405                 : %type <rolespec> grantee
                                406                 : %type <list>  grantee_list
                                407                 : %type <accesspriv> privilege
                                408                 : %type <list>  privileges privilege_list
                                409                 : %type <privtarget> privilege_target
                                410                 : %type <objwithargs> function_with_argtypes aggregate_with_argtypes operator_with_argtypes
                                411                 : %type <list>  function_with_argtypes_list aggregate_with_argtypes_list operator_with_argtypes_list
                                412                 : %type <ival>  defacl_privilege_target
                                413                 : %type <defelt>    DefACLOption
                                414                 : %type <list>  DefACLOptionList
                                415                 : %type <ival>  import_qualification_type
                                416                 : %type <importqual> import_qualification
                                417                 : %type <node>  vacuum_relation
                                418                 : %type <selectlimit> opt_select_limit select_limit limit_clause
                                419                 : 
                                420                 : %type <list>  parse_toplevel stmtmulti routine_body_stmt_list
                                421                 :                 OptTableElementList TableElementList OptInherit definition
                                422                 :                 OptTypedTableElementList TypedTableElementList
                                423                 :                 reloptions opt_reloptions
                                424                 :                 OptWith opt_definition func_args func_args_list
                                425                 :                 func_args_with_defaults func_args_with_defaults_list
                                426                 :                 aggr_args aggr_args_list
                                427                 :                 func_as createfunc_opt_list opt_createfunc_opt_list alterfunc_opt_list
                                428                 :                 old_aggr_definition old_aggr_list
                                429                 :                 oper_argtypes RuleActionList RuleActionMulti
                                430                 :                 opt_column_list columnList opt_name_list
                                431                 :                 sort_clause opt_sort_clause sortby_list index_params
                                432                 :                 stats_params
                                433                 :                 opt_include opt_c_include index_including_params
                                434                 :                 name_list role_list from_clause from_list opt_array_bounds
                                435                 :                 qualified_name_list any_name any_name_list type_name_list
                                436                 :                 any_operator expr_list attrs
                                437                 :                 distinct_clause opt_distinct_clause
                                438                 :                 target_list opt_target_list insert_column_list set_target_list
                                439                 :                 merge_values_clause
                                440                 :                 set_clause_list set_clause
                                441                 :                 def_list operator_def_list indirection opt_indirection
                                442                 :                 reloption_list TriggerFuncArgs opclass_item_list opclass_drop_list
                                443                 :                 opclass_purpose opt_opfamily transaction_mode_list_or_empty
                                444                 :                 OptTableFuncElementList TableFuncElementList opt_type_modifiers
                                445                 :                 prep_type_clause
                                446                 :                 execute_param_clause using_clause returning_clause
                                447                 :                 opt_enum_val_list enum_val_list table_func_column_list
                                448                 :                 create_generic_options alter_generic_options
                                449                 :                 relation_expr_list dostmt_opt_list
                                450                 :                 transform_element_list transform_type_list
                                451                 :                 TriggerTransitions TriggerReferencing
                                452                 :                 vacuum_relation_list opt_vacuum_relation_list
                                453                 :                 drop_option_list pub_obj_list
                                454                 : 
                                455                 : %type <node>  opt_routine_body
                                456                 : %type <groupclause> group_clause
                                457                 : %type <list>  group_by_list
                                458                 : %type <node>  group_by_item empty_grouping_set rollup_clause cube_clause
                                459                 : %type <node>  grouping_sets_clause
                                460                 : 
                                461                 : %type <list>  opt_fdw_options fdw_options
                                462                 : %type <defelt>    fdw_option
                                463                 : 
                                464                 : %type <range> OptTempTableName
                                465                 : %type <into>  into_clause create_as_target create_mv_target
                                466                 : 
                                467                 : %type <defelt>    createfunc_opt_item common_func_opt_item dostmt_opt_item
                                468                 : %type <fun_param> func_arg func_arg_with_default table_func_column aggr_arg
                                469                 : %type <fun_param_mode> arg_class
                                470                 : %type <typnam>    func_return func_type
                                471                 : 
                                472                 : %type <boolean>  opt_trusted opt_restart_seqs
                                473                 : %type <ival>   OptTemp
                                474                 : %type <ival>   OptNoLog
                                475                 : %type <oncommit> OnCommitOption
                                476                 : 
                                477                 : %type <ival>  for_locking_strength
                                478                 : %type <node>  for_locking_item
                                479                 : %type <list>  for_locking_clause opt_for_locking_clause for_locking_items
                                480                 : %type <list>  locked_rels_list
                                481                 : %type <setquantifier> set_quantifier
                                482                 : 
                                483                 : %type <node>  join_qual
                                484                 : %type <jtype> join_type
                                485                 : 
                                486                 : %type <list>  extract_list overlay_list position_list
                                487                 : %type <list>  substr_list trim_list
                                488                 : %type <list>  opt_interval interval_second
                                489                 : %type <str>       unicode_normal_form
                                490                 : 
                                491                 : %type <boolean> opt_instead
                                492                 : %type <boolean> opt_unique opt_verbose opt_full
                                493                 : %type <boolean> opt_freeze opt_analyze opt_default opt_recheck
                                494                 : %type <defelt>    opt_binary copy_delimiter
                                495                 : 
                                496                 : %type <boolean> copy_from opt_program
                                497                 : 
                                498                 : %type <ival>  event cursor_options opt_hold opt_set_data
                                499                 : %type <objtype>   object_type_any_name object_type_name object_type_name_on_any_name
                                500                 :                 drop_type_name
                                501                 : 
                                502                 : %type <node>  fetch_args select_limit_value
                                503                 :                 offset_clause select_offset_value
                                504                 :                 select_fetch_first_value I_or_F_const
                                505                 : %type <ival>  row_or_rows first_or_next
                                506                 : 
                                507                 : %type <list>  OptSeqOptList SeqOptList OptParenthesizedSeqOptList
                                508                 : %type <defelt>    SeqOptElem
                                509                 : 
                                510                 : %type <istmt> insert_rest
                                511                 : %type <infer> opt_conf_expr
                                512                 : %type <onconflict> opt_on_conflict
                                513                 : %type <mergewhen> merge_insert merge_update merge_delete
                                514                 : 
                                515                 : %type <node>  merge_when_clause opt_merge_when_condition
                                516                 : %type <list>  merge_when_list
                                517                 : 
                                518                 : %type <vsetstmt> generic_set set_rest set_rest_more generic_reset reset_rest
                                519                 :                  SetResetClause FunctionSetResetClause
                                520                 : 
                                521                 : %type <node>  TableElement TypedTableElement ConstraintElem TableFuncElement
                                522                 : %type <node>  columnDef columnOptions
                                523                 : %type <defelt>    def_elem reloption_elem old_aggr_elem operator_def_elem
                                524                 : %type <node>  def_arg columnElem where_clause where_or_current_clause
                                525                 :                 a_expr b_expr c_expr AexprConst indirection_el opt_slice_bound
                                526                 :                 columnref in_expr having_clause func_table xmltable array_expr
                                527                 :                 OptWhereClause operator_def_arg
                                528                 : %type <list>  rowsfrom_item rowsfrom_list opt_col_def_list
                                529                 : %type <boolean> opt_ordinality
                                530                 : %type <list>  ExclusionConstraintList ExclusionConstraintElem
                                531                 : %type <list>  func_arg_list func_arg_list_opt
                                532                 : %type <node>  func_arg_expr
                                533                 : %type <list>  row explicit_row implicit_row type_list array_expr_list
                                534                 : %type <node>  case_expr case_arg when_clause case_default
                                535                 : %type <list>  when_clause_list
                                536                 : %type <node>  opt_search_clause opt_cycle_clause
                                537                 : %type <ival>  sub_type opt_materialized
                                538                 : %type <node>  NumericOnly
                                539                 : %type <list>  NumericOnly_list
                                540                 : %type <alias> alias_clause opt_alias_clause opt_alias_clause_for_join_using
                                541                 : %type <list>  func_alias_clause
                                542                 : %type <sortby>    sortby
                                543                 : %type <ielem> index_elem index_elem_options
                                544                 : %type <selem> stats_param
                                545                 : %type <node>  table_ref
                                546                 : %type <jexpr> joined_table
                                547                 : %type <range> relation_expr
                                548                 : %type <range> extended_relation_expr
                                549                 : %type <range> relation_expr_opt_alias
                                550                 : %type <node>  tablesample_clause opt_repeatable_clause
                                551                 : %type <target>    target_el set_target insert_column_item
                                552                 : 
                                553                 : %type <str>       generic_option_name
                                554                 : %type <node>  generic_option_arg
                                555                 : %type <defelt>    generic_option_elem alter_generic_option_elem
                                556                 : %type <list>  generic_option_list alter_generic_option_list
                                557                 : 
                                558                 : %type <ival>  reindex_target_relation reindex_target_all
                                559                 : %type <list>  opt_reindex_option_list
                                560                 : 
                                561                 : %type <node>  copy_generic_opt_arg copy_generic_opt_arg_list_item
                                562                 : %type <defelt>    copy_generic_opt_elem
                                563                 : %type <list>  copy_generic_opt_list copy_generic_opt_arg_list
                                564                 : %type <list>  copy_options
                                565                 : 
                                566                 : %type <typnam>    Typename SimpleTypename ConstTypename
                                567                 :                 GenericType Numeric opt_float
                                568                 :                 Character ConstCharacter
                                569                 :                 CharacterWithLength CharacterWithoutLength
                                570                 :                 ConstDatetime ConstInterval
                                571                 :                 Bit ConstBit BitWithLength BitWithoutLength
                                572                 : %type <str>       character
                                573                 : %type <str>       extract_arg
                                574                 : %type <boolean> opt_varying opt_timezone opt_no_inherit
                                575                 : 
                                576                 : %type <ival>  Iconst SignedIconst
                                577                 : %type <str>       Sconst comment_text notify_payload
                                578                 : %type <str>       RoleId opt_boolean_or_string
                                579                 : %type <list>  var_list
                                580                 : %type <str>       ColId ColLabel BareColLabel
                                581                 : %type <str>       NonReservedWord NonReservedWord_or_Sconst
                                582                 : %type <str>       var_name type_function_name param_name
                                583                 : %type <str>       createdb_opt_name plassign_target
                                584                 : %type <node>  var_value zone_value
                                585                 : %type <rolespec> auth_ident RoleSpec opt_granted_by
                                586                 : %type <publicationobjectspec> PublicationObjSpec
                                587                 : 
                                588                 : %type <keyword> unreserved_keyword type_func_name_keyword
                                589                 : %type <keyword> col_name_keyword reserved_keyword
                                590                 : %type <keyword> bare_label_keyword
                                591                 : 
                                592                 : %type <node>  TableConstraint TableLikeClause
                                593                 : %type <ival>  TableLikeOptionList TableLikeOption
                                594                 : %type <str>       column_compression opt_column_compression column_storage opt_column_storage
                                595                 : %type <list>  ColQualList
                                596                 : %type <node>  ColConstraint ColConstraintElem ConstraintAttr
                                597                 : %type <ival>  key_match
                                598                 : %type <keyaction> key_delete key_update key_action
                                599                 : %type <keyactions> key_actions
                                600                 : %type <ival>  ConstraintAttributeSpec ConstraintAttributeElem
                                601                 : %type <str>       ExistingIndex
                                602                 : 
                                603                 : %type <list>  constraints_set_list
                                604                 : %type <boolean> constraints_set_mode
                                605                 : %type <str>       OptTableSpace OptConsTableSpace
                                606                 : %type <rolespec> OptTableSpaceOwner
                                607                 : %type <ival>  opt_check_option
                                608                 : 
                                609                 : %type <str>       opt_provider security_label
                                610                 : 
                                611                 : %type <target>    xml_attribute_el
                                612                 : %type <list>  xml_attribute_list xml_attributes
                                613                 : %type <node>  xml_root_version opt_xml_root_standalone
                                614                 : %type <node>  xmlexists_argument
                                615                 : %type <ival>  document_or_content
                                616                 : %type <boolean>   xml_indent_option xml_whitespace_option
                                617                 : %type <list>  xmltable_column_list xmltable_column_option_list
                                618                 : %type <node>  xmltable_column_el
                                619                 : %type <defelt>    xmltable_column_option_el
                                620                 : %type <list>  xml_namespace_list
                                621                 : %type <target>    xml_namespace_el
                                622                 : 
                                623                 : %type <node>  func_application func_expr_common_subexpr
                                624                 : %type <node>  func_expr func_expr_windowless
                                625                 : %type <node>  common_table_expr
                                626                 : %type <with>  with_clause opt_with_clause
                                627                 : %type <list>  cte_list
                                628                 : 
                                629                 : %type <list>  within_group_clause
                                630                 : %type <node>  filter_clause
                                631                 : %type <list>  window_clause window_definition_list opt_partition_clause
                                632                 : %type <windef>    window_definition over_clause window_specification
                                633                 :                 opt_frame_clause frame_extent frame_bound
                                634                 : %type <ival>  opt_window_exclusion_clause
                                635                 : %type <str>       opt_existing_window_name
                                636                 : %type <boolean> opt_if_not_exists
                                637                 : %type <boolean> opt_unique_null_treatment
                                638                 : %type <ival>  generated_when override_kind
                                639                 : %type <partspec>  PartitionSpec OptPartitionSpec
                                640                 : %type <partelem>  part_elem
                                641                 : %type <list>      part_params
                                642                 : %type <partboundspec> PartitionBoundSpec
                                643                 : %type <list>      hash_partbound
                                644                 : %type <defelt>        hash_partbound_elem
                                645                 : 
                                646                 : 
                                647                 : %type <node>      json_format_clause_opt
                                648                 :                     json_value_expr
                                649                 :                     json_output_clause_opt
                                650                 :                     json_name_and_value
                                651                 :                     json_aggregate_func
                                652                 : 
                                653                 : %type <list>      json_name_and_value_list
                                654                 :                     json_value_expr_list
                                655                 :                     json_array_aggregate_order_by_clause_opt
                                656                 : 
                                657                 : %type <ival>      json_encoding_clause_opt
                                658                 :                     json_predicate_type_constraint
                                659                 : 
                                660                 : %type <boolean>       json_key_uniqueness_constraint_opt
                                661                 :                     json_object_constructor_null_clause_opt
                                662                 :                     json_array_constructor_null_clause_opt
                                663                 : 
                                664                 : /*
                                665                 :  * Non-keyword token types.  These are hard-wired into the "flex" lexer.
                                666                 :  * They must be listed first so that their numeric codes do not depend on
                                667                 :  * the set of keywords.  PL/pgSQL depends on this so that it can share the
                                668                 :  * same lexer.  If you add/change tokens here, fix PL/pgSQL to match!
                                669                 :  *
                                670                 :  * UIDENT and USCONST are reduced to IDENT and SCONST in parser.c, so that
                                671                 :  * they need no productions here; but we must assign token codes to them.
                                672                 :  *
                                673                 :  * DOT_DOT is unused in the core SQL grammar, and so will always provoke
                                674                 :  * parse errors.  It is needed by PL/pgSQL.
                                675                 :  */
                                676                 : %token <str>  IDENT UIDENT FCONST SCONST USCONST BCONST XCONST Op
                                677                 : %token <ival> ICONST PARAM
                                678                 : %token          TYPECAST DOT_DOT COLON_EQUALS EQUALS_GREATER
                                679                 : %token          LESS_EQUALS GREATER_EQUALS NOT_EQUALS
                                680                 : 
                                681                 : /*
                                682                 :  * If you want to make any keyword changes, update the keyword table in
                                683                 :  * src/include/parser/kwlist.h and add new keywords to the appropriate one
                                684                 :  * of the reserved-or-not-so-reserved keyword lists, below; search
                                685                 :  * this file for "Keyword category lists".
                                686                 :  */
                                687                 : 
                                688                 : /* ordinary key words in alphabetical order */
                                689                 : %token <keyword> ABORT_P ABSENT ABSOLUTE_P ACCESS ACTION ADD_P ADMIN AFTER
                                690                 :     AGGREGATE ALL ALSO ALTER ALWAYS ANALYSE ANALYZE AND ANY ARRAY AS ASC
                                691                 :     ASENSITIVE ASSERTION ASSIGNMENT ASYMMETRIC ATOMIC AT ATTACH ATTRIBUTE AUTHORIZATION
                                692                 : 
                                693                 :     BACKWARD BEFORE BEGIN_P BETWEEN BIGINT BINARY BIT
                                694                 :     BOOLEAN_P BOTH BREADTH BY
                                695                 : 
                                696                 :     CACHE CALL CALLED CASCADE CASCADED CASE CAST CATALOG_P CHAIN CHAR_P
                                697                 :     CHARACTER CHARACTERISTICS CHECK CHECKPOINT CLASS CLOSE
                                698                 :     CLUSTER COALESCE COLLATE COLLATION COLUMN COLUMNS COMMENT COMMENTS COMMIT
                                699                 :     COMMITTED COMPRESSION CONCURRENTLY CONFIGURATION CONFLICT
                                700                 :     CONNECTION CONSTRAINT CONSTRAINTS CONTENT_P CONTINUE_P CONVERSION_P COPY
                                701                 :     COST CREATE CROSS CSV CUBE CURRENT_P
                                702                 :     CURRENT_CATALOG CURRENT_DATE CURRENT_ROLE CURRENT_SCHEMA
                                703                 :     CURRENT_TIME CURRENT_TIMESTAMP CURRENT_USER CURSOR CYCLE
                                704                 : 
                                705                 :     DATA_P DATABASE DAY_P DEALLOCATE DEC DECIMAL_P DECLARE DEFAULT DEFAULTS
                                706                 :     DEFERRABLE DEFERRED DEFINER DELETE_P DELIMITER DELIMITERS DEPENDS DEPTH DESC
                                707                 :     DETACH DICTIONARY DISABLE_P DISCARD DISTINCT DO DOCUMENT_P DOMAIN_P
                                708                 :     DOUBLE_P DROP
                                709                 : 
                                710                 :     EACH ELSE ENABLE_P ENCODING ENCRYPTED END_P ENUM_P ESCAPE EVENT EXCEPT
                                711                 :     EXCLUDE EXCLUDING EXCLUSIVE EXECUTE EXISTS EXPLAIN EXPRESSION
                                712                 :     EXTENSION EXTERNAL EXTRACT
                                713                 : 
                                714                 :     FALSE_P FAMILY FETCH FILTER FINALIZE FIRST_P FLOAT_P FOLLOWING FOR
                                715                 :     FORCE FOREIGN FORMAT FORWARD FREEZE FROM FULL FUNCTION FUNCTIONS
                                716                 : 
                                717                 :     GENERATED GLOBAL GRANT GRANTED GREATEST GROUP_P GROUPING GROUPS
                                718                 : 
                                719                 :     HANDLER HAVING HEADER_P HOLD HOUR_P
                                720                 : 
                                721                 :     IDENTITY_P IF_P ILIKE IMMEDIATE IMMUTABLE IMPLICIT_P IMPORT_P IN_P INCLUDE
                                722                 :     INCLUDING INCREMENT INDENT INDEX INDEXES INHERIT INHERITS INITIALLY INLINE_P
                                723                 :     INNER_P INOUT INPUT_P INSENSITIVE INSERT INSTEAD INT_P INTEGER
                                724                 :     INTERSECT INTERVAL INTO INVOKER IS ISNULL ISOLATION
                                725                 : 
                                726                 :     JOIN JSON JSON_ARRAY JSON_ARRAYAGG JSON_OBJECT JSON_OBJECTAGG
                                727                 : 
                                728                 :     KEY KEYS
                                729                 : 
                                730                 :     LABEL LANGUAGE LARGE_P LAST_P LATERAL_P
                                731                 :     LEADING LEAKPROOF LEAST LEFT LEVEL LIKE LIMIT LISTEN LOAD LOCAL
                                732                 :     LOCALTIME LOCALTIMESTAMP LOCATION LOCK_P LOCKED LOGGED
                                733                 : 
                                734                 :     MAPPING MATCH MATCHED MATERIALIZED MAXVALUE MERGE METHOD
                                735                 :     MINUTE_P MINVALUE MODE MONTH_P MOVE
                                736                 : 
                                737                 :     NAME_P NAMES NATIONAL NATURAL NCHAR NEW NEXT NFC NFD NFKC NFKD NO NONE
                                738                 :     NORMALIZE NORMALIZED
                                739                 :     NOT NOTHING NOTIFY NOTNULL NOWAIT NULL_P NULLIF
                                740                 :     NULLS_P NUMERIC
                                741                 : 
                                742                 :     OBJECT_P OF OFF OFFSET OIDS OLD ON ONLY OPERATOR OPTION OPTIONS OR
                                743                 :     ORDER ORDINALITY OTHERS OUT_P OUTER_P
                                744                 :     OVER OVERLAPS OVERLAY OVERRIDING OWNED OWNER
                                745                 : 
                                746                 :     PARALLEL PARAMETER PARSER PARTIAL PARTITION PASSING PASSWORD
                                747                 :     PLACING PLANS POLICY
                                748                 :     POSITION PRECEDING PRECISION PRESERVE PREPARE PREPARED PRIMARY
                                749                 :     PRIOR PRIVILEGES PROCEDURAL PROCEDURE PROCEDURES PROGRAM PUBLICATION
                                750                 : 
                                751                 :     QUOTE
                                752                 : 
                                753                 :     RANGE READ REAL REASSIGN RECHECK RECURSIVE REF_P REFERENCES REFERENCING
                                754                 :     REFRESH REINDEX RELATIVE_P RELEASE RENAME REPEATABLE REPLACE REPLICA
                                755                 :     RESET RESTART RESTRICT RETURN RETURNING RETURNS REVOKE RIGHT ROLE ROLLBACK ROLLUP
                                756                 :     ROUTINE ROUTINES ROW ROWS RULE
                                757                 : 
                                758                 :     SAVEPOINT SCALAR SCHEMA SCHEMAS SCROLL SEARCH SECOND_P SECURITY SELECT
                                759                 :     SEQUENCE SEQUENCES
                                760                 :     SERIALIZABLE SERVER SESSION SESSION_USER SET SETS SETOF SHARE SHOW
                                761                 :     SIMILAR SIMPLE SKIP SMALLINT SNAPSHOT SOME SQL_P STABLE STANDALONE_P
                                762                 :     START STATEMENT STATISTICS STDIN STDOUT STORAGE STORED STRICT_P STRIP_P
                                763                 :     SUBSCRIPTION SUBSTRING SUPPORT SYMMETRIC SYSID SYSTEM_P SYSTEM_USER
                                764                 : 
                                765                 :     TABLE TABLES TABLESAMPLE TABLESPACE TEMP TEMPLATE TEMPORARY TEXT_P THEN
                                766                 :     TIES TIME TIMESTAMP TO TRAILING TRANSACTION TRANSFORM
                                767                 :     TREAT TRIGGER TRIM TRUE_P
                                768                 :     TRUNCATE TRUSTED TYPE_P TYPES_P
                                769                 : 
                                770                 :     UESCAPE UNBOUNDED UNCOMMITTED UNENCRYPTED UNION UNIQUE UNKNOWN
                                771                 :     UNLISTEN UNLOGGED UNTIL UPDATE USER USING
                                772                 : 
                                773                 :     VACUUM VALID VALIDATE VALIDATOR VALUE_P VALUES VARCHAR VARIADIC VARYING
                                774                 :     VERBOSE VERSION_P VIEW VIEWS VOLATILE
                                775                 : 
                                776                 :     WHEN WHERE WHITESPACE_P WINDOW WITH WITHIN WITHOUT WORK WRAPPER WRITE
                                777                 : 
                                778                 :     XML_P XMLATTRIBUTES XMLCONCAT XMLELEMENT XMLEXISTS XMLFOREST XMLNAMESPACES
                                779                 :     XMLPARSE XMLPI XMLROOT XMLSERIALIZE XMLTABLE
                                780                 : 
                                781                 :     YEAR_P YES_P
                                782                 : 
                                783                 :     ZONE
                                784                 : 
                                785                 : /*
                                786                 :  * The grammar thinks these are keywords, but they are not in the kwlist.h
                                787                 :  * list and so can never be entered directly.  The filter in parser.c
                                788                 :  * creates these tokens when required (based on looking one token ahead).
                                789                 :  *
                                790                 :  * NOT_LA exists so that productions such as NOT LIKE can be given the same
                                791                 :  * precedence as LIKE; otherwise they'd effectively have the same precedence
                                792                 :  * as NOT, at least with respect to their left-hand subexpression.
                                793                 :  * FORMAT_LA, NULLS_LA, WITH_LA, and WITHOUT_LA are needed to make the grammar
                                794                 :  * LALR(1).
                                795                 :  */
                                796                 : %token      FORMAT_LA NOT_LA NULLS_LA WITH_LA WITHOUT_LA
                                797                 : 
                                798                 : /*
                                799                 :  * The grammar likewise thinks these tokens are keywords, but they are never
                                800                 :  * generated by the scanner.  Rather, they can be injected by parser.c as
                                801                 :  * the initial token of the string (using the lookahead-token mechanism
                                802                 :  * implemented there).  This provides a way to tell the grammar to parse
                                803                 :  * something other than the usual list of SQL commands.
                                804                 :  */
                                805                 : %token      MODE_TYPE_NAME
                                806                 : %token      MODE_PLPGSQL_EXPR
                                807                 : %token      MODE_PLPGSQL_ASSIGN1
                                808                 : %token      MODE_PLPGSQL_ASSIGN2
                                809                 : %token      MODE_PLPGSQL_ASSIGN3
                                810                 : 
                                811                 : 
                                812                 : /* Precedence: lowest to highest */
                                813                 : %nonassoc   SET             /* see relation_expr_opt_alias */
                                814                 : %left       UNION EXCEPT
                                815                 : %left       INTERSECT
                                816                 : %left       OR
                                817                 : %left       AND
                                818                 : %right      NOT
                                819                 : %nonassoc   IS ISNULL NOTNULL   /* IS sets precedence for IS NULL, etc */
                                820                 : %nonassoc   '<' '>' '=' LESS_EQUALS GREATER_EQUALS NOT_EQUALS
                                821                 : %nonassoc   BETWEEN IN_P LIKE ILIKE SIMILAR NOT_LA
                                822                 : %nonassoc   ESCAPE          /* ESCAPE must be just above LIKE/ILIKE/SIMILAR */
                                823                 : 
                                824                 : /* SQL/JSON related keywords */
                                825                 : %nonassoc   UNIQUE JSON
                                826                 : %nonassoc   KEYS OBJECT_P SCALAR VALUE_P
                                827                 : %nonassoc   WITH WITHOUT
                                828                 : 
                                829                 : /*
                                830                 :  * To support target_el without AS, it used to be necessary to assign IDENT an
                                831                 :  * explicit precedence just less than Op.  While that's not really necessary
                                832                 :  * since we removed postfix operators, it's still helpful to do so because
                                833                 :  * there are some other unreserved keywords that need precedence assignments.
                                834                 :  * If those keywords have the same precedence as IDENT then they clearly act
                                835                 :  * the same as non-keywords, reducing the risk of unwanted precedence effects.
                                836                 :  *
                                837                 :  * We need to do this for PARTITION, RANGE, ROWS, and GROUPS to support
                                838                 :  * opt_existing_window_name (see comment there).
                                839                 :  *
                                840                 :  * The frame_bound productions UNBOUNDED PRECEDING and UNBOUNDED FOLLOWING
                                841                 :  * are even messier: since UNBOUNDED is an unreserved keyword (per spec!),
                                842                 :  * there is no principled way to distinguish these from the productions
                                843                 :  * a_expr PRECEDING/FOLLOWING.  We hack this up by giving UNBOUNDED slightly
                                844                 :  * lower precedence than PRECEDING and FOLLOWING.  At present this doesn't
                                845                 :  * appear to cause UNBOUNDED to be treated differently from other unreserved
                                846                 :  * keywords anywhere else in the grammar, but it's definitely risky.  We can
                                847                 :  * blame any funny behavior of UNBOUNDED on the SQL standard, though.
                                848                 :  *
                                849                 :  * To support CUBE and ROLLUP in GROUP BY without reserving them, we give them
                                850                 :  * an explicit priority lower than '(', so that a rule with CUBE '(' will shift
                                851                 :  * rather than reducing a conflicting rule that takes CUBE as a function name.
                                852                 :  * Using the same precedence as IDENT seems right for the reasons given above.
                                853                 :  */
                                854                 : %nonassoc   UNBOUNDED       /* ideally would have same precedence as IDENT */
                                855                 : %nonassoc   IDENT PARTITION RANGE ROWS GROUPS PRECEDING FOLLOWING CUBE ROLLUP
                                856                 : %left       Op OPERATOR     /* multi-character ops and user-defined operators */
                                857                 : %left       '+' '-'
                                858                 : %left       '*' '/' '%'
                                859                 : %left       '^'
                                860                 : /* Unary Operators */
                                861                 : %left       AT              /* sets precedence for AT TIME ZONE */
                                862                 : %left       COLLATE
                                863                 : %right      UMINUS
                                864                 : %left       '[' ']'
                                865                 : %left       '(' ')'
                                866                 : %left       TYPECAST
                                867                 : %left       '.'
                                868                 : /*
                                869                 :  * These might seem to be low-precedence, but actually they are not part
                                870                 :  * of the arithmetic hierarchy at all in their use as JOIN operators.
                                871                 :  * We make them high-precedence to support their use as function names.
                                872                 :  * They wouldn't be given a precedence at all, were it not that we need
                                873                 :  * left-associativity among the JOIN rules themselves.
                                874                 :  */
                                875                 : %left       JOIN CROSS LEFT FULL RIGHT INNER_P NATURAL
                                876                 : 
                                877                 : %%
                                878                 : 
                                879                 : /*
                                880                 :  *  The target production for the whole parse.
                                881                 :  *
                                882                 :  * Ordinarily we parse a list of statements, but if we see one of the
                                883                 :  * special MODE_XXX symbols as first token, we parse something else.
                                884                 :  * The options here correspond to enum RawParseMode, which see for details.
                                885                 :  */
                                886                 : parse_toplevel:
                                887                 :             stmtmulti
                                888                 :             {
 5018 tgl                       889 GIC      475494 :                 pg_yyget_extra(yyscanner)->parsetree = $1;
                                890                 :                 (void) yynerrs;     /* suppress compiler warning */
                                891                 :             }
                                892                 :             | MODE_TYPE_NAME Typename
                                893                 :             {
  825                           894            4552 :                 pg_yyget_extra(yyscanner)->parsetree = list_make1($2);
                                895                 :             }
                                896                 :             | MODE_PLPGSQL_EXPR PLpgSQL_Expr
                                897                 :             {
                                898           14331 :                 pg_yyget_extra(yyscanner)->parsetree =
                                899           14331 :                     list_make1(makeRawStmt($2, 0));
                                900                 :             }
                                901                 :             | MODE_PLPGSQL_ASSIGN1 PLAssignStmt
                                902                 :             {
                                903            2928 :                 PLAssignStmt *n = (PLAssignStmt *) $2;
                                904                 : 
                                905            2928 :                 n->nnames = 1;
                                906            2928 :                 pg_yyget_extra(yyscanner)->parsetree =
                                907            2928 :                     list_make1(makeRawStmt((Node *) n, 0));
                                908                 :             }
                                909                 :             | MODE_PLPGSQL_ASSIGN2 PLAssignStmt
                                910                 :             {
                                911             309 :                 PLAssignStmt *n = (PLAssignStmt *) $2;
                                912                 : 
                                913             309 :                 n->nnames = 2;
                                914             309 :                 pg_yyget_extra(yyscanner)->parsetree =
                                915             309 :                     list_make1(makeRawStmt((Node *) n, 0));
                                916                 :             }
  825 tgl                       917 ECB             :             | MODE_PLPGSQL_ASSIGN3 PLAssignStmt
                                918                 :             {
  825 tgl                       919 GIC          14 :                 PLAssignStmt *n = (PLAssignStmt *) $2;
                                920                 : 
                                921              14 :                 n->nnames = 3;
  825 tgl                       922 CBC          14 :                 pg_yyget_extra(yyscanner)->parsetree =
  825 tgl                       923 GIC          14 :                     list_make1(makeRawStmt((Node *) n, 0));
                                924                 :             }
                                925                 :         ;
 9606 bruce                     926 ECB             : 
 2276 tgl                       927                 : /*
                                928                 :  * At top level, we wrap each stmt with a RawStmt node carrying start location
                                929                 :  * and length of the stmt's text.  Notice that the start loc/len are driven
                                930                 :  * entirely from semicolon locations (@2).  It would seem natural to use
                                931                 :  * @1 or @3 to get the true start location of a stmt, but that doesn't work
                                932                 :  * for statements that can start with empty nonterminals (opt_with_clause is
                                933                 :  * the main offender here); as noted in the comments for YYLLOC_DEFAULT,
                                934                 :  * we'd get -1 for the location in such cases.
                                935                 :  * We also take care to discard empty statements entirely.
                                936                 :  */
                                937                 : stmtmulti:  stmtmulti ';' toplevel_stmt
                                938                 :                 {
 2276 tgl                       939 CBC      454266 :                     if ($1 != NIL)
                                940                 :                     {
 2276 tgl                       941 ECB             :                         /* update length of previous stmt */
 2190 tgl                       942 CBC      454229 :                         updateRawStmtEnd(llast_node(RawStmt, $1), @2);
 2276 tgl                       943 ECB             :                     }
 5018 tgl                       944 GIC      454266 :                     if ($3 != NULL)
 2276                           945           47881 :                         $$ = lappend($1, makeRawStmt($3, @2 + 1));
                                946                 :                     else
 5018 tgl                       947 CBC      406385 :                         $$ = $1;
                                948                 :                 }
  732 peter                     949 ECB             :             | toplevel_stmt
 5018 tgl                       950                 :                 {
 5018 tgl                       951 CBC      475497 :                     if ($1 != NULL)
 2276 tgl                       952 GIC      475313 :                         $$ = list_make1(makeRawStmt($1, 0));
                                953                 :                     else
 7601 bruce                     954             184 :                         $$ = NIL;
                                955                 :                 }
                                956                 :         ;
                                957                 : 
                                958                 : /*
                                959                 :  * toplevel_stmt includes BEGIN and END.  stmt does not include them, because
                                960                 :  * those words have different meanings in function bodys.
                                961                 :  */
                                962                 : toplevel_stmt:
                                963                 :             stmt
                                964                 :             | TransactionStmtLegacy
                                965                 :         ;
                                966                 : 
  732 peter                     967 ECB             : stmt:
                                968                 :             AlterEventTrigStmt
                                969                 :             | AlterCollationStmt
 3917 rhaas                     970                 :             | AlterDatabaseStmt
                                971                 :             | AlterDatabaseSetStmt
 4934 tgl                       972                 :             | AlterDefaultPrivilegesStmt
 7429 bruce                     973                 :             | AlterDomainStmt
                                974                 :             | AlterEnumStmt
 4440 tgl                       975                 :             | AlterExtensionStmt
                                976                 :             | AlterExtensionContentsStmt
                                977                 :             | AlterFdwStmt
                                978                 :             | AlterForeignServerStmt
 6600 neilc                     979                 :             | AlterFunctionStmt
 7601 bruce                     980                 :             | AlterGroupStmt
                                981                 :             | AlterObjectDependsStmt
 6460 tgl                       982                 :             | AlterObjectSchemaStmt
                                983                 :             | AlterOwnerStmt
                                984                 :             | AlterOperatorStmt
                                985                 :             | AlterTypeStmt
                                986                 :             | AlterPolicyStmt
                                987                 :             | AlterSeqStmt
                                988                 :             | AlterSystemStmt
                                989                 :             | AlterTableStmt
                                990                 :             | AlterTblSpcStmt
                                991                 :             | AlterCompositeTypeStmt
                                992                 :             | AlterPublicationStmt
                                993                 :             | AlterRoleSetStmt
                                994                 :             | AlterRoleStmt
                                995                 :             | AlterSubscriptionStmt
                                996                 :             | AlterStatsStmt
                                997                 :             | AlterTSConfigurationStmt
                                998                 :             | AlterTSDictionaryStmt
                                999                 :             | AlterUserMappingStmt
                               1000                 :             | AnalyzeStmt
                               1001                 :             | CallStmt
                               1002                 :             | CheckPointStmt
                               1003                 :             | ClosePortalStmt
                               1004                 :             | ClusterStmt
                               1005                 :             | CommentStmt
                               1006                 :             | ConstraintsSetStmt
                               1007                 :             | CopyStmt
                               1008                 :             | CreateAmStmt
                               1009                 :             | CreateAsStmt
                               1010                 :             | CreateAssertionStmt
                               1011                 :             | CreateCastStmt
                               1012                 :             | CreateConversionStmt
                               1013                 :             | CreateDomainStmt
                               1014                 :             | CreateExtensionStmt
                               1015                 :             | CreateFdwStmt
                               1016                 :             | CreateForeignServerStmt
                               1017                 :             | CreateForeignTableStmt
                               1018                 :             | CreateFunctionStmt
                               1019                 :             | CreateGroupStmt
                               1020                 :             | CreateMatViewStmt
                               1021                 :             | CreateOpClassStmt
                               1022                 :             | CreateOpFamilyStmt
                               1023                 :             | CreatePublicationStmt
                               1024                 :             | AlterOpFamilyStmt
                               1025                 :             | CreatePolicyStmt
                               1026                 :             | CreatePLangStmt
                               1027                 :             | CreateSchemaStmt
                               1028                 :             | CreateSeqStmt
                               1029                 :             | CreateStmt
                               1030                 :             | CreateSubscriptionStmt
                               1031                 :             | CreateStatsStmt
                               1032                 :             | CreateTableSpaceStmt
                               1033                 :             | CreateTransformStmt
                               1034                 :             | CreateTrigStmt
                               1035                 :             | CreateEventTrigStmt
                               1036                 :             | CreateRoleStmt
                               1037                 :             | CreateUserStmt
                               1038                 :             | CreateUserMappingStmt
                               1039                 :             | CreatedbStmt
                               1040                 :             | DeallocateStmt
                               1041                 :             | DeclareCursorStmt
                               1042                 :             | DefineStmt
                               1043                 :             | DeleteStmt
                               1044                 :             | DiscardStmt
                               1045                 :             | DoStmt
                               1046                 :             | DropCastStmt
                               1047                 :             | DropOpClassStmt
                               1048                 :             | DropOpFamilyStmt
                               1049                 :             | DropOwnedStmt
                               1050                 :             | DropStmt
                               1051                 :             | DropSubscriptionStmt
                               1052                 :             | DropTableSpaceStmt
                               1053                 :             | DropTransformStmt
                               1054                 :             | DropRoleStmt
                               1055                 :             | DropUserMappingStmt
                               1056                 :             | DropdbStmt
                               1057                 :             | ExecuteStmt
                               1058                 :             | ExplainStmt
                               1059                 :             | FetchStmt
                               1060                 :             | GrantStmt
                               1061                 :             | GrantRoleStmt
                               1062                 :             | ImportForeignSchemaStmt
                               1063                 :             | IndexStmt
                               1064                 :             | InsertStmt
                               1065                 :             | ListenStmt
                               1066                 :             | RefreshMatViewStmt
                               1067                 :             | LoadStmt
                               1068                 :             | LockStmt
                               1069                 :             | MergeStmt
                               1070                 :             | NotifyStmt
                               1071                 :             | PrepareStmt
                               1072                 :             | ReassignOwnedStmt
                               1073                 :             | ReindexStmt
                               1074                 :             | RemoveAggrStmt
                               1075                 :             | RemoveFuncStmt
                               1076                 :             | RemoveOperStmt
                               1077                 :             | RenameStmt
                               1078                 :             | RevokeStmt
                               1079                 :             | RevokeRoleStmt
                               1080                 :             | RuleStmt
                               1081                 :             | SecLabelStmt
                               1082                 :             | SelectStmt
                               1083                 :             | TransactionStmt
                               1084                 :             | TruncateStmt
                               1085                 :             | UnlistenStmt
                               1086                 :             | UpdateStmt
                               1087                 :             | VacuumStmt
                               1088                 :             | VariableResetStmt
                               1089                 :             | VariableSetStmt
                               1090                 :             | VariableShowStmt
                               1091                 :             | ViewStmt
                               1092                 :             | /*EMPTY*/
 7032 neilc                    1093 GIC      406577 :                 { $$ = NULL; }
                               1094                 :         ;
                               1095                 : 
                               1096                 : /*
                               1097                 :  * Generic supporting productions for DDL
                               1098                 :  */
                               1099                 : opt_single_name:
  261 alvherre                 1100 GNC        2360 :             ColId                           { $$ = $1; }
                               1101             525 :             | /* EMPTY */                   { $$ = NULL; }
                               1102                 :         ;
                               1103                 : 
                               1104                 : opt_qualified_name:
                               1105             802 :             any_name                        { $$ = $1; }
                               1106            6459 :             | /*EMPTY*/                     { $$ = NIL; }
                               1107                 :         ;
                               1108                 : 
                               1109                 : opt_concurrently:
                               1110             447 :             CONCURRENTLY                    { $$ = true; }
                               1111            3206 :             | /*EMPTY*/                     { $$ = false; }
                               1112                 :         ;
                               1113                 : 
                               1114                 : opt_drop_behavior:
                               1115             864 :             CASCADE                         { $$ = DROP_CASCADE; }
                               1116              86 :             | RESTRICT                      { $$ = DROP_RESTRICT; }
                               1117           36494 :             | /* EMPTY */                   { $$ = DROP_RESTRICT; /* default */ }
                               1118                 :         ;
                               1119                 : 
                               1120                 : /*****************************************************************************
                               1121                 :  *
                               1122                 :  * CALL statement
                               1123                 :  *
                               1124                 :  *****************************************************************************/
                               1125                 : 
                               1126                 : CallStmt:   CALL func_application
                               1127                 :                 {
  331 peter                    1128 GIC         249 :                     CallStmt   *n = makeNode(CallStmt);
                               1129                 : 
 1956 peter_e                  1130             249 :                     n->funccall = castNode(FuncCall, $2);
  331 peter                    1131             249 :                     $$ = (Node *) n;
                               1132                 :                 }
                               1133                 :         ;
                               1134                 : 
                               1135                 : /*****************************************************************************
                               1136                 :  *
                               1137                 :  * Create a new Postgres DBMS role
                               1138                 :  *
                               1139                 :  *****************************************************************************/
                               1140                 : 
                               1141                 : CreateRoleStmt:
                               1142                 :             CREATE ROLE RoleId opt_with OptRoleList
                               1143                 :                 {
 6494 tgl                      1144             574 :                     CreateRoleStmt *n = makeNode(CreateRoleStmt);
  331 peter                    1145 ECB             : 
 6466 tgl                      1146 GIC         574 :                     n->stmt_type = ROLESTMT_ROLE;
 6494                          1147             574 :                     n->role = $3;
 7943                          1148             574 :                     n->options = $5;
  331 peter                    1149             574 :                     $$ = (Node *) n;
                               1150                 :                 }
                               1151                 :         ;
 7601 bruce                    1152 ECB             : 
                               1153                 : 
                               1154                 : opt_with:   WITH
                               1155                 :             | WITH_LA
                               1156                 :             | /*EMPTY*/
 9245 lockhart                 1157                 :         ;
 9257 scrappy                  1158                 : 
                               1159                 : /*
                               1160                 :  * Options for CREATE ROLE and ALTER ROLE (also used by CREATE/ALTER USER
                               1161                 :  * for backwards compatibility).  Note: the only option required by SQL99
 6494 tgl                      1162                 :  * is "WITH ADMIN name".
                               1163                 :  */
                               1164                 : OptRoleList:
 4932 alvherre                 1165 GIC         518 :             OptRoleList CreateOptRoleElem           { $$ = lappend($1, $2); }
 6494 tgl                      1166             799 :             | /* EMPTY */                           { $$ = NIL; }
 6494 tgl                      1167 ECB             :         ;
                               1168                 : 
 4932 alvherre                 1169                 : AlterOptRoleList:
 4932 alvherre                 1170 GIC         260 :             AlterOptRoleList AlterOptRoleElem       { $$ = lappend($1, $2); }
                               1171             182 :             | /* EMPTY */                           { $$ = NIL; }
                               1172                 :         ;
                               1173                 : 
                               1174                 : AlterOptRoleElem:
                               1175                 :             PASSWORD Sconst
                               1176                 :                 {
 6494 tgl                      1177              79 :                     $$ = makeDefElem("password",
  331 peter                    1178              79 :                                      (Node *) makeString($2), @1);
                               1179                 :                 }
 6316 peter_e                  1180 ECB             :             | PASSWORD NULL_P
                               1181                 :                 {
 2406 peter_e                  1182 CBC           6 :                     $$ = makeDefElem("password", NULL, @1);
 6316 peter_e                  1183 ECB             :                 }
                               1184                 :             | ENCRYPTED PASSWORD Sconst
                               1185                 :                 {
                               1186                 :                     /*
                               1187                 :                      * These days, passwords are always stored in encrypted
                               1188                 :                      * form, so there is no difference between PASSWORD and
                               1189                 :                      * ENCRYPTED PASSWORD.
                               1190                 :                      */
 2162 heikki.linnakangas       1191 GIC           5 :                     $$ = makeDefElem("password",
  331 peter                    1192               5 :                                      (Node *) makeString($3), @1);
                               1193                 :                 }
                               1194                 :             | UNENCRYPTED PASSWORD Sconst
                               1195                 :                 {
 2162 heikki.linnakangas       1196 LBC           0 :                     ereport(ERROR,
                               1197                 :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 2162 heikki.linnakangas       1198 ECB             :                              errmsg("UNENCRYPTED PASSWORD is no longer supported"),
                               1199                 :                              errhint("Remove UNENCRYPTED to store the password in encrypted form instead."),
                               1200                 :                              parser_errposition(@1)));
 6494 tgl                      1201                 :                 }
                               1202                 :             | INHERIT
                               1203                 :                 {
  331 peter                    1204 GIC          36 :                     $$ = makeDefElem("inherit", (Node *) makeBoolean(true), @1);
                               1205                 :                 }
                               1206                 :             | CONNECTION LIMIT SignedIconst
                               1207                 :                 {
                               1208              12 :                     $$ = makeDefElem("connectionlimit", (Node *) makeInteger($3), @1);
                               1209                 :                 }
                               1210                 :             | VALID UNTIL Sconst
                               1211                 :                 {
                               1212               1 :                     $$ = makeDefElem("validUntil", (Node *) makeString($3), @1);
                               1213                 :                 }
                               1214                 :         /*  Supported but not documented for roles, for use by ALTER GROUP. */
                               1215                 :             | USER role_list
                               1216                 :                 {
  331 peter                    1217 CBC           3 :                     $$ = makeDefElem("rolemembers", (Node *) $2, @1);
 6494 tgl                      1218 ECB             :                 }
                               1219                 :             | IDENT
                               1220                 :                 {
                               1221                 :                     /*
 4408 rhaas                    1222                 :                      * We handle identifiers that aren't parser keywords with
                               1223                 :                      * the following special-case codes, to avoid bloating the
                               1224                 :                      * size of the main parser.
                               1225                 :                      */
 4408 rhaas                    1226 GIC         568 :                     if (strcmp($1, "superuser") == 0)
  331 peter                    1227              78 :                         $$ = makeDefElem("superuser", (Node *) makeBoolean(true), @1);
 4408 rhaas                    1228             490 :                     else if (strcmp($1, "nosuperuser") == 0)
  331 peter                    1229 CBC          43 :                         $$ = makeDefElem("superuser", (Node *) makeBoolean(false), @1);
 4408 rhaas                    1230             447 :                     else if (strcmp($1, "createrole") == 0)
  331 peter                    1231 GIC          44 :                         $$ = makeDefElem("createrole", (Node *) makeBoolean(true), @1);
 4408 rhaas                    1232             403 :                     else if (strcmp($1, "nocreaterole") == 0)
  331 peter                    1233              14 :                         $$ = makeDefElem("createrole", (Node *) makeBoolean(false), @1);
 4408 rhaas                    1234 CBC         389 :                     else if (strcmp($1, "replication") == 0)
  331 peter                    1235 GIC          55 :                         $$ = makeDefElem("isreplication", (Node *) makeBoolean(true), @1);
 4408 rhaas                    1236             334 :                     else if (strcmp($1, "noreplication") == 0)
  331 peter                    1237              43 :                         $$ = makeDefElem("isreplication", (Node *) makeBoolean(false), @1);
 4408 rhaas                    1238             291 :                     else if (strcmp($1, "createdb") == 0)
  331 peter                    1239              39 :                         $$ = makeDefElem("createdb", (Node *) makeBoolean(true), @1);
 4408 rhaas                    1240             252 :                     else if (strcmp($1, "nocreatedb") == 0)
  331 peter                    1241              18 :                         $$ = makeDefElem("createdb", (Node *) makeBoolean(false), @1);
 4408 rhaas                    1242             234 :                     else if (strcmp($1, "login") == 0)
  331 peter                    1243 CBC         111 :                         $$ = makeDefElem("canlogin", (Node *) makeBoolean(true), @1);
 4408 rhaas                    1244             123 :                     else if (strcmp($1, "nologin") == 0)
  331 peter                    1245 GIC          42 :                         $$ = makeDefElem("canlogin", (Node *) makeBoolean(false), @1);
 3124 sfrost                   1246              81 :                     else if (strcmp($1, "bypassrls") == 0)
  331 peter                    1247              34 :                         $$ = makeDefElem("bypassrls", (Node *) makeBoolean(true), @1);
 3124 sfrost                   1248 GBC          47 :                     else if (strcmp($1, "nobypassrls") == 0)
  331 peter                    1249 GIC          29 :                         $$ = makeDefElem("bypassrls", (Node *) makeBoolean(false), @1);
 4408 rhaas                    1250              18 :                     else if (strcmp($1, "noinherit") == 0)
                               1251                 :                     {
                               1252                 :                         /*
                               1253                 :                          * Note that INHERIT is a keyword, so it's handled by main parser, but
                               1254                 :                          * NOINHERIT is handled here.
                               1255                 :                          */
  331 peter                    1256 CBC          18 :                         $$ = makeDefElem("inherit", (Node *) makeBoolean(false), @1);
                               1257                 :                     }
                               1258                 :                     else
 4408 rhaas                    1259 UIC           0 :                         ereport(ERROR,
 4408 rhaas                    1260 ECB             :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               1261                 :                                  errmsg("unrecognized role option \"%s\"", $1),
                               1262                 :                                      parser_errposition(@1)));
                               1263                 :                 }
 4932 alvherre                 1264                 :         ;
                               1265                 : 
                               1266                 : CreateOptRoleElem:
 4932 alvherre                 1267 GIC         450 :             AlterOptRoleElem            { $$ = $1; }
                               1268                 :             /* The following are not supported by ALTER ROLE/USER/GROUP */
 6407 bruce                    1269 ECB             :             | SYSID Iconst
                               1270                 :                 {
  331 peter                    1271 GIC           3 :                     $$ = makeDefElem("sysid", (Node *) makeInteger($2), @1);
                               1272                 :                 }
                               1273                 :             | ADMIN role_list
                               1274                 :                 {
                               1275              10 :                     $$ = makeDefElem("adminmembers", (Node *) $2, @1);
                               1276                 :                 }
                               1277                 :             | ROLE role_list
 6494 tgl                      1278 ECB             :                 {
  331 peter                    1279 CBC           7 :                     $$ = makeDefElem("rolemembers", (Node *) $2, @1);
 6494 tgl                      1280 ECB             :                 }
 3365 sfrost                   1281                 :             | IN_P ROLE role_list
 6494 tgl                      1282                 :                 {
  331 peter                    1283 CBC          48 :                     $$ = makeDefElem("addroleto", (Node *) $3, @1);
 6407 bruce                    1284 ECB             :                 }
 3365 sfrost                   1285                 :             | IN_P GROUP_P role_list
 6407 bruce                    1286                 :                 {
  331 peter                    1287 LBC           0 :                     $$ = makeDefElem("addroleto", (Node *) $3, @1);
 6494 tgl                      1288 ECB             :                 }
                               1289                 :         ;
                               1290                 : 
                               1291                 : 
                               1292                 : /*****************************************************************************
                               1293                 :  *
                               1294                 :  * Create a new Postgres DBMS user (role with implied login ability)
                               1295                 :  *
                               1296                 :  *****************************************************************************/
                               1297                 : 
                               1298                 : CreateUserStmt:
                               1299                 :             CREATE USER RoleId opt_with OptRoleList
                               1300                 :                 {
 6494 tgl                      1301 CBC         213 :                     CreateRoleStmt *n = makeNode(CreateRoleStmt);
  331 peter                    1302 ECB             : 
 6466 tgl                      1303 GIC         213 :                     n->stmt_type = ROLESTMT_USER;
 6494                          1304             213 :                     n->role = $3;
 6466                          1305             213 :                     n->options = $5;
  331 peter                    1306             213 :                     $$ = (Node *) n;
                               1307                 :                 }
 6494 tgl                      1308 ECB             :         ;
                               1309                 : 
                               1310                 : 
 6494 tgl                      1311 EUB             : /*****************************************************************************
                               1312                 :  *
                               1313                 :  * Alter a postgresql DBMS role
                               1314                 :  *
                               1315                 :  *****************************************************************************/
                               1316                 : 
                               1317                 : AlterRoleStmt:
                               1318                 :             ALTER ROLE RoleSpec opt_with AlterOptRoleList
 6494 tgl                      1319 ECB             :                  {
 6494 tgl                      1320 GIC         142 :                     AlterRoleStmt *n = makeNode(AlterRoleStmt);
                               1321                 : 
                               1322             142 :                     n->role = $3;
 6466 tgl                      1323 CBC         142 :                     n->action = +1;  /* add, if there are members */
 6494 tgl                      1324 GIC         142 :                     n->options = $5;
  331 peter                    1325             142 :                     $$ = (Node *) n;
                               1326                 :                  }
 2078 peter_e                  1327 ECB             :             | ALTER USER RoleSpec opt_with AlterOptRoleList
                               1328                 :                  {
 2078 peter_e                  1329 GIC          40 :                     AlterRoleStmt *n = makeNode(AlterRoleStmt);
                               1330                 : 
 2078 peter_e                  1331 CBC          40 :                     n->role = $3;
 2078 peter_e                  1332 GIC          40 :                     n->action = +1;  /* add, if there are members */
                               1333              40 :                     n->options = $5;
  331 peter                    1334              40 :                     $$ = (Node *) n;
 2078 peter_e                  1335 ECB             :                  }
                               1336                 :         ;
                               1337                 : 
                               1338                 : opt_in_database:
 4932 alvherre                 1339 GBC          48 :                /* EMPTY */                  { $$ = NULL; }
 1033 peter                    1340 UIC           0 :             | IN_P DATABASE name    { $$ = $3; }
                               1341                 :         ;
                               1342                 : 
                               1343                 : AlterRoleSetStmt:
                               1344                 :             ALTER ROLE RoleSpec opt_in_database SetResetClause
                               1345                 :                 {
 6494 tgl                      1346 GIC          29 :                     AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
                               1347                 : 
                               1348              29 :                     n->role = $3;
 4932 alvherre                 1349              29 :                     n->database = $4;
                               1350              29 :                     n->setstmt = $5;
  331 peter                    1351              29 :                     $$ = (Node *) n;
                               1352                 :                 }
 3703 peter_e                  1353 ECB             :             | ALTER ROLE ALL opt_in_database SetResetClause
                               1354                 :                 {
 3703 peter_e                  1355 CBC           2 :                     AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
  331 peter                    1356 ECB             : 
 3703 peter_e                  1357 CBC           2 :                     n->role = NULL;
                               1358               2 :                     n->database = $4;
 3703 peter_e                  1359 GIC           2 :                     n->setstmt = $5;
  331 peter                    1360               2 :                     $$ = (Node *) n;
                               1361                 :                 }
                               1362                 :             | ALTER USER RoleSpec opt_in_database SetResetClause
                               1363                 :                 {
 2078 peter_e                  1364              13 :                     AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
                               1365                 : 
 6494 tgl                      1366              13 :                     n->role = $3;
 2078 peter_e                  1367              13 :                     n->database = $4;
                               1368              13 :                     n->setstmt = $5;
  331 peter                    1369              13 :                     $$ = (Node *) n;
                               1370                 :                 }
                               1371                 :             | ALTER USER ALL opt_in_database SetResetClause
 7709 peter_e                  1372 ECB             :                 {
 6494 tgl                      1373 GIC           2 :                     AlterRoleSetStmt *n = makeNode(AlterRoleSetStmt);
  331 peter                    1374 ECB             : 
 2078 peter_e                  1375 CBC           2 :                     n->role = NULL;
                               1376               2 :                     n->database = $4;
                               1377               2 :                     n->setstmt = $5;
  331 peter                    1378 GIC           2 :                     $$ = (Node *) n;
                               1379                 :                 }
                               1380                 :         ;
 7709 peter_e                  1381 ECB             : 
                               1382                 : 
 6494 tgl                      1383                 : /*****************************************************************************
                               1384                 :  *
                               1385                 :  * Drop a postgresql DBMS role
                               1386                 :  *
                               1387                 :  * XXX Ideally this would have CASCADE/RESTRICT options, but a role
                               1388                 :  * might own objects in multiple databases, and there is presently no way to
                               1389                 :  * implement cascading to other databases.  So we always behave as RESTRICT.
                               1390                 :  *****************************************************************************/
                               1391                 : 
 6494 tgl                      1392 EUB             : DropRoleStmt:
                               1393                 :             DROP ROLE role_list
                               1394                 :                 {
 6494 tgl                      1395 GIC         496 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
                               1396                 : 
 2062 peter_e                  1397             496 :                     n->missing_ok = false;
 6494 tgl                      1398 CBC         496 :                     n->roles = $3;
  331 peter                    1399 GIC         496 :                     $$ = (Node *) n;
 6494 tgl                      1400 ECB             :                 }
 3365 sfrost                   1401                 :             | DROP ROLE IF_P EXISTS role_list
 6273 andrew                   1402                 :                 {
 6273 andrew                   1403 CBC          67 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
                               1404                 : 
 2062 peter_e                  1405 GIC          67 :                     n->missing_ok = true;
 6273 andrew                   1406              67 :                     n->roles = $5;
  331 peter                    1407 CBC          67 :                     $$ = (Node *) n;
                               1408                 :                 }
 2078 peter_e                  1409 ECB             :             | DROP USER role_list
 9245 lockhart                 1410                 :                 {
 6494 tgl                      1411 CBC         195 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
  331 peter                    1412 ECB             : 
 2062 peter_e                  1413 GIC         195 :                     n->missing_ok = false;
 6494 tgl                      1414             195 :                     n->roles = $3;
  331 peter                    1415             195 :                     $$ = (Node *) n;
 9245 lockhart                 1416 ECB             :                 }
                               1417                 :             | DROP USER IF_P EXISTS role_list
 6273 andrew                   1418                 :                 {
 6273 andrew                   1419 CBC          18 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
  331 peter                    1420 ECB             : 
 6273 andrew                   1421 CBC          18 :                     n->roles = $5;
 2062 peter_e                  1422 GIC          18 :                     n->missing_ok = true;
  331 peter                    1423              18 :                     $$ = (Node *) n;
                               1424                 :                 }
 2078 peter_e                  1425 ECB             :             | DROP GROUP_P role_list
                               1426                 :                 {
 2078 peter_e                  1427 CBC          18 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
  331 peter                    1428 ECB             : 
 2062 peter_e                  1429 CBC          18 :                     n->missing_ok = false;
 2078                          1430              18 :                     n->roles = $3;
  331 peter                    1431 GIC          18 :                     $$ = (Node *) n;
                               1432                 :                 }
                               1433                 :             | DROP GROUP_P IF_P EXISTS role_list
                               1434                 :                 {
 2078 peter_e                  1435               3 :                     DropRoleStmt *n = makeNode(DropRoleStmt);
                               1436                 : 
 2062                          1437               3 :                     n->missing_ok = true;
 2078                          1438               3 :                     n->roles = $5;
  331 peter                    1439               3 :                     $$ = (Node *) n;
                               1440                 :                 }
                               1441                 :             ;
                               1442                 : 
                               1443                 : 
                               1444                 : /*****************************************************************************
                               1445                 :  *
                               1446                 :  * Create a postgresql group (role without login ability)
 8515 bruce                    1447 ECB             :  *
                               1448                 :  *****************************************************************************/
                               1449                 : 
 7601                          1450                 : CreateGroupStmt:
 6494 tgl                      1451                 :             CREATE GROUP_P RoleId opt_with OptRoleList
                               1452                 :                 {
 6494 tgl                      1453 GIC          12 :                     CreateRoleStmt *n = makeNode(CreateRoleStmt);
                               1454                 : 
 6466 tgl                      1455 CBC          12 :                     n->stmt_type = ROLESTMT_GROUP;
 6494 tgl                      1456 GIC          12 :                     n->role = $3;
 7941 tgl                      1457 CBC          12 :                     n->options = $5;
  331 peter                    1458              12 :                     $$ = (Node *) n;
 7658 lockhart                 1459 ECB             :                 }
                               1460                 :         ;
                               1461                 : 
                               1462                 : 
 8515 bruce                    1463                 : /*****************************************************************************
                               1464                 :  *
 8454 lockhart                 1465                 :  * Alter a postgresql group
 8515 bruce                    1466                 :  *
                               1467                 :  *****************************************************************************/
                               1468                 : 
                               1469                 : AlterGroupStmt:
                               1470                 :             ALTER GROUP_P RoleSpec add_drop USER role_list
 8454 lockhart                 1471                 :                 {
 6494 tgl                      1472 GIC          15 :                     AlterRoleStmt *n = makeNode(AlterRoleStmt);
  331 peter                    1473 ECB             : 
 6494 tgl                      1474 CBC          15 :                     n->role = $3;
 7601 bruce                    1475              15 :                     n->action = $4;
 6494 tgl                      1476 GIC          15 :                     n->options = list_make1(makeDefElem("rolemembers",
                               1477                 :                                                         (Node *) $6, @6));
  331 peter                    1478              15 :                     $$ = (Node *) n;
 8454 lockhart                 1479 ECB             :                 }
                               1480                 :         ;
 8515 bruce                    1481                 : 
 5920 tgl                      1482 CBC          38 : add_drop:   ADD_P                                   { $$ = +1; }
 6494                          1483              64 :             | DROP                                  { $$ = -1; }
                               1484                 :         ;
                               1485                 : 
                               1486                 : 
 8304 lockhart                 1487 ECB             : /*****************************************************************************
                               1488                 :  *
                               1489                 :  * Manipulate a schema
                               1490                 :  *
                               1491                 :  *****************************************************************************/
                               1492                 : 
                               1493                 : CreateSchemaStmt:
                               1494                 :             CREATE SCHEMA opt_single_name AUTHORIZATION RoleSpec OptSchemaEltList
                               1495                 :                 {
 7689 tgl                      1496 GIC          25 :                     CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
                               1497                 : 
                               1498                 :                     /* One can omit the schema name or the authorization id. */
 2953 alvherre                 1499              25 :                     n->schemaname = $3;
                               1500              25 :                     n->authrole = $5;
 6729 tgl                      1501              25 :                     n->schemaElts = $6;
 3840                          1502              25 :                     n->if_not_exists = false;
  331 peter                    1503              25 :                     $$ = (Node *) n;
                               1504                 :                 }
 6729 tgl                      1505 ECB             :             | CREATE SCHEMA ColId OptSchemaEltList
                               1506                 :                 {
 7689 tgl                      1507 CBC         626 :                     CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
  331 peter                    1508 ECB             : 
 7689 tgl                      1509                 :                     /* ...but not both */
 7689 tgl                      1510 CBC         626 :                     n->schemaname = $3;
 2953 alvherre                 1511 GIC         626 :                     n->authrole = NULL;
 6729 tgl                      1512             626 :                     n->schemaElts = $4;
 3840                          1513             626 :                     n->if_not_exists = false;
  331 peter                    1514             626 :                     $$ = (Node *) n;
                               1515                 :                 }
                               1516                 :             | CREATE SCHEMA IF_P NOT EXISTS opt_single_name AUTHORIZATION RoleSpec OptSchemaEltList
                               1517                 :                 {
 3840 tgl                      1518               9 :                     CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
                               1519                 : 
                               1520                 :                     /* schema name can be omitted here, too */
 2953 alvherre                 1521               9 :                     n->schemaname = $6;
                               1522               9 :                     n->authrole = $8;
 3840 tgl                      1523               9 :                     if ($9 != NIL)
 3840 tgl                      1524 LBC           0 :                         ereport(ERROR,
                               1525                 :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 3840 tgl                      1526 ECB             :                                  errmsg("CREATE SCHEMA IF NOT EXISTS cannot include schema elements"),
                               1527                 :                                  parser_errposition(@9)));
 3840 tgl                      1528 CBC           9 :                     n->schemaElts = $9;
 3840 tgl                      1529 GIC           9 :                     n->if_not_exists = true;
  331 peter                    1530 CBC           9 :                     $$ = (Node *) n;
                               1531                 :                 }
                               1532                 :             | CREATE SCHEMA IF_P NOT EXISTS ColId OptSchemaEltList
                               1533                 :                 {
 3840 tgl                      1534              17 :                     CreateSchemaStmt *n = makeNode(CreateSchemaStmt);
  331 peter                    1535 ECB             : 
                               1536                 :                     /* ...but not here */
 3840 tgl                      1537 GIC          17 :                     n->schemaname = $6;
 2953 alvherre                 1538              17 :                     n->authrole = NULL;
 3840 tgl                      1539              17 :                     if ($7 != NIL)
                               1540               3 :                         ereport(ERROR,
                               1541                 :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               1542                 :                                  errmsg("CREATE SCHEMA IF NOT EXISTS cannot include schema elements"),
                               1543                 :                                  parser_errposition(@7)));
                               1544              14 :                     n->schemaElts = $7;
                               1545              14 :                     n->if_not_exists = true;
  331 peter                    1546              14 :                     $$ = (Node *) n;
                               1547                 :                 }
 8304 lockhart                 1548 ECB             :         ;
                               1549                 : 
 7601 bruce                    1550                 : OptSchemaEltList:
                               1551                 :             OptSchemaEltList schema_stmt
                               1552                 :                 {
 3839 tgl                      1553 GIC         178 :                     if (@$ < 0)          /* see comments for YYLLOC_DEFAULT */
 3839 tgl                      1554 CBC          50 :                         @$ = @2;
 3839 tgl                      1555 GIC         178 :                     $$ = lappend($1, $2);
                               1556                 :                 }
 3839 tgl                      1557 ECB             :             | /* EMPTY */
 3839 tgl                      1558 CBC         677 :                 { $$ = NIL; }
 7689 tgl                      1559 ECB             :         ;
 8304 lockhart                 1560                 : 
 7689 tgl                      1561                 : /*
                               1562                 :  *  schema_stmt are the ones that can show up inside a CREATE SCHEMA
                               1563                 :  *  statement (in addition to by themselves).
                               1564                 :  */
 7601 bruce                    1565                 : schema_stmt:
                               1566                 :             CreateStmt
                               1567                 :             | IndexStmt
 7028 neilc                    1568                 :             | CreateSeqStmt
                               1569                 :             | CreateTrigStmt
 7601 bruce                    1570                 :             | GrantStmt
 7601 bruce                    1571 EUB             :             | ViewStmt
                               1572                 :         ;
                               1573                 : 
                               1574                 : 
 9503 scrappy                  1575 ECB             : /*****************************************************************************
 9351 lockhart                 1576                 :  *
 9503 scrappy                  1577                 :  * Set PG internal variable
                               1578                 :  *    SET name TO 'var_value'
                               1579                 :  * Include SQL syntax (thomas 1997-10-22):
                               1580                 :  *    SET TIME ZONE 'var_value'
 9351 lockhart                 1581                 :  *
                               1582                 :  *****************************************************************************/
                               1583                 : 
 7601 bruce                    1584                 : VariableSetStmt:
                               1585                 :             SET set_rest
 9344                          1586                 :                 {
 7632 tgl                      1587 CBC        8795 :                     VariableSetStmt *n = $2;
                               1588                 : 
 7632 tgl                      1589 GIC        8795 :                     n->is_local = false;
 9344 bruce                    1590            8795 :                     $$ = (Node *) n;
 9344 bruce                    1591 ECB             :                 }
 7601                          1592                 :             | SET LOCAL set_rest
 9344                          1593                 :                 {
 7632 tgl                      1594 GIC         496 :                     VariableSetStmt *n = $3;
                               1595                 : 
                               1596             496 :                     n->is_local = true;
 9344 bruce                    1597             496 :                     $$ = (Node *) n;
                               1598                 :                 }
                               1599                 :             | SET SESSION set_rest
 9344 bruce                    1600 ECB             :                 {
 7632 tgl                      1601 CBC          40 :                     VariableSetStmt *n = $3;
  331 peter                    1602 ECB             : 
 7632 tgl                      1603 GIC          40 :                     n->is_local = false;
 9344 bruce                    1604              40 :                     $$ = (Node *) n;
 9344 bruce                    1605 ECB             :                 }
                               1606                 :         ;
                               1607                 : 
                               1608                 : set_rest:
                               1609                 :             TRANSACTION transaction_mode_list
                               1610                 :                 {
 4071 rhaas                    1611 GIC         221 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1612                 : 
                               1613             221 :                     n->kind = VAR_SET_MULTI;
                               1614             221 :                     n->name = "TRANSACTION";
                               1615             221 :                     n->args = $2;
                               1616             221 :                     $$ = n;
                               1617                 :                 }
                               1618                 :             | SESSION CHARACTERISTICS AS TRANSACTION transaction_mode_list
                               1619                 :                 {
                               1620               6 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1621                 : 
                               1622               6 :                     n->kind = VAR_SET_MULTI;
                               1623               6 :                     n->name = "SESSION CHARACTERISTICS";
                               1624               6 :                     n->args = $5;
                               1625               6 :                     $$ = n;
                               1626                 :                 }
                               1627                 :             | set_rest_more
                               1628                 :             ;
                               1629                 : 
                               1630                 : generic_set:
                               1631                 :             var_name TO var_list
                               1632                 :                 {
 8878 vadim4o                  1633            2295 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
  331 peter                    1634 ECB             : 
 5697 tgl                      1635 GIC        2295 :                     n->kind = VAR_SET_VALUE;
 7632 tgl                      1636 CBC        2295 :                     n->name = $1;
                               1637            2295 :                     n->args = $3;
 7632 tgl                      1638 GIC        2295 :                     $$ = n;
                               1639                 :                 }
                               1640                 :             | var_name '=' var_list
 8171 peter_e                  1641 ECB             :                 {
 8171 peter_e                  1642 GIC        5717 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
  331 peter                    1643 ECB             : 
 5697 tgl                      1644 CBC        5717 :                     n->kind = VAR_SET_VALUE;
 7632 tgl                      1645 GIC        5717 :                     n->name = $1;
                               1646            5717 :                     n->args = $3;
                               1647            5717 :                     $$ = n;
 8171 peter_e                  1648 ECB             :                 }
                               1649                 :             | var_name TO var_list USER SET
                               1650                 :                 {
  121 akorotkov                1651 UNC           0 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1652                 : 
                               1653               0 :                     n->kind = VAR_SET_VALUE;
                               1654               0 :                     n->name = $1;
                               1655               0 :                     n->args = $3;
                               1656               0 :                     n->user_set = true;
                               1657               0 :                     $$ = n;
                               1658                 :                 }
                               1659                 :             | var_name '=' var_list USER SET
                               1660                 :                 {
  121 akorotkov                1661 GNC           3 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1662                 : 
                               1663               3 :                     n->kind = VAR_SET_VALUE;
                               1664               3 :                     n->name = $1;
                               1665               3 :                     n->args = $3;
                               1666               3 :                     n->user_set = true;
                               1667               3 :                     $$ = n;
                               1668                 :                 }
                               1669                 :             | var_name TO DEFAULT
 5697 tgl                      1670 ECB             :                 {
 5697 tgl                      1671 CBC          63 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1672                 : 
 5697 tgl                      1673 GIC          63 :                     n->kind = VAR_SET_DEFAULT;
                               1674              63 :                     n->name = $1;
                               1675              63 :                     $$ = n;
                               1676                 :                 }
                               1677                 :             | var_name '=' DEFAULT
 5697 tgl                      1678 ECB             :                 {
 5697 tgl                      1679 UIC           0 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
  331 peter                    1680 ECB             : 
 5697 tgl                      1681 LBC           0 :                     n->kind = VAR_SET_DEFAULT;
                               1682               0 :                     n->name = $1;
                               1683               0 :                     $$ = n;
                               1684                 :                 }
                               1685                 :         ;
                               1686                 : 
 3399 ishii                    1687 ECB             : set_rest_more:  /* Generic SET syntaxes: */
  879 peter                    1688 GIC        8027 :             generic_set                         {$$ = $1;}
 5697 tgl                      1689 ECB             :             | var_name FROM CURRENT_P
                               1690                 :                 {
 5697 tgl                      1691 LBC           0 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
  331 peter                    1692 ECB             : 
 5697 tgl                      1693 UIC           0 :                     n->kind = VAR_SET_CURRENT;
                               1694               0 :                     n->name = $1;
                               1695               0 :                     $$ = n;
                               1696                 :                 }
                               1697                 :             /* Special syntaxes mandated by SQL standard: */
                               1698                 :             | TIME ZONE zone_value
                               1699                 :                 {
 9025 scrappy                  1700 CBC          37 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1701                 : 
 5697 tgl                      1702              37 :                     n->kind = VAR_SET_VALUE;
 7632                          1703              37 :                     n->name = "timezone";
 7701 lockhart                 1704              37 :                     if ($3 != NULL)
 6888 neilc                    1705              31 :                         n->args = list_make1($3);
                               1706                 :                     else
 5697 tgl                      1707 GIC           6 :                         n->kind = VAR_SET_DEFAULT;
 7632                          1708              37 :                     $$ = n;
 9025 scrappy                  1709 ECB             :                 }
                               1710                 :             | CATALOG_P Sconst
 5277 peter_e                  1711                 :                 {
 5277 peter_e                  1712 LBC           0 :                     ereport(ERROR,
 5277 peter_e                  1713 ECB             :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               1714                 :                              errmsg("current database cannot be changed"),
                               1715                 :                              parser_errposition(@2)));
                               1716                 :                     $$ = NULL; /*not reached*/
                               1717                 :                 }
 5277 peter_e                  1718 EUB             :             | SCHEMA Sconst
                               1719                 :                 {
 5277 peter_e                  1720 UBC           0 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
  331 peter                    1721 EUB             : 
 5277 peter_e                  1722 UBC           0 :                     n->kind = VAR_SET_VALUE;
                               1723               0 :                     n->name = "search_path";
                               1724               0 :                     n->args = list_make1(makeStringConst($2, @2));
 5277 peter_e                  1725 UIC           0 :                     $$ = n;
                               1726                 :                 }
                               1727                 :             | NAMES opt_encoding
 7632 tgl                      1728 ECB             :                 {
 7632 tgl                      1729 UIC           0 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
  331 peter                    1730 ECB             : 
 5697 tgl                      1731 LBC           0 :                     n->kind = VAR_SET_VALUE;
 7632                          1732               0 :                     n->name = "client_encoding";
                               1733               0 :                     if ($2 != NULL)
 5337                          1734               0 :                         n->args = list_make1(makeStringConst($2, @2));
                               1735                 :                     else
 5697 tgl                      1736 UIC           0 :                         n->kind = VAR_SET_DEFAULT;
 7632                          1737               0 :                     $$ = n;
 8006 peter_e                  1738 ECB             :                 }
                               1739                 :             | ROLE NonReservedWord_or_Sconst
 6467 tgl                      1740                 :                 {
 6467 tgl                      1741 CBC         394 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
  331 peter                    1742 ECB             : 
 5697 tgl                      1743 GIC         394 :                     n->kind = VAR_SET_VALUE;
 6467                          1744             394 :                     n->name = "role";
 5337                          1745             394 :                     n->args = list_make1(makeStringConst($2, @2));
 6467 tgl                      1746 GBC         394 :                     $$ = n;
                               1747                 :                 }
 3598 tgl                      1748 EUB             :             | SESSION AUTHORIZATION NonReservedWord_or_Sconst
 7632                          1749                 :                 {
 7632 tgl                      1750 GBC        1215 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1751                 : 
 5697 tgl                      1752 GIC        1215 :                     n->kind = VAR_SET_VALUE;
 7632                          1753            1215 :                     n->name = "session_authorization";
 5337                          1754            1215 :                     n->args = list_make1(makeStringConst($3, @3));
 7632 tgl                      1755 CBC        1215 :                     $$ = n;
                               1756                 :                 }
                               1757                 :             | SESSION AUTHORIZATION DEFAULT
 7643 tgl                      1758 EUB             :                 {
 7643 tgl                      1759 GIC           2 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
  331 peter                    1760 EUB             : 
 5697 tgl                      1761 GBC           2 :                     n->kind = VAR_SET_DEFAULT;
 7643                          1762               2 :                     n->name = "session_authorization";
 7632 tgl                      1763 GIC           2 :                     $$ = n;
                               1764                 :                 }
                               1765                 :             | XML_P OPTION document_or_content
                               1766                 :                 {
 5918 peter_e                  1767 CBC           6 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1768                 : 
 5697 tgl                      1769               6 :                     n->kind = VAR_SET_VALUE;
 5918 peter_e                  1770               6 :                     n->name = "xmloption";
 5337 tgl                      1771               6 :                     n->args = list_make1(makeStringConst($3 == XMLOPTION_DOCUMENT ? "DOCUMENT" : "CONTENT", @3));
 5918 peter_e                  1772               6 :                     $$ = n;
                               1773                 :                 }
 4187 tgl                      1774 ECB             :             /* Special syntaxes invented by PostgreSQL: */
                               1775                 :             | TRANSACTION SNAPSHOT Sconst
                               1776                 :                 {
 4187 tgl                      1777 GIC          18 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1778                 : 
 4187 tgl                      1779 GBC          18 :                     n->kind = VAR_SET_MULTI;
 4187 tgl                      1780 GIC          18 :                     n->name = "TRANSACTION SNAPSHOT";
                               1781              18 :                     n->args = list_make1(makeStringConst($3, @3));
                               1782              18 :                     $$ = n;
                               1783                 :                 }
                               1784                 :         ;
                               1785                 : 
 5697                          1786            9887 : var_name:   ColId                               { $$ = $1; }
 6892 bruce                    1787 EUB             :             | var_name '.' ColId
 3465 peter_e                  1788 GIC         202 :                 { $$ = psprintf("%s.%s", $1, $3); }
 6892 bruce                    1789 EUB             :         ;
                               1790                 : 
 6888 neilc                    1791 GBC        8015 : var_list:   var_value                               { $$ = list_make1($1); }
 7601 bruce                    1792              70 :             | var_list ',' var_value                { $$ = lappend($1, $3); }
                               1793                 :         ;
                               1794                 : 
                               1795                 : var_value:  opt_boolean_or_string
 5337 tgl                      1796            6427 :                 { $$ = makeStringConst($1, @1); }
                               1797                 :             | NumericOnly
                               1798            1658 :                 { $$ = makeAConst($1, @1); }
 7658 lockhart                 1799 EUB             :         ;
 8348 peter_e                  1800                 : 
 7094 peter_e                  1801 UBC           0 : iso_level:  READ UNCOMMITTED                        { $$ = "read uncommitted"; }
 7094 peter_e                  1802 GIC         415 :             | READ COMMITTED                        { $$ = "read committed"; }
 7094 peter_e                  1803 GBC        1133 :             | REPEATABLE READ                       { $$ = "repeatable read"; }
 7601 bruce                    1804            1598 :             | SERIALIZABLE                          { $$ = "serializable"; }
                               1805                 :         ;
                               1806                 : 
                               1807                 : opt_boolean_or_string:
 7601 bruce                    1808 CBC         522 :             TRUE_P                                  { $$ = "true"; }
 7601 bruce                    1809 GIC         873 :             | FALSE_P                               { $$ = "false"; }
 7601 bruce                    1810 CBC         915 :             | ON                                    { $$ = "on"; }
 4552 heikki.linnakangas       1811 ECB             :             /*
 3598 tgl                      1812                 :              * OFF is also accepted as a boolean value, but is handled by
                               1813                 :              * the NonReservedWord rule.  The action for booleans and strings
                               1814                 :              * is the same, so we don't need to distinguish them here.
                               1815                 :              */
 3598 tgl                      1816 GIC       12292 :             | NonReservedWord_or_Sconst             { $$ = $1; }
 9344 bruce                    1817 ECB             :         ;
                               1818                 : 
 7843 lockhart                 1819                 : /* Timezone values can be:
                               1820                 :  * - a string such as 'pst8pdt'
 7632 tgl                      1821                 :  * - an identifier such as "pst8pdt"
 7843 lockhart                 1822                 :  * - an integer or floating point number
                               1823                 :  * - a time interval per SQL99
                               1824                 :  * ColId gives reduce/reduce errors against ConstInterval and LOCAL,
                               1825                 :  * so use IDENT (meaning we reject anything that is a key word).
                               1826                 :  */
                               1827                 : zone_value:
 7601 bruce                    1828                 :             Sconst
 7791 lockhart                 1829                 :                 {
 5337 tgl                      1830 CBC          18 :                     $$ = makeStringConst($1, @1);
                               1831                 :                 }
                               1832                 :             | IDENT
                               1833                 :                 {
                               1834               1 :                     $$ = makeStringConst($1, @1);
                               1835                 :                 }
 7601 bruce                    1836 ECB             :             | ConstInterval Sconst opt_interval
 7791 lockhart                 1837                 :                 {
  331 peter                    1838 LBC           0 :                     TypeName   *t = $1;
  331 peter                    1839 ECB             : 
 5323 tgl                      1840 UIC           0 :                     if ($3 != NIL)
                               1841                 :                     {
  331 peter                    1842               0 :                         A_Const    *n = (A_Const *) linitial($3);
                               1843                 : 
  450 peter                    1844 LBC           0 :                         if ((n->val.ival.ival & ~(INTERVAL_MASK(HOUR) | INTERVAL_MASK(MINUTE))) != 0)
 7204 tgl                      1845 UIC           0 :                             ereport(ERROR,
 7204 tgl                      1846 ECB             :                                     (errcode(ERRCODE_SYNTAX_ERROR),
 5333                          1847                 :                                      errmsg("time zone interval must be HOUR or HOUR TO MINUTE"),
 5018                          1848                 :                                      parser_errposition(@3)));
 7601 bruce                    1849                 :                     }
 5323 tgl                      1850 UIC           0 :                     t->typmods = $3;
 5337                          1851               0 :                     $$ = makeStringConstCast($2, @2, t);
                               1852                 :                 }
 3095 bruce                    1853 ECB             :             | ConstInterval '(' Iconst ')' Sconst
                               1854                 :                 {
  331 peter                    1855 LBC           0 :                     TypeName   *t = $1;
                               1856                 : 
 3095 bruce                    1857 UIC           0 :                     t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
 3095 bruce                    1858 ECB             :                                             makeIntConst($3, @3));
 5337 tgl                      1859 LBC           0 :                     $$ = makeStringConstCast($5, @5, t);
                               1860                 :                 }
 5337 tgl                      1861 GIC          12 :             | NumericOnly                           { $$ = makeAConst($1, @1); }
 7601 bruce                    1862               6 :             | DEFAULT                               { $$ = NULL; }
 7601 bruce                    1863 LBC           0 :             | LOCAL                                 { $$ = NULL; }
                               1864                 :         ;
 9351 lockhart                 1865 ECB             : 
                               1866                 : opt_encoding:
 7601 bruce                    1867 UIC           0 :             Sconst                                  { $$ = $1; }
 7601 bruce                    1868 UBC           0 :             | DEFAULT                               { $$ = NULL; }
 7601 bruce                    1869 LBC           0 :             | /*EMPTY*/                             { $$ = NULL; }
 7601 bruce                    1870 ECB             :         ;
 8487 peter_e                  1871                 : 
                               1872                 : NonReservedWord_or_Sconst:
 3598 tgl                      1873 GIC       47139 :             NonReservedWord                         { $$ = $1; }
 5261 meskes                   1874            2283 :             | Sconst                                { $$ = $1; }
 7689 tgl                      1875 ECB             :         ;
 8006 peter_e                  1876                 : 
 5697 tgl                      1877                 : VariableResetStmt:
 3141 fujii                    1878 GIC        1782 :             RESET reset_rest                        { $$ = (Node *) $2; }
                               1879                 :         ;
                               1880                 : 
                               1881                 : reset_rest:
                               1882            1417 :             generic_reset                           { $$ = $1; }
 3141 fujii                    1883 ECB             :             | TIME ZONE
                               1884                 :                 {
 5697 tgl                      1885 GIC           6 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1886                 : 
                               1887               6 :                     n->kind = VAR_RESET;
 3141 fujii                    1888               6 :                     n->name = "timezone";
                               1889               6 :                     $$ = n;
                               1890                 :                 }
                               1891                 :             | TRANSACTION ISOLATION LEVEL
                               1892                 :                 {
 5697 tgl                      1893 UIC           0 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1894                 : 
                               1895               0 :                     n->kind = VAR_RESET;
 3141 fujii                    1896               0 :                     n->name = "transaction_isolation";
 3141 fujii                    1897 LBC           0 :                     $$ = n;
                               1898                 :                 }
                               1899                 :             | SESSION AUTHORIZATION
                               1900                 :                 {
 5697 tgl                      1901 CBC         359 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1902                 : 
 5697 tgl                      1903 GIC         359 :                     n->kind = VAR_RESET;
 3141 fujii                    1904             359 :                     n->name = "session_authorization";
 3141 fujii                    1905 GBC         359 :                     $$ = n;
                               1906                 :                 }
 3141 fujii                    1907 EUB             :         ;
                               1908                 : 
                               1909                 : generic_reset:
                               1910                 :             var_name
 7632 tgl                      1911                 :                 {
 5697 tgl                      1912 GBC        1433 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1913                 : 
 5697 tgl                      1914 GIC        1433 :                     n->kind = VAR_RESET;
 3141 fujii                    1915            1433 :                     n->name = $1;
                               1916            1433 :                     $$ = n;
 7632 tgl                      1917 EUB             :                 }
 3141 fujii                    1918                 :             | ALL
                               1919                 :                 {
 5697 tgl                      1920 GIC           8 :                     VariableSetStmt *n = makeNode(VariableSetStmt);
                               1921                 : 
 5697 tgl                      1922 GBC           8 :                     n->kind = VAR_RESET_ALL;
 3141 fujii                    1923 GIC           8 :                     $$ = n;
 8878 vadim4o                  1924 EUB             :                 }
                               1925                 :         ;
 9344 bruce                    1926                 : 
                               1927                 : /* SetResetClause allows SET or RESET without LOCAL */
 5697 tgl                      1928 ECB             : SetResetClause:
 5697 tgl                      1929 CBC         548 :             SET set_rest                    { $$ = $2; }
 5697 tgl                      1930 GBC          14 :             | VariableResetStmt             { $$ = (VariableSetStmt *) $1; }
                               1931                 :         ;
                               1932                 : 
                               1933                 : /* SetResetClause allows SET or RESET without LOCAL */
 4071 rhaas                    1934 EUB             : FunctionSetResetClause:
 4071 rhaas                    1935 GBC          47 :             SET set_rest_more               { $$ = $2; }
                               1936               6 :             | VariableResetStmt             { $$ = (VariableSetStmt *) $1; }
                               1937                 :         ;
                               1938                 : 
                               1939                 : 
 5697 tgl                      1940 ECB             : VariableShowStmt:
                               1941                 :             SHOW var_name
                               1942                 :                 {
 5697 tgl                      1943 GIC         376 :                     VariableShowStmt *n = makeNode(VariableShowStmt);
                               1944                 : 
 7632 tgl                      1945 CBC         376 :                     n->name = $2;
 9344 bruce                    1946 GIC         376 :                     $$ = (Node *) n;
                               1947                 :                 }
                               1948                 :             | SHOW TIME ZONE
 9292 lockhart                 1949 ECB             :                 {
 5697 tgl                      1950 GIC           4 :                     VariableShowStmt *n = makeNode(VariableShowStmt);
                               1951                 : 
 7632 tgl                      1952 CBC           4 :                     n->name = "timezone";
 9292 lockhart                 1953 GIC           4 :                     $$ = (Node *) n;
 9292 lockhart                 1954 ECB             :                 }
 5697 tgl                      1955                 :             | SHOW TRANSACTION ISOLATION LEVEL
 8878 vadim4o                  1956                 :                 {
 5697 tgl                      1957 GIC           1 :                     VariableShowStmt *n = makeNode(VariableShowStmt);
                               1958                 : 
 7394 peter_e                  1959               1 :                     n->name = "transaction_isolation";
 8878 vadim4o                  1960 GBC           1 :                     $$ = (Node *) n;
                               1961                 :                 }
 5697 tgl                      1962 EUB             :             | SHOW SESSION AUTHORIZATION
 7643                          1963                 :                 {
 5697 tgl                      1964 UBC           0 :                     VariableShowStmt *n = makeNode(VariableShowStmt);
                               1965                 : 
 7643 tgl                      1966 UIC           0 :                     n->name = "session_authorization";
                               1967               0 :                     $$ = (Node *) n;
 7643 tgl                      1968 ECB             :                 }
                               1969                 :             | SHOW ALL
 7976 bruce                    1970                 :                 {
 5697 tgl                      1971 LBC           0 :                     VariableShowStmt *n = makeNode(VariableShowStmt);
  331 peter                    1972 ECB             : 
 7632 tgl                      1973 UIC           0 :                     n->name = "all";
 7976 bruce                    1974               0 :                     $$ = (Node *) n;
                               1975                 :                 }
                               1976                 :         ;
                               1977                 : 
                               1978                 : 
 7601 bruce                    1979 ECB             : ConstraintsSetStmt:
                               1980                 :             SET CONSTRAINTS constraints_set_list constraints_set_mode
 8593 JanWieck                 1981                 :                 {
 8593 JanWieck                 1982 CBC          52 :                     ConstraintsSetStmt *n = makeNode(ConstraintsSetStmt);
  331 peter                    1983 ECB             : 
 8593 JanWieck                 1984 GIC          52 :                     n->constraints = $3;
 4177 peter_e                  1985              52 :                     n->deferred = $4;
 8593 JanWieck                 1986              52 :                     $$ = (Node *) n;
 8593 JanWieck                 1987 ECB             :                 }
                               1988                 :         ;
                               1989                 : 
 7601 bruce                    1990                 : constraints_set_list:
 7601 bruce                    1991 GIC          28 :             ALL                                     { $$ = NIL; }
 6191                          1992              24 :             | qualified_name_list                   { $$ = $1; }
                               1993                 :         ;
                               1994                 : 
                               1995                 : constraints_set_mode:
 2062 peter_e                  1996 CBC          34 :             DEFERRED                                { $$ = true; }
                               1997              18 :             | IMMEDIATE                             { $$ = false; }
                               1998                 :         ;
                               1999                 : 
                               2000                 : 
                               2001                 : /*
 8190 vadim4o                  2002 ECB             :  * Checkpoint statement
                               2003                 :  */
                               2004                 : CheckPointStmt:
                               2005                 :             CHECKPOINT
                               2006                 :                 {
 8190 vadim4o                  2007 GIC          77 :                     CheckPointStmt *n = makeNode(CheckPointStmt);
                               2008                 : 
  331 peter                    2009              77 :                     $$ = (Node *) n;
 8190 vadim4o                  2010 ECB             :                 }
                               2011                 :         ;
 7601 bruce                    2012                 : 
 8190 vadim4o                  2013                 : 
                               2014                 : /*****************************************************************************
                               2015                 :  *
                               2016                 :  * DISCARD { ALL | TEMP | PLANS | SEQUENCES }
 5827 neilc                    2017                 :  *
                               2018                 :  *****************************************************************************/
                               2019                 : 
                               2020                 : DiscardStmt:
                               2021                 :             DISCARD ALL
                               2022                 :                 {
 5827 neilc                    2023 GIC           3 :                     DiscardStmt *n = makeNode(DiscardStmt);
  331 peter                    2024 ECB             : 
 5827 neilc                    2025 GIC           3 :                     n->target = DISCARD_ALL;
 5827 neilc                    2026 CBC           3 :                     $$ = (Node *) n;
 5827 neilc                    2027 ECB             :                 }
                               2028                 :             | DISCARD TEMP
                               2029                 :                 {
 5827 neilc                    2030 GIC           4 :                     DiscardStmt *n = makeNode(DiscardStmt);
  331 peter                    2031 EUB             : 
 5827 neilc                    2032 GIC           4 :                     n->target = DISCARD_TEMP;
 5827 neilc                    2033 GBC           4 :                     $$ = (Node *) n;
 5827 neilc                    2034 EUB             :                 }
                               2035                 :             | DISCARD TEMPORARY
                               2036                 :                 {
 5827 neilc                    2037 UIC           0 :                     DiscardStmt *n = makeNode(DiscardStmt);
  331 peter                    2038 EUB             : 
 5827 neilc                    2039 UIC           0 :                     n->target = DISCARD_TEMP;
 5827 neilc                    2040 UBC           0 :                     $$ = (Node *) n;
 5827 neilc                    2041 EUB             :                 }
                               2042                 :             | DISCARD PLANS
                               2043                 :                 {
 5827 neilc                    2044 GIC           2 :                     DiscardStmt *n = makeNode(DiscardStmt);
                               2045                 : 
                               2046               2 :                     n->target = DISCARD_PLANS;
                               2047               2 :                     $$ = (Node *) n;
                               2048                 :                 }
 3475 rhaas                    2049 ECB             :             | DISCARD SEQUENCES
                               2050                 :                 {
 3475 rhaas                    2051 CBC           6 :                     DiscardStmt *n = makeNode(DiscardStmt);
  331 peter                    2052 ECB             : 
 3475 rhaas                    2053 CBC           6 :                     n->target = DISCARD_SEQUENCES;
 3475 rhaas                    2054 GIC           6 :                     $$ = (Node *) n;
                               2055                 :                 }
                               2056                 : 
                               2057                 :         ;
 5827 neilc                    2058 ECB             : 
                               2059                 : 
                               2060                 : /*****************************************************************************
                               2061                 :  *
                               2062                 :  *  ALTER [ TABLE | INDEX | SEQUENCE | VIEW | MATERIALIZED VIEW | FOREIGN TABLE ] variations
 9770 scrappy                  2063                 :  *
 1032 peter                    2064                 :  * Note: we accept all subcommands for each of the variants, and sort
                               2065                 :  * out what's really legal at execution time.
                               2066                 :  *****************************************************************************/
                               2067                 : 
                               2068                 : AlterTableStmt:
                               2069                 :             ALTER TABLE relation_expr alter_table_cmds
                               2070                 :                 {
 8454 lockhart                 2071 GIC       39413 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2072                 : 
 7689 tgl                      2073           39413 :                     n->relation = $3;
 6913 tgl                      2074 CBC       39413 :                     n->cmds = $4;
 1002 michael                  2075 GIC       39413 :                     n->objtype = OBJECT_TABLE;
 4094 simon                    2076 CBC       39413 :                     n->missing_ok = false;
  331 peter                    2077 GIC       39413 :                     $$ = (Node *) n;
                               2078                 :                 }
                               2079                 :         |   ALTER TABLE IF_P EXISTS relation_expr alter_table_cmds
                               2080                 :                 {
 4094 simon                    2081              27 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2082                 : 
                               2083              27 :                     n->relation = $5;
                               2084              27 :                     n->cmds = $6;
 1002 michael                  2085              27 :                     n->objtype = OBJECT_TABLE;
 4094 simon                    2086              27 :                     n->missing_ok = true;
  331 peter                    2087              27 :                     $$ = (Node *) n;
                               2088                 :                 }
                               2089                 :         |   ALTER TABLE relation_expr partition_cmd
 2314 rhaas                    2090 ECB             :                 {
 2314 rhaas                    2091 GIC        1320 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
  331 peter                    2092 ECB             : 
 2314 rhaas                    2093 CBC        1320 :                     n->relation = $3;
 2314 rhaas                    2094 GIC        1320 :                     n->cmds = list_make1($4);
 1002 michael                  2095            1320 :                     n->objtype = OBJECT_TABLE;
 2314 rhaas                    2096            1320 :                     n->missing_ok = false;
  331 peter                    2097 CBC        1320 :                     $$ = (Node *) n;
                               2098                 :                 }
 2314 rhaas                    2099 ECB             :         |   ALTER TABLE IF_P EXISTS relation_expr partition_cmd
                               2100                 :                 {
 2314 rhaas                    2101 UIC           0 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2102                 : 
                               2103               0 :                     n->relation = $5;
 2314 rhaas                    2104 UBC           0 :                     n->cmds = list_make1($6);
 1002 michael                  2105 UIC           0 :                     n->objtype = OBJECT_TABLE;
 2314 rhaas                    2106 UBC           0 :                     n->missing_ok = true;
  331 peter                    2107               0 :                     $$ = (Node *) n;
                               2108                 :                 }
                               2109                 :         |   ALTER TABLE ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
                               2110                 :                 {
 3153 sfrost                   2111 CBC           6 :                     AlterTableMoveAllStmt *n =
 3153 sfrost                   2112 GIC           6 :                         makeNode(AlterTableMoveAllStmt);
  331 peter                    2113 ECB             : 
 3153 sfrost                   2114 CBC           6 :                     n->orig_tablespacename = $6;
 3153 sfrost                   2115 GIC           6 :                     n->objtype = OBJECT_TABLE;
                               2116               6 :                     n->roles = NIL;
                               2117               6 :                     n->new_tablespacename = $9;
 3153 sfrost                   2118 CBC           6 :                     n->nowait = $10;
  331 peter                    2119 GIC           6 :                     $$ = (Node *) n;
 3153 sfrost                   2120 ECB             :                 }
                               2121                 :         |   ALTER TABLE ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
                               2122                 :                 {
 3153 sfrost                   2123 UIC           0 :                     AlterTableMoveAllStmt *n =
                               2124               0 :                         makeNode(AlterTableMoveAllStmt);
                               2125                 : 
                               2126               0 :                     n->orig_tablespacename = $6;
                               2127               0 :                     n->objtype = OBJECT_TABLE;
                               2128               0 :                     n->roles = $9;
                               2129               0 :                     n->new_tablespacename = $12;
                               2130               0 :                     n->nowait = $13;
  331 peter                    2131               0 :                     $$ = (Node *) n;
                               2132                 :                 }
                               2133                 :         |   ALTER INDEX qualified_name alter_table_cmds
                               2134                 :                 {
 6806 bruce                    2135 GIC         113 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2136                 : 
                               2137             113 :                     n->relation = $3;
 6806 bruce                    2138 CBC         113 :                     n->cmds = $4;
 1002 michael                  2139 GIC         113 :                     n->objtype = OBJECT_INDEX;
 4094 simon                    2140 CBC         113 :                     n->missing_ok = false;
  331 peter                    2141             113 :                     $$ = (Node *) n;
 4094 simon                    2142 ECB             :                 }
                               2143                 :         |   ALTER INDEX IF_P EXISTS qualified_name alter_table_cmds
                               2144                 :                 {
 4094 simon                    2145 UIC           0 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2146                 : 
                               2147               0 :                     n->relation = $5;
 4094 simon                    2148 LBC           0 :                     n->cmds = $6;
 1002 michael                  2149 UIC           0 :                     n->objtype = OBJECT_INDEX;
 4094 simon                    2150 LBC           0 :                     n->missing_ok = true;
  331 peter                    2151               0 :                     $$ = (Node *) n;
 6913 tgl                      2152 ECB             :                 }
 1906 alvherre                 2153                 :         |   ALTER INDEX qualified_name index_partition_cmd
                               2154                 :                 {
 1906 alvherre                 2155 GIC         189 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2156                 : 
                               2157             189 :                     n->relation = $3;
 1906 alvherre                 2158 CBC         189 :                     n->cmds = list_make1($4);
 1002 michael                  2159 GIC         189 :                     n->objtype = OBJECT_INDEX;
 1906 alvherre                 2160 CBC         189 :                     n->missing_ok = false;
  331 peter                    2161             189 :                     $$ = (Node *) n;
 1906 alvherre                 2162 ECB             :                 }
 3153 sfrost                   2163                 :         |   ALTER INDEX ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
                               2164                 :                 {
 3153 sfrost                   2165 GIC           3 :                     AlterTableMoveAllStmt *n =
                               2166               3 :                         makeNode(AlterTableMoveAllStmt);
                               2167                 : 
 3153 sfrost                   2168 GBC           3 :                     n->orig_tablespacename = $6;
 3153 sfrost                   2169 GIC           3 :                     n->objtype = OBJECT_INDEX;
 3153 sfrost                   2170 GBC           3 :                     n->roles = NIL;
                               2171               3 :                     n->new_tablespacename = $9;
                               2172               3 :                     n->nowait = $10;
  331 peter                    2173               3 :                     $$ = (Node *) n;
 3153 sfrost                   2174 EUB             :                 }
                               2175                 :         |   ALTER INDEX ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
                               2176                 :                 {
 3153 sfrost                   2177 UIC           0 :                     AlterTableMoveAllStmt *n =
 3153 sfrost                   2178 LBC           0 :                         makeNode(AlterTableMoveAllStmt);
  331 peter                    2179 ECB             : 
 3153 sfrost                   2180 UIC           0 :                     n->orig_tablespacename = $6;
 3153 sfrost                   2181 LBC           0 :                     n->objtype = OBJECT_INDEX;
                               2182               0 :                     n->roles = $9;
                               2183               0 :                     n->new_tablespacename = $12;
                               2184               0 :                     n->nowait = $13;
  331 peter                    2185               0 :                     $$ = (Node *) n;
 3153 sfrost                   2186 ECB             :                 }
                               2187                 :         |   ALTER SEQUENCE qualified_name alter_table_cmds
                               2188                 :                 {
 5411 tgl                      2189 GIC          32 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
  331 peter                    2190 EUB             : 
 5411 tgl                      2191 GBC          32 :                     n->relation = $3;
 5411 tgl                      2192 GIC          32 :                     n->cmds = $4;
 1002 michael                  2193 GBC          32 :                     n->objtype = OBJECT_SEQUENCE;
 4094 simon                    2194              32 :                     n->missing_ok = false;
  331 peter                    2195              32 :                     $$ = (Node *) n;
 4094 simon                    2196 EUB             :                 }
                               2197                 :         |   ALTER SEQUENCE IF_P EXISTS qualified_name alter_table_cmds
                               2198                 :                 {
 4094 simon                    2199 UIC           0 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2200                 : 
                               2201               0 :                     n->relation = $5;
 4094 simon                    2202 LBC           0 :                     n->cmds = $6;
 1002 michael                  2203 UIC           0 :                     n->objtype = OBJECT_SEQUENCE;
 4094 simon                    2204 LBC           0 :                     n->missing_ok = true;
  331 peter                    2205               0 :                     $$ = (Node *) n;
 5411 tgl                      2206 ECB             :                 }
 5200 peter_e                  2207                 :         |   ALTER VIEW qualified_name alter_table_cmds
 5411 tgl                      2208                 :                 {
 5411 tgl                      2209 GIC         119 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2210                 : 
                               2211             119 :                     n->relation = $3;
 5411 tgl                      2212 GBC         119 :                     n->cmds = $4;
 1002 michael                  2213 GIC         119 :                     n->objtype = OBJECT_VIEW;
 4094 simon                    2214 GBC         119 :                     n->missing_ok = false;
  331 peter                    2215             119 :                     $$ = (Node *) n;
 4094 simon                    2216 EUB             :                 }
                               2217                 :         |   ALTER VIEW IF_P EXISTS qualified_name alter_table_cmds
                               2218                 :                 {
 4094 simon                    2219 UIC           0 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2220                 : 
                               2221               0 :                     n->relation = $5;
 4094 simon                    2222 LBC           0 :                     n->cmds = $6;
 1002 michael                  2223 UIC           0 :                     n->objtype = OBJECT_VIEW;
 4094 simon                    2224 LBC           0 :                     n->missing_ok = true;
  331 peter                    2225               0 :                     $$ = (Node *) n;
 5411 tgl                      2226 ECB             :                 }
 3689 kgrittn                  2227                 :         |   ALTER MATERIALIZED VIEW qualified_name alter_table_cmds
                               2228                 :                 {
 3689 kgrittn                  2229 GIC          24 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2230                 : 
                               2231              24 :                     n->relation = $4;
 3689 kgrittn                  2232 CBC          24 :                     n->cmds = $5;
 1002 michael                  2233              24 :                     n->objtype = OBJECT_MATVIEW;
 3689 kgrittn                  2234 GIC          24 :                     n->missing_ok = false;
  331 peter                    2235 CBC          24 :                     $$ = (Node *) n;
 3689 kgrittn                  2236 ECB             :                 }
                               2237                 :         |   ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name alter_table_cmds
                               2238                 :                 {
 3689 kgrittn                  2239 LBC           0 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
  331 peter                    2240 ECB             : 
 3689 kgrittn                  2241 UIC           0 :                     n->relation = $6;
                               2242               0 :                     n->cmds = $7;
 1002 michael                  2243               0 :                     n->objtype = OBJECT_MATVIEW;
 3689 kgrittn                  2244 UBC           0 :                     n->missing_ok = true;
  331 peter                    2245               0 :                     $$ = (Node *) n;
                               2246                 :                 }
 3153 sfrost                   2247 EUB             :         |   ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name SET TABLESPACE name opt_nowait
                               2248                 :                 {
 3153 sfrost                   2249 GBC           6 :                     AlterTableMoveAllStmt *n =
                               2250               6 :                         makeNode(AlterTableMoveAllStmt);
  331 peter                    2251 EUB             : 
 3153 sfrost                   2252 GBC           6 :                     n->orig_tablespacename = $7;
 3153 sfrost                   2253 GIC           6 :                     n->objtype = OBJECT_MATVIEW;
                               2254               6 :                     n->roles = NIL;
                               2255               6 :                     n->new_tablespacename = $10;
 3153 sfrost                   2256 CBC           6 :                     n->nowait = $11;
  331 peter                    2257 GIC           6 :                     $$ = (Node *) n;
 3153 sfrost                   2258 ECB             :                 }
                               2259                 :         |   ALTER MATERIALIZED VIEW ALL IN_P TABLESPACE name OWNED BY role_list SET TABLESPACE name opt_nowait
                               2260                 :                 {
 3153 sfrost                   2261 LBC           0 :                     AlterTableMoveAllStmt *n =
                               2262               0 :                         makeNode(AlterTableMoveAllStmt);
                               2263                 : 
 3153 sfrost                   2264 UIC           0 :                     n->orig_tablespacename = $7;
                               2265               0 :                     n->objtype = OBJECT_MATVIEW;
 3153 sfrost                   2266 UBC           0 :                     n->roles = $10;
 3153 sfrost                   2267 UIC           0 :                     n->new_tablespacename = $13;
 3153 sfrost                   2268 UBC           0 :                     n->nowait = $14;
  331 peter                    2269               0 :                     $$ = (Node *) n;
 3153 sfrost                   2270 EUB             :                 }
 1032 peter                    2271                 :         |   ALTER FOREIGN TABLE relation_expr alter_table_cmds
                               2272                 :                 {
 1032 peter                    2273 GIC         178 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2274                 : 
                               2275             178 :                     n->relation = $4;
 1032 peter                    2276 CBC         178 :                     n->cmds = $5;
 1002 michael                  2277 GIC         178 :                     n->objtype = OBJECT_FOREIGN_TABLE;
 1032 peter                    2278 CBC         178 :                     n->missing_ok = false;
  331                          2279             178 :                     $$ = (Node *) n;
 1032 peter                    2280 ECB             :                 }
                               2281                 :         |   ALTER FOREIGN TABLE IF_P EXISTS relation_expr alter_table_cmds
                               2282                 :                 {
 1032 peter                    2283 GIC          54 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
                               2284                 : 
                               2285              54 :                     n->relation = $6;
 1032 peter                    2286 GBC          54 :                     n->cmds = $7;
 1002 michael                  2287 GIC          54 :                     n->objtype = OBJECT_FOREIGN_TABLE;
 1032 peter                    2288 GBC          54 :                     n->missing_ok = true;
  331                          2289              54 :                     $$ = (Node *) n;
 1032 peter                    2290 EUB             :                 }
 6913 tgl                      2291                 :         ;
                               2292                 : 
                               2293                 : alter_table_cmds:
 6888 neilc                    2294 GIC       39960 :             alter_table_cmd                         { $$ = list_make1($1); }
 6913 tgl                      2295             408 :             | alter_table_cmds ',' alter_table_cmd  { $$ = lappend($1, $3); }
 6913 tgl                      2296 ECB             :         ;
                               2297                 : 
 2314 rhaas                    2298                 : partition_cmd:
                               2299                 :             /* ALTER TABLE <name> ATTACH PARTITION <table_name> FOR VALUES */
 2039                          2300                 :             ATTACH PARTITION qualified_name PartitionBoundSpec
 2314                          2301                 :                 {
 2314 rhaas                    2302 CBC        1052 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
 2314 rhaas                    2303 GIC        1052 :                     PartitionCmd *cmd = makeNode(PartitionCmd);
                               2304                 : 
                               2305            1052 :                     n->subtype = AT_AttachPartition;
 2314 rhaas                    2306 GBC        1052 :                     cmd->name = $3;
 2142 tgl                      2307 GIC        1052 :                     cmd->bound = $4;
  745 alvherre                 2308 GBC        1052 :                     cmd->concurrent = false;
 2314 rhaas                    2309            1052 :                     n->def = (Node *) cmd;
 2314 rhaas                    2310 EUB             : 
 2314 rhaas                    2311 GBC        1052 :                     $$ = (Node *) n;
 2314 rhaas                    2312 EUB             :                 }
                               2313                 :             /* ALTER TABLE <name> DETACH PARTITION <partition_name> [CONCURRENTLY] */
                               2314                 :             | DETACH PARTITION qualified_name opt_concurrently
                               2315                 :                 {
 2314 rhaas                    2316 CBC         261 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2317             261 :                     PartitionCmd *cmd = makeNode(PartitionCmd);
                               2318                 : 
                               2319             261 :                     n->subtype = AT_DetachPartition;
                               2320             261 :                     cmd->name = $3;
 2142 tgl                      2321             261 :                     cmd->bound = NULL;
  745 alvherre                 2322             261 :                     cmd->concurrent = $4;
 2314 rhaas                    2323             261 :                     n->def = (Node *) cmd;
 2314 rhaas                    2324 ECB             : 
  745 alvherre                 2325 GIC         261 :                     $$ = (Node *) n;
                               2326                 :                 }
                               2327                 :             | DETACH PARTITION qualified_name FINALIZE
  745 alvherre                 2328 EUB             :                 {
  745 alvherre                 2329 GBC           7 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  745 alvherre                 2330 GIC           7 :                     PartitionCmd *cmd = makeNode(PartitionCmd);
  745 alvherre                 2331 EUB             : 
  745 alvherre                 2332 GBC           7 :                     n->subtype = AT_DetachPartitionFinalize;
                               2333               7 :                     cmd->name = $3;
                               2334               7 :                     cmd->bound = NULL;
                               2335               7 :                     cmd->concurrent = false;
                               2336               7 :                     n->def = (Node *) cmd;
 2314 rhaas                    2337 GIC           7 :                     $$ = (Node *) n;
                               2338                 :                 }
                               2339                 :         ;
 2314 rhaas                    2340 ECB             : 
                               2341                 : index_partition_cmd:
 1906 alvherre                 2342                 :             /* ALTER INDEX <name> ATTACH PARTITION <index_name> */
                               2343                 :             ATTACH PARTITION qualified_name
                               2344                 :                 {
 1906 alvherre                 2345 CBC         189 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2346             189 :                     PartitionCmd *cmd = makeNode(PartitionCmd);
                               2347                 : 
 1906 alvherre                 2348 GIC         189 :                     n->subtype = AT_AttachPartition;
                               2349             189 :                     cmd->name = $3;
 1906 alvherre                 2350 CBC         189 :                     cmd->bound = NULL;
  745 alvherre                 2351 GIC         189 :                     cmd->concurrent = false;
 1906 alvherre                 2352 CBC         189 :                     n->def = (Node *) cmd;
 1906 alvherre                 2353 ECB             : 
 1906 alvherre                 2354 CBC         189 :                     $$ = (Node *) n;
 1906 alvherre                 2355 ECB             :                 }
                               2356                 :         ;
                               2357                 : 
                               2358                 : alter_table_cmd:
                               2359                 :             /* ALTER TABLE <name> ADD <coldef> */
                               2360                 :             ADD_P columnDef
 4871 tgl                      2361                 :                 {
 4871 tgl                      2362 CBC          82 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2363                 : 
 4871 tgl                      2364 GIC          82 :                     n->subtype = AT_AddColumn;
                               2365              82 :                     n->def = $2;
 2811 andrew                   2366              82 :                     n->missing_ok = false;
  331 peter                    2367              82 :                     $$ = (Node *) n;
                               2368                 :                 }
 2811 andrew                   2369 ECB             :             /* ALTER TABLE <name> ADD IF NOT EXISTS <coldef> */
                               2370                 :             | ADD_P IF_P NOT EXISTS columnDef
                               2371                 :                 {
 2811 andrew                   2372 LBC           0 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2373 ECB             : 
 2811 andrew                   2374 LBC           0 :                     n->subtype = AT_AddColumn;
                               2375               0 :                     n->def = $5;
                               2376               0 :                     n->missing_ok = true;
  331 peter                    2377 UIC           0 :                     $$ = (Node *) n;
 4871 tgl                      2378 ECB             :                 }
                               2379                 :             /* ALTER TABLE <name> ADD COLUMN <coldef> */
                               2380                 :             | ADD_P COLUMN columnDef
                               2381                 :                 {
 6913 tgl                      2382 GIC         791 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2383 ECB             : 
 6913 tgl                      2384 CBC         791 :                     n->subtype = AT_AddColumn;
 6913 tgl                      2385 GIC         791 :                     n->def = $3;
 2811 andrew                   2386 CBC         791 :                     n->missing_ok = false;
  331 peter                    2387             791 :                     $$ = (Node *) n;
 2811 andrew                   2388 ECB             :                 }
                               2389                 :             /* ALTER TABLE <name> ADD COLUMN IF NOT EXISTS <coldef> */
                               2390                 :             | ADD_P COLUMN IF_P NOT EXISTS columnDef
                               2391                 :                 {
 2811 andrew                   2392 CBC          30 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2393                 : 
 2811 andrew                   2394 GIC          30 :                     n->subtype = AT_AddColumn;
                               2395              30 :                     n->def = $6;
 2811 andrew                   2396 CBC          30 :                     n->missing_ok = true;
  331 peter                    2397              30 :                     $$ = (Node *) n;
                               2398                 :                 }
 5411 tgl                      2399 ECB             :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> {SET DEFAULT <expr>|DROP DEFAULT} */
 6913                          2400                 :             | ALTER opt_column ColId alter_column_default
 8454 lockhart                 2401                 :                 {
 6913 tgl                      2402 CBC         249 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2403 ECB             : 
 6913 tgl                      2404 CBC         249 :                     n->subtype = AT_ColumnDefault;
 6913 tgl                      2405 GIC         249 :                     n->name = $3;
                               2406             249 :                     n->def = $4;
  331 peter                    2407             249 :                     $$ = (Node *) n;
                               2408                 :                 }
                               2409                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP NOT NULL */
                               2410                 :             | ALTER opt_column ColId DROP NOT NULL_P
                               2411                 :                 {
 6913 tgl                      2412 CBC         120 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2413 ECB             : 
 6913 tgl                      2414 GIC         120 :                     n->subtype = AT_DropNotNull;
 6913 tgl                      2415 CBC         120 :                     n->name = $3;
  331 peter                    2416             120 :                     $$ = (Node *) n;
 7601 bruce                    2417 ECB             :                 }
 5411 tgl                      2418                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET NOT NULL */
 6913                          2419                 :             | ALTER opt_column ColId SET NOT NULL_P
                               2420                 :                 {
 6913 tgl                      2421 CBC         172 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2422                 : 
 6913 tgl                      2423 GIC         172 :                     n->subtype = AT_SetNotNull;
                               2424             172 :                     n->name = $3;
  331 peter                    2425             172 :                     $$ = (Node *) n;
                               2426                 :                 }
                               2427                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP EXPRESSION */
                               2428                 :             | ALTER opt_column ColId DROP EXPRESSION
 1181 peter                    2429 ECB             :                 {
 1181 peter                    2430 GIC          16 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2431 ECB             : 
 1181 peter                    2432 CBC          16 :                     n->subtype = AT_DropExpression;
                               2433              16 :                     n->name = $3;
  331                          2434              16 :                     $$ = (Node *) n;
                               2435                 :                 }
                               2436                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP EXPRESSION IF EXISTS */
                               2437                 :             | ALTER opt_column ColId DROP EXPRESSION IF_P EXISTS
                               2438                 :                 {
 1181 peter                    2439 GBC           3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2440                 : 
                               2441               3 :                     n->subtype = AT_DropExpression;
                               2442               3 :                     n->name = $3;
                               2443               3 :                     n->missing_ok = true;
  331                          2444               3 :                     $$ = (Node *) n;
                               2445                 :                 }
                               2446                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STATISTICS <SignedIconst> */
                               2447                 :             | ALTER opt_column ColId SET STATISTICS SignedIconst
                               2448                 :                 {
 6913 tgl                      2449 CBC          31 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2450                 : 
                               2451              31 :                     n->subtype = AT_SetStatistics;
                               2452              31 :                     n->name = $3;
 5260 meskes                   2453              31 :                     n->def = (Node *) makeInteger($6);
  331 peter                    2454              31 :                     $$ = (Node *) n;
                               2455                 :                 }
                               2456                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colnum> SET STATISTICS <SignedIconst> */
                               2457                 :             | ALTER opt_column Iconst SET STATISTICS SignedIconst
                               2458                 :                 {
 2041 simon                    2459              35 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2460                 : 
                               2461              35 :                     if ($3 <= 0 || $3 > PG_INT16_MAX)
                               2462               3 :                         ereport(ERROR,
 2041 simon                    2463 ECB             :                                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                               2464                 :                                  errmsg("column number must be in range from 1 to %d", PG_INT16_MAX),
                               2465                 :                                  parser_errposition(@3)));
                               2466                 : 
 2041 simon                    2467 GIC          32 :                     n->subtype = AT_SetStatistics;
                               2468              32 :                     n->num = (int16) $3;
 2041 simon                    2469 CBC          32 :                     n->def = (Node *) makeInteger($6);
  331 peter                    2470 GIC          32 :                     $$ = (Node *) n;
 2041 simon                    2471 ECB             :                 }
 4825 rhaas                    2472                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET ( column_parameter = value [, ... ] ) */
                               2473                 :             | ALTER opt_column ColId SET reloptions
 4998 tgl                      2474                 :                 {
 4998 tgl                      2475 GIC          19 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2476                 : 
 4825 rhaas                    2477              19 :                     n->subtype = AT_SetOptions;
 4998 tgl                      2478              19 :                     n->name = $3;
 4825 rhaas                    2479 CBC          19 :                     n->def = (Node *) $5;
  331 peter                    2480 GIC          19 :                     $$ = (Node *) n;
 4825 rhaas                    2481 ECB             :                 }
  580 fujii                    2482                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> RESET ( column_parameter [, ... ] ) */
 4825 rhaas                    2483                 :             | ALTER opt_column ColId RESET reloptions
                               2484                 :                 {
 4825 rhaas                    2485 GIC           3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2486                 : 
                               2487               3 :                     n->subtype = AT_ResetOptions;
 4825 rhaas                    2488 CBC           3 :                     n->name = $3;
 4825 rhaas                    2489 GIC           3 :                     n->def = (Node *) $5;
  331 peter                    2490 CBC           3 :                     $$ = (Node *) n;
 4998 tgl                      2491 ECB             :                 }
 5411                          2492                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET STORAGE <storagemode> */
                               2493                 :             | ALTER opt_column ColId SET column_storage
                               2494                 :                 {
 6913 tgl                      2495 GIC         104 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2496                 : 
 6913 tgl                      2497 CBC         104 :                     n->subtype = AT_SetStorage;
 6913 tgl                      2498 GIC         104 :                     n->name = $3;
  270 peter                    2499 GNC         104 :                     n->def = (Node *) makeString($5);
  331 peter                    2500 CBC         104 :                     $$ = (Node *) n;
 7705 bruce                    2501 ECB             :                 }
                               2502                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET COMPRESSION <cm> */
                               2503                 :             | ALTER opt_column ColId SET column_compression
                               2504                 :                 {
  682 tgl                      2505 GIC          33 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2506 ECB             : 
  682 tgl                      2507 GIC          33 :                     n->subtype = AT_SetCompression;
  682 tgl                      2508 CBC          33 :                     n->name = $3;
                               2509              33 :                     n->def = (Node *) makeString($5);
  331 peter                    2510              33 :                     $$ = (Node *) n;
  682 tgl                      2511 ECB             :                 }
                               2512                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> ADD GENERATED ... AS IDENTITY ... */
                               2513                 :             | ALTER opt_column ColId ADD_P GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList
                               2514                 :                 {
 2194 peter_e                  2515 GIC          51 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
 2194 peter_e                  2516 CBC          51 :                     Constraint *c = makeNode(Constraint);
                               2517                 : 
                               2518              51 :                     c->contype = CONSTR_IDENTITY;
                               2519              51 :                     c->generated_when = $6;
                               2520              51 :                     c->options = $9;
                               2521              51 :                     c->location = @5;
                               2522                 : 
 2194 peter_e                  2523 GIC          51 :                     n->subtype = AT_AddIdentity;
                               2524              51 :                     n->name = $3;
                               2525              51 :                     n->def = (Node *) c;
 2194 peter_e                  2526 ECB             : 
  331 peter                    2527 GIC          51 :                     $$ = (Node *) n;
 2194 peter_e                  2528 ECB             :                 }
                               2529                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> SET <sequence options>/RESET */
                               2530                 :             | ALTER opt_column ColId alter_identity_column_option_list
                               2531                 :                 {
 2194 peter_e                  2532 GIC          19 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2533                 : 
 2194 peter_e                  2534 CBC          19 :                     n->subtype = AT_SetIdentity;
                               2535              19 :                     n->name = $3;
                               2536              19 :                     n->def = (Node *) $4;
  331 peter                    2537              19 :                     $$ = (Node *) n;
                               2538                 :                 }
                               2539                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP IDENTITY */
                               2540                 :             | ALTER opt_column ColId DROP IDENTITY_P
                               2541                 :                 {
 2194 peter_e                  2542              16 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2543                 : 
                               2544              16 :                     n->subtype = AT_DropIdentity;
                               2545              16 :                     n->name = $3;
                               2546              16 :                     n->missing_ok = false;
  331 peter                    2547              16 :                     $$ = (Node *) n;
                               2548                 :                 }
                               2549                 :             /* ALTER TABLE <name> ALTER [COLUMN] <colname> DROP IDENTITY IF EXISTS */
                               2550                 :             | ALTER opt_column ColId DROP IDENTITY_P IF_P EXISTS
                               2551                 :                 {
 2194 peter_e                  2552               3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2553                 : 
                               2554               3 :                     n->subtype = AT_DropIdentity;
                               2555               3 :                     n->name = $3;
                               2556               3 :                     n->missing_ok = true;
  331 peter                    2557               3 :                     $$ = (Node *) n;
                               2558                 :                 }
                               2559                 :             /* ALTER TABLE <name> DROP [COLUMN] IF EXISTS <colname> [RESTRICT|CASCADE] */
                               2560                 :             | DROP opt_column IF_P EXISTS ColId opt_drop_behavior
                               2561                 :                 {
 5011 andrew                   2562               9 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2563                 : 
                               2564               9 :                     n->subtype = AT_DropColumn;
                               2565               9 :                     n->name = $5;
                               2566               9 :                     n->behavior = $6;
 2062 peter_e                  2567               9 :                     n->missing_ok = true;
  331 peter                    2568 GIC           9 :                     $$ = (Node *) n;
                               2569                 :                 }
                               2570                 :             /* ALTER TABLE <name> DROP [COLUMN] <colname> [RESTRICT|CASCADE] */
                               2571                 :             | DROP opt_column ColId opt_drop_behavior
 8454 lockhart                 2572 ECB             :                 {
 6913 tgl                      2573 GIC         740 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2574 ECB             : 
 6913 tgl                      2575 CBC         740 :                     n->subtype = AT_DropColumn;
                               2576             740 :                     n->name = $3;
                               2577             740 :                     n->behavior = $4;
 2062 peter_e                  2578 GIC         740 :                     n->missing_ok = false;
  331 peter                    2579             740 :                     $$ = (Node *) n;
                               2580                 :                 }
                               2581                 :             /*
 5283 peter_e                  2582 ECB             :              * ALTER TABLE <name> ALTER [COLUMN] <colname> [SET DATA] TYPE <typename>
 6913 tgl                      2583                 :              *      [ USING <expression> ]
                               2584                 :              */
 4414                          2585                 :             | ALTER opt_column ColId opt_set_data TYPE_P Typename opt_collate_clause alter_using
 6913                          2586                 :                 {
 6913 tgl                      2587 CBC         412 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
 4414                          2588             412 :                     ColumnDef *def = makeNode(ColumnDef);
                               2589                 : 
 6913                          2590             412 :                     n->subtype = AT_AlterColumnType;
                               2591             412 :                     n->name = $3;
 4414                          2592             412 :                     n->def = (Node *) def;
                               2593                 :                     /* We only use these fields of the ColumnDef node */
                               2594             412 :                     def->typeName = $6;
 4414 tgl                      2595 GIC         412 :                     def->collClause = (CollateClause *) $7;
                               2596             412 :                     def->raw_default = $8;
 3426                          2597             412 :                     def->location = @3;
  331 peter                    2598             412 :                     $$ = (Node *) n;
 8454 lockhart                 2599 ECB             :                 }
                               2600                 :             /* ALTER FOREIGN TABLE <name> ALTER [COLUMN] <colname> OPTIONS */
 4265 rhaas                    2601                 :             | ALTER opt_column ColId alter_generic_options
                               2602                 :                 {
 4265 rhaas                    2603 CBC          25 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2604 ECB             : 
 4265 rhaas                    2605 GIC          25 :                     n->subtype = AT_AlterColumnGenericOptions;
                               2606              25 :                     n->name = $3;
                               2607              25 :                     n->def = (Node *) $4;
  331 peter                    2608              25 :                     $$ = (Node *) n;
 4265 rhaas                    2609 ECB             :                 }
                               2610                 :             /* ALTER TABLE <name> ADD CONSTRAINT ... */
 6312 bruce                    2611                 :             | ADD_P TableConstraint
 8454 lockhart                 2612                 :                 {
 6913 tgl                      2613 CBC       34735 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2614 ECB             : 
 6913 tgl                      2615 GIC       34735 :                     n->subtype = AT_AddConstraint;
                               2616           34735 :                     n->def = $2;
  331 peter                    2617           34735 :                     $$ = (Node *) n;
                               2618                 :                 }
 3571 simon                    2619 ECB             :             /* ALTER TABLE <name> ALTER CONSTRAINT ... */
                               2620                 :             | ALTER CONSTRAINT name ConstraintAttributeSpec
                               2621                 :                 {
 3571 simon                    2622 CBC          36 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2623              36 :                     Constraint *c = makeNode(Constraint);
  331 peter                    2624 ECB             : 
 3571 simon                    2625 GIC          36 :                     n->subtype = AT_AlterConstraint;
                               2626              36 :                     n->def = (Node *) c;
                               2627              36 :                     c->contype = CONSTR_FOREIGN; /* others not supported, yet */
                               2628              36 :                     c->conname = $3;
 3571 simon                    2629 CBC          36 :                     processCASbits($4, @4, "ALTER CONSTRAINT statement",
                               2630                 :                                     &c->deferrable,
 3571 simon                    2631 ECB             :                                     &c->initdeferred,
                               2632                 :                                     NULL, NULL, yyscanner);
  331 peter                    2633 CBC          36 :                     $$ = (Node *) n;
 3571 simon                    2634 ECB             :                 }
 4443                          2635                 :             /* ALTER TABLE <name> VALIDATE CONSTRAINT ... */
                               2636                 :             | VALIDATE CONSTRAINT name
                               2637                 :                 {
 4443 simon                    2638 GIC         194 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2639                 : 
 4443 simon                    2640 CBC         194 :                     n->subtype = AT_ValidateConstraint;
 4443 simon                    2641 GIC         194 :                     n->name = $3;
  331 peter                    2642 CBC         194 :                     $$ = (Node *) n;
 4443 simon                    2643 ECB             :                 }
 5011 andrew                   2644                 :             /* ALTER TABLE <name> DROP CONSTRAINT IF EXISTS <name> [RESTRICT|CASCADE] */
                               2645                 :             | DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
                               2646                 :                 {
 5011 andrew                   2647 GIC           9 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2648                 : 
                               2649               9 :                     n->subtype = AT_DropConstraint;
                               2650               9 :                     n->name = $5;
                               2651               9 :                     n->behavior = $6;
 2062 peter_e                  2652               9 :                     n->missing_ok = true;
  331 peter                    2653               9 :                     $$ = (Node *) n;
 5011 andrew                   2654 ECB             :                 }
 5411 tgl                      2655                 :             /* ALTER TABLE <name> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
                               2656                 :             | DROP CONSTRAINT name opt_drop_behavior
 8454 lockhart                 2657                 :                 {
 6913 tgl                      2658 CBC         264 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2659 ECB             : 
 6913 tgl                      2660 GIC         264 :                     n->subtype = AT_DropConstraint;
 6913 tgl                      2661 CBC         264 :                     n->name = $3;
                               2662             264 :                     n->behavior = $4;
 2062 peter_e                  2663             264 :                     n->missing_ok = false;
  331 peter                    2664             264 :                     $$ = (Node *) n;
 8454 lockhart                 2665 ECB             :                 }
                               2666                 :             /* ALTER TABLE <name> SET WITHOUT OIDS, for backward compat */
                               2667                 :             | SET WITHOUT OIDS
                               2668                 :                 {
 6913 tgl                      2669 GIC           3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2670 ECB             : 
 6913 tgl                      2671 GIC           3 :                     n->subtype = AT_DropOids;
  331 peter                    2672 CBC           3 :                     $$ = (Node *) n;
 7360 bruce                    2673 ECB             :                 }
 7325                          2674                 :             /* ALTER TABLE <name> CLUSTER ON <indexname> */
 6913 tgl                      2675                 :             | CLUSTER ON name
                               2676                 :                 {
 6913 tgl                      2677 GIC          23 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2678                 : 
                               2679              23 :                     n->subtype = AT_ClusterOn;
 6913 tgl                      2680 CBC          23 :                     n->name = $3;
  331 peter                    2681 GIC          23 :                     $$ = (Node *) n;
 7325 bruce                    2682 ECB             :                 }
 6869 tgl                      2683                 :             /* ALTER TABLE <name> SET WITHOUT CLUSTER */
 6885 bruce                    2684                 :             | SET WITHOUT CLUSTER
                               2685                 :                 {
 6885 bruce                    2686 GIC           9 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2687                 : 
                               2688               9 :                     n->subtype = AT_DropCluster;
 6885 bruce                    2689 CBC           9 :                     n->name = NULL;
  331 peter                    2690               9 :                     $$ = (Node *) n;
                               2691                 :                 }
  745 peter                    2692 ECB             :             /* ALTER TABLE <name> SET LOGGED */
 3152 alvherre                 2693                 :             | SET LOGGED
                               2694                 :                 {
 3152 alvherre                 2695 CBC          16 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2696 ECB             : 
 3152 alvherre                 2697 GIC          16 :                     n->subtype = AT_SetLogged;
  331 peter                    2698              16 :                     $$ = (Node *) n;
                               2699                 :                 }
  745 peter                    2700 ECB             :             /* ALTER TABLE <name> SET UNLOGGED */
                               2701                 :             | SET UNLOGGED
                               2702                 :                 {
 3152 alvherre                 2703 GIC          19 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2704                 : 
 3152 alvherre                 2705 CBC          19 :                     n->subtype = AT_SetUnLogged;
  331 peter                    2706 GIC          19 :                     $$ = (Node *) n;
 3152 alvherre                 2707 ECB             :                 }
 6438 tgl                      2708                 :             /* ALTER TABLE <name> ENABLE TRIGGER <trig> */
                               2709                 :             | ENABLE_P TRIGGER name
                               2710                 :                 {
 6438 tgl                      2711 GIC          60 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2712                 : 
                               2713              60 :                     n->subtype = AT_EnableTrig;
 6438 tgl                      2714 CBC          60 :                     n->name = $3;
  331 peter                    2715 GIC          60 :                     $$ = (Node *) n;
 6438 tgl                      2716 ECB             :                 }
 5865 JanWieck                 2717                 :             /* ALTER TABLE <name> ENABLE ALWAYS TRIGGER <trig> */
                               2718                 :             | ENABLE_P ALWAYS TRIGGER name
                               2719                 :                 {
 5865 JanWieck                 2720 CBC          20 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2721                 : 
 5865 JanWieck                 2722 GIC          20 :                     n->subtype = AT_EnableAlwaysTrig;
                               2723              20 :                     n->name = $4;
  331 peter                    2724              20 :                     $$ = (Node *) n;
 5865 JanWieck                 2725 ECB             :                 }
                               2726                 :             /* ALTER TABLE <name> ENABLE REPLICA TRIGGER <trig> */
                               2727                 :             | ENABLE_P REPLICA TRIGGER name
                               2728                 :                 {
 5865 JanWieck                 2729 CBC           8 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2730 ECB             : 
 5865 JanWieck                 2731 CBC           8 :                     n->subtype = AT_EnableReplicaTrig;
 5865 JanWieck                 2732 GIC           8 :                     n->name = $4;
  331 peter                    2733               8 :                     $$ = (Node *) n;
                               2734                 :                 }
                               2735                 :             /* ALTER TABLE <name> ENABLE TRIGGER ALL */
 6438 tgl                      2736 ECB             :             | ENABLE_P TRIGGER ALL
                               2737                 :                 {
 6438 tgl                      2738 LBC           0 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2739 ECB             : 
 6438 tgl                      2740 UIC           0 :                     n->subtype = AT_EnableTrigAll;
  331 peter                    2741               0 :                     $$ = (Node *) n;
                               2742                 :                 }
                               2743                 :             /* ALTER TABLE <name> ENABLE TRIGGER USER */
 6438 tgl                      2744 ECB             :             | ENABLE_P TRIGGER USER
                               2745                 :                 {
 6438 tgl                      2746 LBC           0 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2747 ECB             : 
 6438 tgl                      2748 LBC           0 :                     n->subtype = AT_EnableTrigUser;
  331 peter                    2749 UIC           0 :                     $$ = (Node *) n;
                               2750                 :                 }
                               2751                 :             /* ALTER TABLE <name> DISABLE TRIGGER <trig> */
                               2752                 :             | DISABLE_P TRIGGER name
 6438 tgl                      2753 ECB             :                 {
 6438 tgl                      2754 GIC          68 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2755 ECB             : 
 6438 tgl                      2756 CBC          68 :                     n->subtype = AT_DisableTrig;
                               2757              68 :                     n->name = $3;
  331 peter                    2758 GIC          68 :                     $$ = (Node *) n;
                               2759                 :                 }
                               2760                 :             /* ALTER TABLE <name> DISABLE TRIGGER ALL */
                               2761                 :             | DISABLE_P TRIGGER ALL
 6438 tgl                      2762 ECB             :                 {
 6438 tgl                      2763 GIC           6 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2764 ECB             : 
 6438 tgl                      2765 CBC           6 :                     n->subtype = AT_DisableTrigAll;
  331 peter                    2766 GIC           6 :                     $$ = (Node *) n;
                               2767                 :                 }
                               2768                 :             /* ALTER TABLE <name> DISABLE TRIGGER USER */
                               2769                 :             | DISABLE_P TRIGGER USER
 6438 tgl                      2770 ECB             :                 {
 6438 tgl                      2771 GIC           6 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2772 ECB             : 
 6438 tgl                      2773 CBC           6 :                     n->subtype = AT_DisableTrigUser;
  331 peter                    2774 GIC           6 :                     $$ = (Node *) n;
                               2775                 :                 }
                               2776                 :             /* ALTER TABLE <name> ENABLE RULE <rule> */
                               2777                 :             | ENABLE_P RULE name
 5865 JanWieck                 2778 ECB             :                 {
 5865 JanWieck                 2779 GIC           3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2780 ECB             : 
 5865 JanWieck                 2781 CBC           3 :                     n->subtype = AT_EnableRule;
                               2782               3 :                     n->name = $3;
  331 peter                    2783 GIC           3 :                     $$ = (Node *) n;
                               2784                 :                 }
                               2785                 :             /* ALTER TABLE <name> ENABLE ALWAYS RULE <rule> */
                               2786                 :             | ENABLE_P ALWAYS RULE name
 5865 JanWieck                 2787 ECB             :                 {
 5865 JanWieck                 2788 UIC           0 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2789 ECB             : 
 5865 JanWieck                 2790 LBC           0 :                     n->subtype = AT_EnableAlwaysRule;
                               2791               0 :                     n->name = $4;
  331 peter                    2792 UIC           0 :                     $$ = (Node *) n;
                               2793                 :                 }
                               2794                 :             /* ALTER TABLE <name> ENABLE REPLICA RULE <rule> */
                               2795                 :             | ENABLE_P REPLICA RULE name
 5865 JanWieck                 2796 ECB             :                 {
 5865 JanWieck                 2797 GIC           3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2798 ECB             : 
 5865 JanWieck                 2799 CBC           3 :                     n->subtype = AT_EnableReplicaRule;
                               2800               3 :                     n->name = $4;
  331 peter                    2801 GIC           3 :                     $$ = (Node *) n;
                               2802                 :                 }
                               2803                 :             /* ALTER TABLE <name> DISABLE RULE <rule> */
                               2804                 :             | DISABLE_P RULE name
 5865 JanWieck                 2805 EUB             :                 {
 5865 JanWieck                 2806 GIC           3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2807 EUB             : 
 5865 JanWieck                 2808 GBC           3 :                     n->subtype = AT_DisableRule;
 5865 JanWieck                 2809 GIC           3 :                     n->name = $3;
  331 peter                    2810               3 :                     $$ = (Node *) n;
                               2811                 :                 }
                               2812                 :             /* ALTER TABLE <name> INHERIT <parent> */
 6125 bruce                    2813 EUB             :             | INHERIT qualified_name
                               2814                 :                 {
 6125 bruce                    2815 GBC         143 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2816 EUB             : 
 6022 tgl                      2817 GIC         143 :                     n->subtype = AT_AddInherit;
                               2818             143 :                     n->def = (Node *) $2;
  331 peter                    2819             143 :                     $$ = (Node *) n;
                               2820                 :                 }
 6022 tgl                      2821 ECB             :             /* ALTER TABLE <name> NO INHERIT <parent> */
                               2822                 :             | NO INHERIT qualified_name
 6125 bruce                    2823                 :                 {
 6125 bruce                    2824 CBC          22 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2825 ECB             : 
 6022 tgl                      2826 GIC          22 :                     n->subtype = AT_DropInherit;
                               2827              22 :                     n->def = (Node *) $3;
  331 peter                    2828              22 :                     $$ = (Node *) n;
                               2829                 :                 }
 4372 rhaas                    2830 ECB             :             /* ALTER TABLE <name> OF <type_name> */
                               2831                 :             | OF any_name
                               2832                 :                 {
 4372 rhaas                    2833 CBC          33 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2834 GIC          33 :                     TypeName   *def = makeTypeNameFromNameList($2);
                               2835                 : 
 4372 rhaas                    2836              33 :                     def->location = @2;
                               2837              33 :                     n->subtype = AT_AddOf;
 4372 rhaas                    2838 CBC          33 :                     n->def = (Node *) def;
  331 peter                    2839 GIC          33 :                     $$ = (Node *) n;
 4372 rhaas                    2840 ECB             :                 }
                               2841                 :             /* ALTER TABLE <name> NOT OF */
                               2842                 :             | NOT OF
                               2843                 :                 {
 4372 rhaas                    2844 GIC           3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2845                 : 
 4372 rhaas                    2846 CBC           3 :                     n->subtype = AT_DropOf;
  331 peter                    2847 GIC           3 :                     $$ = (Node *) n;
 4372 rhaas                    2848 ECB             :                 }
 2953 alvherre                 2849                 :             /* ALTER TABLE <name> OWNER TO RoleSpec */
                               2850                 :             | OWNER TO RoleSpec
                               2851                 :                 {
 6806 bruce                    2852 GIC         861 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2853                 : 
                               2854             861 :                     n->subtype = AT_ChangeOwner;
 2953 alvherre                 2855 GBC         861 :                     n->newowner = $3;
  331 peter                    2856 GIC         861 :                     $$ = (Node *) n;
 6806 bruce                    2857 EUB             :                 }
  620 michael                  2858                 :             /* ALTER TABLE <name> SET ACCESS METHOD <amname> */
                               2859                 :             | SET ACCESS METHOD name
                               2860                 :                 {
  620 michael                  2861 GIC          24 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2862                 : 
                               2863              24 :                     n->subtype = AT_SetAccessMethod;
  620 michael                  2864 CBC          24 :                     n->name = $4;
  331 peter                    2865 GIC          24 :                     $$ = (Node *) n;
  620 michael                  2866 ECB             :                 }
 5411 tgl                      2867                 :             /* ALTER TABLE <name> SET TABLESPACE <tablespacename> */
 6846                          2868                 :             | SET TABLESPACE name
                               2869                 :                 {
 6846 tgl                      2870 GIC          52 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2871                 : 
                               2872              52 :                     n->subtype = AT_SetTableSpace;
 6846 tgl                      2873 CBC          52 :                     n->name = $3;
  331 peter                    2874 GIC          52 :                     $$ = (Node *) n;
 6846 tgl                      2875 ECB             :                 }
 5411                          2876                 :             /* ALTER TABLE <name> SET (...) */
 5179 alvherre                 2877                 :             | SET reloptions
                               2878                 :                 {
 6125 bruce                    2879 GIC         291 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2880                 : 
 6124 tgl                      2881             291 :                     n->subtype = AT_SetRelOptions;
  331 peter                    2882 CBC         291 :                     n->def = (Node *) $2;
  331 peter                    2883 GIC         291 :                     $$ = (Node *) n;
 6125 bruce                    2884 ECB             :                 }
 5411 tgl                      2885                 :             /* ALTER TABLE <name> RESET (...) */
 5179 alvherre                 2886                 :             | RESET reloptions
                               2887                 :                 {
 6124 tgl                      2888 GIC          76 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2889                 : 
                               2890              76 :                     n->subtype = AT_ResetRelOptions;
  331 peter                    2891 CBC          76 :                     n->def = (Node *) $2;
  331 peter                    2892 GIC          76 :                     $$ = (Node *) n;
 6125 bruce                    2893 ECB             :                 }
  745 peter                    2894                 :             /* ALTER TABLE <name> REPLICA IDENTITY */
 3439 rhaas                    2895                 :             | REPLICA IDENTITY_P replica_identity
                               2896                 :                 {
 3439 rhaas                    2897 GIC         198 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2898                 : 
                               2899             198 :                     n->subtype = AT_ReplicaIdentity;
 3439 rhaas                    2900 CBC         198 :                     n->def = $3;
  331 peter                    2901             198 :                     $$ = (Node *) n;
                               2902                 :                 }
 3124 sfrost                   2903 ECB             :             /* ALTER TABLE <name> ENABLE ROW LEVEL SECURITY */
                               2904                 :             | ENABLE_P ROW LEVEL SECURITY
                               2905                 :                 {
 3124 sfrost                   2906 CBC         135 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2907                 : 
 3124 sfrost                   2908 GIC         135 :                     n->subtype = AT_EnableRowSecurity;
  331 peter                    2909             135 :                     $$ = (Node *) n;
                               2910                 :                 }
 3124 sfrost                   2911 ECB             :             /* ALTER TABLE <name> DISABLE ROW LEVEL SECURITY */
                               2912                 :             | DISABLE_P ROW LEVEL SECURITY
                               2913                 :                 {
 3124 sfrost                   2914 CBC           4 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2915                 : 
 3124 sfrost                   2916 GIC           4 :                     n->subtype = AT_DisableRowSecurity;
  331 peter                    2917               4 :                     $$ = (Node *) n;
                               2918                 :                 }
 2744 sfrost                   2919 ECB             :             /* ALTER TABLE <name> FORCE ROW LEVEL SECURITY */
                               2920                 :             | FORCE ROW LEVEL SECURITY
                               2921                 :                 {
 2744 sfrost                   2922 CBC          40 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2923 ECB             : 
 2744 sfrost                   2924 GIC          40 :                     n->subtype = AT_ForceRowSecurity;
  331 peter                    2925              40 :                     $$ = (Node *) n;
                               2926                 :                 }
                               2927                 :             /* ALTER TABLE <name> NO FORCE ROW LEVEL SECURITY */
 2744 sfrost                   2928 ECB             :             | NO FORCE ROW LEVEL SECURITY
                               2929                 :                 {
 2744 sfrost                   2930 CBC          15 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
  331 peter                    2931 ECB             : 
 2744 sfrost                   2932 CBC          15 :                     n->subtype = AT_NoForceRowSecurity;
  331 peter                    2933 GIC          15 :                     $$ = (Node *) n;
                               2934                 :                 }
                               2935                 :             | alter_generic_options
                               2936                 :                 {
 4481 rhaas                    2937 CBC          26 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               2938                 : 
                               2939              26 :                     n->subtype = AT_GenericOptions;
  331 peter                    2940              26 :                     n->def = (Node *) $1;
 4481 rhaas                    2941              26 :                     $$ = (Node *) n;
                               2942                 :                 }
                               2943                 :         ;
                               2944                 : 
                               2945                 : alter_column_default:
 5641 tgl                      2946             166 :             SET DEFAULT a_expr          { $$ = $3; }
 6913 tgl                      2947 GIC          90 :             | DROP DEFAULT              { $$ = NULL; }
 7601 bruce                    2948 ECB             :         ;
 8484 peter_e                  2949                 : 
                               2950                 : opt_collate_clause:
 4414 tgl                      2951                 :             COLLATE any_name
                               2952                 :                 {
 4414 tgl                      2953 CBC           9 :                     CollateClause *n = makeNode(CollateClause);
                               2954                 : 
 4414 tgl                      2955 GIC           9 :                     n->arg = NULL;
 4412                          2956               9 :                     n->collname = $2;
 4414                          2957               9 :                     n->location = @1;
 4414 tgl                      2958 CBC           9 :                     $$ = (Node *) n;
                               2959                 :                 }
                               2960            2058 :             | /* EMPTY */               { $$ = NULL; }
 4414 tgl                      2961 ECB             :         ;
                               2962                 : 
                               2963                 : alter_using:
 6913 tgl                      2964 GIC          75 :             USING a_expr                { $$ = $2; }
                               2965             337 :             | /* EMPTY */               { $$ = NULL; }
                               2966                 :         ;
 9334 lockhart                 2967 ECB             : 
                               2968                 : replica_identity:
 3439 rhaas                    2969                 :             NOTHING
                               2970                 :                 {
 3439 rhaas                    2971 GIC          18 :                     ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
                               2972                 : 
                               2973              18 :                     n->identity_type = REPLICA_IDENTITY_NOTHING;
                               2974              18 :                     n->name = NULL;
 3439 rhaas                    2975 CBC          18 :                     $$ = (Node *) n;
                               2976                 :                 }
 3439 rhaas                    2977 ECB             :             | FULL
                               2978                 :                 {
 3439 rhaas                    2979 GIC          61 :                     ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
                               2980                 : 
                               2981              61 :                     n->identity_type = REPLICA_IDENTITY_FULL;
                               2982              61 :                     n->name = NULL;
 3439 rhaas                    2983 CBC          61 :                     $$ = (Node *) n;
                               2984                 :                 }
 3439 rhaas                    2985 ECB             :             | DEFAULT
                               2986                 :                 {
 3439 rhaas                    2987 GIC           3 :                     ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
                               2988                 : 
                               2989               3 :                     n->identity_type = REPLICA_IDENTITY_DEFAULT;
                               2990               3 :                     n->name = NULL;
 3439 rhaas                    2991 CBC           3 :                     $$ = (Node *) n;
                               2992                 :                 }
 3439 rhaas                    2993 ECB             :             | USING INDEX name
                               2994                 :                 {
 3439 rhaas                    2995 GIC         116 :                     ReplicaIdentityStmt *n = makeNode(ReplicaIdentityStmt);
                               2996                 : 
                               2997             116 :                     n->identity_type = REPLICA_IDENTITY_INDEX;
 3439 rhaas                    2998 CBC         116 :                     n->name = $3;
 3439 rhaas                    2999 GIC         116 :                     $$ = (Node *) n;
 3439 rhaas                    3000 ECB             :                 }
                               3001                 : ;
                               3002                 : 
                               3003                 : reloptions:
 4177 peter_e                  3004 GIC        1967 :             '(' reloption_list ')'                  { $$ = $2; }
                               3005                 :         ;
                               3006                 : 
 5179 alvherre                 3007 CBC        1201 : opt_reloptions:     WITH reloptions                 { $$ = $2; }
                               3008           46019 :              |      /* EMPTY */                     { $$ = NIL; }
                               3009                 :         ;
                               3010                 : 
                               3011                 : reloption_list:
 5179 alvherre                 3012 GIC        1967 :             reloption_elem                          { $$ = list_make1($1); }
                               3013             110 :             | reloption_list ',' reloption_elem     { $$ = lappend($1, $3); }
 5179 alvherre                 3014 ECB             :         ;
                               3015                 : 
 5118 tgl                      3016                 : /* This should match def_elem and also allow qualified names */
 4934                          3017                 : reloption_elem:
 5179 alvherre                 3018                 :             ColLabel '=' def_arg
                               3019                 :                 {
 2406 peter_e                  3020 GIC         998 :                     $$ = makeDefElem($1, (Node *) $3, @1);
 5179 alvherre                 3021 ECB             :                 }
                               3022                 :             | ColLabel
                               3023                 :                 {
 2406 peter_e                  3024 GIC        1045 :                     $$ = makeDefElem($1, NULL, @1);
 5179 alvherre                 3025 ECB             :                 }
                               3026                 :             | ColLabel '.' ColLabel '=' def_arg
                               3027                 :                 {
 5118 tgl                      3028 GIC          31 :                     $$ = makeDefElemExtended($1, $3, (Node *) $5,
 2406 peter_e                  3029              31 :                                              DEFELEM_UNSPEC, @1);
                               3030                 :                 }
                               3031                 :             | ColLabel '.' ColLabel
 5179 alvherre                 3032 ECB             :                 {
 2406 peter_e                  3033 GIC           3 :                     $$ = makeDefElemExtended($1, $3, NULL, DEFELEM_UNSPEC, @1);
 5179 alvherre                 3034 ECB             :                 }
                               3035                 :         ;
 6806 bruce                    3036                 : 
                               3037                 : alter_identity_column_option_list:
                               3038                 :             alter_identity_column_option
 2194 peter_e                  3039 GIC          19 :                 { $$ = list_make1($1); }
 2194 peter_e                  3040 ECB             :             | alter_identity_column_option_list alter_identity_column_option
 2194 peter_e                  3041 GIC          12 :                 { $$ = lappend($1, $2); }
 2194 peter_e                  3042 ECB             :         ;
                               3043                 : 
                               3044                 : alter_identity_column_option:
                               3045                 :             RESTART
                               3046                 :                 {
 2194 peter_e                  3047 GIC           6 :                     $$ = makeDefElem("restart", NULL, @1);
 2194 peter_e                  3048 ECB             :                 }
                               3049                 :             | RESTART opt_with NumericOnly
                               3050                 :                 {
  331 peter                    3051 LBC           0 :                     $$ = makeDefElem("restart", (Node *) $3, @1);
 2194 peter_e                  3052 ECB             :                 }
                               3053                 :             | SET SeqOptElem
                               3054                 :                 {
 2194 peter_e                  3055 GIC          12 :                     if (strcmp($2->defname, "as") == 0 ||
 2194 peter_e                  3056 CBC          12 :                         strcmp($2->defname, "restart") == 0 ||
 2194 peter_e                  3057 GIC          12 :                         strcmp($2->defname, "owned_by") == 0)
 2194 peter_e                  3058 LBC           0 :                         ereport(ERROR,
 2194 peter_e                  3059 ECB             :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3060                 :                                  errmsg("sequence option \"%s\" not supported here", $2->defname),
                               3061                 :                                  parser_errposition(@2)));
 2194 peter_e                  3062 GIC          12 :                     $$ = $2;
                               3063                 :                 }
                               3064                 :             | SET GENERATED generated_when
 2194 peter_e                  3065 ECB             :                 {
 2194 peter_e                  3066 GIC          13 :                     $$ = makeDefElem("generated", (Node *) makeInteger($3), @1);
                               3067                 :                 }
 2194 peter_e                  3068 ECB             :         ;
                               3069                 : 
                               3070                 : PartitionBoundSpec:
                               3071                 :             /* a HASH partition */
                               3072                 :             FOR VALUES WITH '(' hash_partbound ')'
 1977 rhaas                    3073                 :                 {
                               3074                 :                     ListCell   *lc;
 1977 rhaas                    3075 GIC         296 :                     PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
                               3076                 : 
                               3077             296 :                     n->strategy = PARTITION_STRATEGY_HASH;
                               3078             296 :                     n->modulus = n->remainder = -1;
                               3079                 : 
                               3080             888 :                     foreach (lc, $5)
 1977 rhaas                    3081 ECB             :                     {
 1977 rhaas                    3082 GIC         592 :                         DefElem    *opt = lfirst_node(DefElem, lc);
                               3083                 : 
                               3084             592 :                         if (strcmp(opt->defname, "modulus") == 0)
 1977 rhaas                    3085 ECB             :                         {
 1977 rhaas                    3086 GIC         296 :                             if (n->modulus != -1)
 1977 rhaas                    3087 UIC           0 :                                 ereport(ERROR,
                               3088                 :                                         (errcode(ERRCODE_DUPLICATE_OBJECT),
 1977 rhaas                    3089 ECB             :                                          errmsg("modulus for hash partition provided more than once"),
                               3090                 :                                          parser_errposition(opt->location)));
 1977 rhaas                    3091 GIC         296 :                             n->modulus = defGetInt32(opt);
                               3092                 :                         }
                               3093             296 :                         else if (strcmp(opt->defname, "remainder") == 0)
 1977 rhaas                    3094 ECB             :                         {
 1977 rhaas                    3095 GIC         296 :                             if (n->remainder != -1)
 1977 rhaas                    3096 UIC           0 :                                 ereport(ERROR,
                               3097                 :                                         (errcode(ERRCODE_DUPLICATE_OBJECT),
                               3098                 :                                          errmsg("remainder for hash partition provided more than once"),
                               3099                 :                                          parser_errposition(opt->location)));
 1977 rhaas                    3100 CBC         296 :                             n->remainder = defGetInt32(opt);
                               3101                 :                         }
 1977 rhaas                    3102 ECB             :                         else
 1977 rhaas                    3103 UIC           0 :                             ereport(ERROR,
                               3104                 :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                               3105                 :                                      errmsg("unrecognized hash partition bound specification \"%s\"",
                               3106                 :                                             opt->defname),
                               3107                 :                                      parser_errposition(opt->location)));
 1977 rhaas                    3108 ECB             :                     }
                               3109                 : 
 1977 rhaas                    3110 GIC         296 :                     if (n->modulus == -1)
 1977 rhaas                    3111 UIC           0 :                         ereport(ERROR,
 1977 rhaas                    3112 EUB             :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3113                 :                                  errmsg("modulus for hash partition must be specified")));
 1977 rhaas                    3114 GIC         296 :                     if (n->remainder == -1)
 1977 rhaas                    3115 UIC           0 :                         ereport(ERROR,
 1977 rhaas                    3116 ECB             :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3117                 :                                  errmsg("remainder for hash partition must be specified")));
                               3118                 : 
 1977 rhaas                    3119 GBC         296 :                     n->location = @3;
                               3120                 : 
 1977 rhaas                    3121 GIC         296 :                     $$ = n;
                               3122                 :                 }
 1977 rhaas                    3123 ECB             : 
                               3124                 :             /* a LIST partition */
                               3125                 :             | FOR VALUES IN_P '(' expr_list ')'
                               3126                 :                 {
 2314 rhaas                    3127 CBC        2195 :                     PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
                               3128                 : 
 2314 rhaas                    3129 GIC        2195 :                     n->strategy = PARTITION_STRATEGY_LIST;
 2039                          3130            2195 :                     n->is_default = false;
 2314                          3131            2195 :                     n->listdatums = $5;
                               3132            2195 :                     n->location = @3;
                               3133                 : 
 2142 tgl                      3134            2195 :                     $$ = n;
                               3135                 :                 }
 2314 rhaas                    3136 ECB             : 
                               3137                 :             /* a RANGE partition */
 1535 peter                    3138                 :             | FOR VALUES FROM '(' expr_list ')' TO '(' expr_list ')'
 2314 rhaas                    3139                 :                 {
 2314 rhaas                    3140 GIC        1897 :                     PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
 2314 rhaas                    3141 ECB             : 
 2314 rhaas                    3142 GIC        1897 :                     n->strategy = PARTITION_STRATEGY_RANGE;
 2039 rhaas                    3143 CBC        1897 :                     n->is_default = false;
 2314 rhaas                    3144 GIC        1897 :                     n->lowerdatums = $5;
 2314 rhaas                    3145 CBC        1897 :                     n->upperdatums = $9;
 2314 rhaas                    3146 GIC        1897 :                     n->location = @3;
 2314 rhaas                    3147 ECB             : 
 2039 rhaas                    3148 GBC        1897 :                     $$ = n;
                               3149                 :                 }
                               3150                 : 
                               3151                 :             /* a DEFAULT partition */
 2039 rhaas                    3152 ECB             :             | DEFAULT
                               3153                 :                 {
 2039 rhaas                    3154 CBC         284 :                     PartitionBoundSpec *n = makeNode(PartitionBoundSpec);
                               3155                 : 
                               3156             284 :                     n->is_default = true;
 2039 rhaas                    3157 GBC         284 :                     n->location = @1;
                               3158                 : 
 2142 tgl                      3159 GIC         284 :                     $$ = n;
                               3160                 :                 }
 2314 rhaas                    3161 ECB             :         ;
                               3162                 : 
                               3163                 : hash_partbound_elem:
 1977 rhaas                    3164 EUB             :         NonReservedWord Iconst
                               3165                 :             {
  331 peter                    3166 GIC         592 :                 $$ = makeDefElem($1, (Node *) makeInteger($2), @1);
                               3167                 :             }
                               3168                 :         ;
                               3169                 : 
                               3170                 : hash_partbound:
 1977 rhaas                    3171 ECB             :         hash_partbound_elem
 1977 rhaas                    3172 EUB             :             {
 1977 rhaas                    3173 GIC         296 :                 $$ = list_make1($1);
                               3174                 :             }
 1977 rhaas                    3175 ECB             :         | hash_partbound ',' hash_partbound_elem
 1977 rhaas                    3176 EUB             :             {
 1977 rhaas                    3177 GIC         296 :                 $$ = lappend($1, $3);
                               3178                 :             }
                               3179                 :         ;
 1977 rhaas                    3180 ECB             : 
                               3181                 : /*****************************************************************************
 4578 peter_e                  3182                 :  *
                               3183                 :  *  ALTER TYPE
                               3184                 :  *
                               3185                 :  * really variants of the ALTER TABLE subcommands with different spellings
                               3186                 :  *****************************************************************************/
                               3187                 : 
                               3188                 : AlterCompositeTypeStmt:
                               3189                 :             ALTER TYPE_P any_name alter_type_cmds
                               3190                 :                 {
 4578 peter_e                  3191 CBC         104 :                     AlterTableStmt *n = makeNode(AlterTableStmt);
 4578 peter_e                  3192 ECB             : 
                               3193                 :                     /* can't use qualified_name, sigh */
 4578 peter_e                  3194 GIC         104 :                     n->relation = makeRangeVarFromAnyName($3, @3, yyscanner);
 4578 peter_e                  3195 CBC         104 :                     n->cmds = $4;
 1002 michael                  3196 GIC         104 :                     n->objtype = OBJECT_TYPE;
  331 peter                    3197             104 :                     $$ = (Node *) n;
                               3198                 :                 }
                               3199                 :             ;
                               3200                 : 
 4578 peter_e                  3201 ECB             : alter_type_cmds:
 4578 peter_e                  3202 GIC         104 :             alter_type_cmd                          { $$ = list_make1($1); }
 4578 peter_e                  3203 CBC           6 :             | alter_type_cmds ',' alter_type_cmd    { $$ = lappend($1, $3); }
 4578 peter_e                  3204 ECB             :         ;
                               3205                 : 
                               3206                 : alter_type_cmd:
 4520                          3207                 :             /* ALTER TYPE <name> ADD ATTRIBUTE <coldef> [RESTRICT|CASCADE] */
                               3208                 :             ADD_P ATTRIBUTE TableFuncElement opt_drop_behavior
 4578                          3209                 :                 {
 4578 peter_e                  3210 GIC          32 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               3211                 : 
                               3212              32 :                     n->subtype = AT_AddColumn;
                               3213              32 :                     n->def = $3;
 4520                          3214              32 :                     n->behavior = $4;
  331 peter                    3215 CBC          32 :                     $$ = (Node *) n;
                               3216                 :                 }
 4520 peter_e                  3217 ECB             :             /* ALTER TYPE <name> DROP ATTRIBUTE IF EXISTS <attname> [RESTRICT|CASCADE] */
                               3218                 :             | DROP ATTRIBUTE IF_P EXISTS ColId opt_drop_behavior
                               3219                 :                 {
 4578 peter_e                  3220 CBC           3 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               3221                 : 
 4578 peter_e                  3222 GIC           3 :                     n->subtype = AT_DropColumn;
                               3223               3 :                     n->name = $5;
 4520                          3224               3 :                     n->behavior = $6;
 2062                          3225               3 :                     n->missing_ok = true;
  331 peter                    3226               3 :                     $$ = (Node *) n;
 4578 peter_e                  3227 ECB             :                 }
                               3228                 :             /* ALTER TYPE <name> DROP ATTRIBUTE <attname> [RESTRICT|CASCADE] */
                               3229                 :             | DROP ATTRIBUTE ColId opt_drop_behavior
                               3230                 :                 {
 4578 peter_e                  3231 GIC          38 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
                               3232                 : 
                               3233              38 :                     n->subtype = AT_DropColumn;
 4578 peter_e                  3234 CBC          38 :                     n->name = $3;
 4520 peter_e                  3235 GIC          38 :                     n->behavior = $4;
 2062                          3236              38 :                     n->missing_ok = false;
  331 peter                    3237              38 :                     $$ = (Node *) n;
 4578 peter_e                  3238 ECB             :                 }
                               3239                 :             /* ALTER TYPE <name> ALTER ATTRIBUTE <attname> [SET DATA] TYPE <typename> [RESTRICT|CASCADE] */
                               3240                 :             | ALTER ATTRIBUTE ColId opt_set_data TYPE_P Typename opt_collate_clause opt_drop_behavior
                               3241                 :                 {
 4578 peter_e                  3242 GIC          37 :                     AlterTableCmd *n = makeNode(AlterTableCmd);
 4414 tgl                      3243              37 :                     ColumnDef *def = makeNode(ColumnDef);
                               3244                 : 
 4578 peter_e                  3245              37 :                     n->subtype = AT_AlterColumnType;
                               3246              37 :                     n->name = $3;
 4414 tgl                      3247              37 :                     n->def = (Node *) def;
                               3248              37 :                     n->behavior = $8;
                               3249                 :                     /* We only use these fields of the ColumnDef node */
                               3250              37 :                     def->typeName = $6;
                               3251              37 :                     def->collClause = (CollateClause *) $7;
 4414 tgl                      3252 CBC          37 :                     def->raw_default = NULL;
 3426 tgl                      3253 GIC          37 :                     def->location = @3;
  331 peter                    3254              37 :                     $$ = (Node *) n;
 4578 peter_e                  3255 ECB             :                 }
                               3256                 :         ;
                               3257                 : 
                               3258                 : 
                               3259                 : /*****************************************************************************
                               3260                 :  *
                               3261                 :  *      QUERY :
                               3262                 :  *              close <portalname>
 9351 lockhart                 3263                 :  *
 9770 scrappy                  3264                 :  *****************************************************************************/
                               3265                 : 
                               3266                 : ClosePortalStmt:
                               3267                 :             CLOSE cursor_name
                               3268                 :                 {
 9344 bruce                    3269 GIC        1045 :                     ClosePortalStmt *n = makeNode(ClosePortalStmt);
                               3270                 : 
 9344 bruce                    3271 CBC        1045 :                     n->portalname = $2;
  331 peter                    3272 GIC        1045 :                     $$ = (Node *) n;
 9344 bruce                    3273 ECB             :                 }
 5841 neilc                    3274                 :             | CLOSE ALL
                               3275                 :                 {
 5841 neilc                    3276 CBC           6 :                     ClosePortalStmt *n = makeNode(ClosePortalStmt);
                               3277                 : 
 5841 neilc                    3278 GIC           6 :                     n->portalname = NULL;
  331 peter                    3279               6 :                     $$ = (Node *) n;
                               3280                 :                 }
 9344 bruce                    3281 ECB             :         ;
                               3282                 : 
 9770 scrappy                  3283                 : 
                               3284                 : /*****************************************************************************
                               3285                 :  *
 9344 bruce                    3286                 :  *      QUERY :
 4948 tgl                      3287                 :  *              COPY relname [(columnList)] FROM/TO file [WITH] [(options)]
                               3288                 :  *              COPY ( query ) TO file  [WITH] [(options)]
                               3289                 :  *
                               3290                 :  *              where 'query' can be one of:
                               3291                 :  *              { SELECT | UPDATE | INSERT | DELETE }
 2690 teodor                   3292                 :  *
                               3293                 :  *              and 'file' can be one of:
 3693 heikki.linnakangas       3294                 :  *              { PROGRAM 'command' | STDIN | STDOUT | 'filename' }
 7598 bruce                    3295                 :  *
 4948 tgl                      3296                 :  *              In the preferred syntax the options are comma-separated
 4799                          3297                 :  *              and use generic identifiers instead of keywords.  The pre-9.0
 4948                          3298                 :  *              syntax had a hard-wired, space-separated set of options.
                               3299                 :  *
                               3300                 :  *              Really old syntax, from versions 7.2 and prior:
                               3301                 :  *              COPY [ BINARY ] table FROM/TO file
                               3302                 :  *                  [ [ USING ] DELIMITERS 'delimiter' ] ]
                               3303                 :  *                  [ WITH NULL AS 'null string' ]
 2690 teodor                   3304                 :  *              This option placement is not supported with COPY (query...).
                               3305                 :  *
 9770 scrappy                  3306                 :  *****************************************************************************/
                               3307                 : 
 1601 andres                   3308                 : CopyStmt:   COPY opt_binary qualified_name opt_column_list
 1541 tomas.vondra             3309                 :             copy_from opt_program copy_file_name copy_delimiter opt_with
                               3310                 :             copy_options where_clause
 9344 bruce                    3311                 :                 {
 9344 bruce                    3312 CBC        4319 :                     CopyStmt *n = makeNode(CopyStmt);
  331 peter                    3313 ECB             : 
 7689 tgl                      3314 CBC        4319 :                     n->relation = $3;
 6066                          3315            4319 :                     n->query = NULL;
 7570 bruce                    3316 GIC        4319 :                     n->attlist = $4;
 1601 andres                   3317            4319 :                     n->is_from = $5;
                               3318            4319 :                     n->is_program = $6;
                               3319            4319 :                     n->filename = $7;
 1541 tomas.vondra             3320            4319 :                     n->whereClause = $11;
                               3321                 : 
 3693 heikki.linnakangas       3322            4319 :                     if (n->is_program && n->filename == NULL)
 3693 heikki.linnakangas       3323 UIC           0 :                         ereport(ERROR,
                               3324                 :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3325                 :                                  errmsg("STDIN/STDOUT not allowed with PROGRAM"),
                               3326                 :                                  parser_errposition(@8)));
                               3327                 : 
 1541 tomas.vondra             3328 GIC        4319 :                     if (!n->is_from && n->whereClause != NULL)
                               3329               3 :                         ereport(ERROR,
 1541 tomas.vondra             3330 ECB             :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3331                 :                                  errmsg("WHERE clause not allowed with COPY TO"),
                               3332                 :                                  parser_errposition(@11)));
                               3333                 : 
 7598 bruce                    3334 GIC        4316 :                     n->options = NIL;
                               3335                 :                     /* Concatenate user-supplied flags */
                               3336            4316 :                     if ($2)
 7598 bruce                    3337 CBC           6 :                         n->options = lappend(n->options, $2);
 1601 andres                   3338 GIC        4316 :                     if ($8)
 1601 andres                   3339 LBC           0 :                         n->options = lappend(n->options, $8);
 1601 andres                   3340 CBC        4316 :                     if ($10)
 1601 andres                   3341 GIC         344 :                         n->options = list_concat(n->options, $10);
  331 peter                    3342            4316 :                     $$ = (Node *) n;
                               3343                 :                 }
                               3344                 :             | COPY '(' PreparableStmt ')' TO opt_program copy_file_name opt_with copy_options
                               3345                 :                 {
 6066 tgl                      3346             196 :                     CopyStmt *n = makeNode(CopyStmt);
                               3347                 : 
                               3348             196 :                     n->relation = NULL;
 2690 teodor                   3349             196 :                     n->query = $3;
 6066 tgl                      3350             196 :                     n->attlist = NIL;
                               3351             196 :                     n->is_from = false;
 2690 teodor                   3352             196 :                     n->is_program = $6;
                               3353             196 :                     n->filename = $7;
                               3354             196 :                     n->options = $9;
                               3355                 : 
 3693 heikki.linnakangas       3356             196 :                     if (n->is_program && n->filename == NULL)
 3693 heikki.linnakangas       3357 UIC           0 :                         ereport(ERROR,
                               3358                 :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3359                 :                                  errmsg("STDIN/STDOUT not allowed with PROGRAM"),
                               3360                 :                                  parser_errposition(@5)));
                               3361                 : 
  331 peter                    3362 GIC         196 :                     $$ = (Node *) n;
                               3363                 :                 }
                               3364                 :         ;
                               3365                 : 
                               3366                 : copy_from:
 2062 peter_e                  3367             963 :             FROM                                    { $$ = true; }
                               3368            3356 :             | TO                                    { $$ = false; }
                               3369                 :         ;
                               3370                 : 
                               3371                 : opt_program:
 2062 peter_e                  3372 UIC           0 :             PROGRAM                                 { $$ = true; }
 2062 peter_e                  3373 CBC        4515 :             | /* EMPTY */                           { $$ = false; }
                               3374                 :         ;
 3693 heikki.linnakangas       3375 ECB             : 
 9351 lockhart                 3376                 : /*
 9770 scrappy                  3377                 :  * copy_file_name NULL indicates stdio is used. Whether stdin or stdout is
                               3378                 :  * used depends on the direction. (It really doesn't make sense to copy from
 6066 tgl                      3379                 :  * stdout. We silently correct the "typo".)        - AY 9/94
 9770 scrappy                  3380                 :  */
 7601 bruce                    3381                 : copy_file_name:
 7601 bruce                    3382 GIC         451 :             Sconst                                  { $$ = $1; }
 7601 bruce                    3383 CBC         547 :             | STDIN                                 { $$ = NULL; }
 7601 bruce                    3384 GBC        3517 :             | STDOUT                                { $$ = NULL; }
                               3385                 :         ;
                               3386                 : 
 4948 tgl                      3387 GIC        4314 : copy_options: copy_opt_list                         { $$ = $1; }
                               3388             201 :             | '(' copy_generic_opt_list ')'         { $$ = $2; }
 4948 tgl                      3389 ECB             :         ;
 7598 bruce                    3390                 : 
                               3391                 : /* old COPY option syntax */
                               3392                 : copy_opt_list:
 7598 bruce                    3393 GIC         248 :             copy_opt_list copy_opt_item             { $$ = lappend($1, $2); }
                               3394            4314 :             | /* EMPTY */                           { $$ = NIL; }
 9344 bruce                    3395 ECB             :         ;
                               3396                 : 
 7598                          3397                 : copy_opt_item:
                               3398                 :             BINARY
                               3399                 :                 {
  331 peter                    3400 UBC           0 :                     $$ = makeDefElem("format", (Node *) makeString("binary"), @1);
 7598 bruce                    3401 ECB             :                 }
 3781 simon                    3402                 :             | FREEZE
                               3403                 :                 {
  331 peter                    3404 GIC          25 :                     $$ = makeDefElem("freeze", (Node *) makeBoolean(true), @1);
                               3405                 :                 }
                               3406                 :             | DELIMITER opt_as Sconst
 7598 bruce                    3407 ECB             :                 {
  331 peter                    3408 GIC          85 :                     $$ = makeDefElem("delimiter", (Node *) makeString($3), @1);
 7598 bruce                    3409 ECB             :                 }
                               3410                 :             | NULL_P opt_as Sconst
                               3411                 :                 {
  331 peter                    3412 CBC          24 :                     $$ = makeDefElem("null", (Node *) makeString($3), @1);
 7598 bruce                    3413 ECB             :                 }
 6929                          3414                 :             | CSV
                               3415                 :                 {
  331 peter                    3416 GIC          72 :                     $$ = makeDefElem("format", (Node *) makeString("csv"), @1);
 6929 bruce                    3417 ECB             :                 }
 6312 bruce                    3418 EUB             :             | HEADER_P
                               3419                 :                 {
  331 peter                    3420 GIC           9 :                     $$ = makeDefElem("header", (Node *) makeBoolean(true), @1);
                               3421                 :                 }
                               3422                 :             | QUOTE opt_as Sconst
 6929 bruce                    3423 ECB             :                 {
  331 peter                    3424 GIC           9 :                     $$ = makeDefElem("quote", (Node *) makeString($3), @1);
                               3425                 :                 }
                               3426                 :             | ESCAPE opt_as Sconst
                               3427                 :                 {
  331 peter                    3428 CBC           9 :                     $$ = makeDefElem("escape", (Node *) makeString($3), @1);
 6929 bruce                    3429 ECB             :                 }
                               3430                 :             | FORCE QUOTE columnList
                               3431                 :                 {
  331 peter                    3432 GIC           6 :                     $$ = makeDefElem("force_quote", (Node *) $3, @1);
 6929 bruce                    3433 EUB             :                 }
 5006 andrew                   3434 ECB             :             | FORCE QUOTE '*'
                               3435                 :                 {
  331 peter                    3436 GIC           3 :                     $$ = makeDefElem("force_quote", (Node *) makeNode(A_Star), @1);
                               3437                 :                 }
                               3438                 :             | FORCE NOT NULL_P columnList
                               3439                 :                 {
  331 peter                    3440 UIC           0 :                     $$ = makeDefElem("force_not_null", (Node *) $4, @1);
                               3441                 :                 }
                               3442                 :             | FORCE NULL_P columnList
 3323 andrew                   3443 ECB             :                 {
  331 peter                    3444 LBC           0 :                     $$ = makeDefElem("force_null", (Node *) $3, @1);
 3323 andrew                   3445 ECB             :                 }
                               3446                 :             | ENCODING Sconst
                               3447                 :                 {
  331 peter                    3448 CBC           6 :                     $$ = makeDefElem("encoding", (Node *) makeString($2), @1);
 4430 itagaki.takahiro         3449 ECB             :                 }
                               3450                 :         ;
                               3451                 : 
                               3452                 : /* The following exist for backward compatibility with very old versions */
                               3453                 : 
 7598 bruce                    3454                 : opt_binary:
                               3455                 :             BINARY
                               3456                 :                 {
  331 peter                    3457 GIC           6 :                     $$ = makeDefElem("format", (Node *) makeString("binary"), @1);
                               3458                 :                 }
 7598 bruce                    3459            4313 :             | /*EMPTY*/                             { $$ = NULL; }
                               3460                 :         ;
 7598 bruce                    3461 EUB             : 
                               3462                 : copy_delimiter:
                               3463                 :             opt_using DELIMITERS Sconst
                               3464                 :                 {
  331 peter                    3465 LBC           0 :                     $$ = makeDefElem("delimiter", (Node *) makeString($3), @2);
                               3466                 :                 }
 7598 bruce                    3467 GIC        4319 :             | /*EMPTY*/                             { $$ = NULL; }
                               3468                 :         ;
 9770 scrappy                  3469 ECB             : 
                               3470                 : opt_using:
                               3471                 :             USING
                               3472                 :             | /*EMPTY*/
 8563 bruce                    3473                 :         ;
                               3474                 : 
                               3475                 : /* new COPY option syntax */
                               3476                 : copy_generic_opt_list:
 4948 tgl                      3477                 :             copy_generic_opt_elem
                               3478                 :                 {
 4948 tgl                      3479 GIC         201 :                     $$ = list_make1($1);
                               3480                 :                 }
 4948 tgl                      3481 ECB             :             | copy_generic_opt_list ',' copy_generic_opt_elem
                               3482                 :                 {
 4948 tgl                      3483 GIC         141 :                     $$ = lappend($1, $3);
                               3484                 :                 }
 4948 tgl                      3485 ECB             :         ;
                               3486                 : 
                               3487                 : copy_generic_opt_elem:
                               3488                 :             ColLabel copy_generic_opt_arg
                               3489                 :                 {
 2406 peter_e                  3490 GIC         342 :                     $$ = makeDefElem($1, $2, @1);
                               3491                 :                 }
                               3492                 :         ;
 4948 tgl                      3493 ECB             : 
                               3494                 : copy_generic_opt_arg:
 4552 heikki.linnakangas       3495 GIC         255 :             opt_boolean_or_string           { $$ = (Node *) makeString($1); }
 4948 tgl                      3496 UIC           0 :             | NumericOnly                   { $$ = (Node *) $1; }
 4948 tgl                      3497 CBC           9 :             | '*'                           { $$ = (Node *) makeNode(A_Star); }
 4948 tgl                      3498 GIC          69 :             | '(' copy_generic_opt_arg_list ')'     { $$ = (Node *) $2; }
                               3499               9 :             | /* EMPTY */                   { $$ = NULL; }
                               3500                 :         ;
 4948 tgl                      3501 EUB             : 
                               3502                 : copy_generic_opt_arg_list:
                               3503                 :               copy_generic_opt_arg_list_item
                               3504                 :                 {
 4948 tgl                      3505 GBC          69 :                     $$ = list_make1($1);
                               3506                 :                 }
                               3507                 :             | copy_generic_opt_arg_list ',' copy_generic_opt_arg_list_item
                               3508                 :                 {
 4948 tgl                      3509 CBC           6 :                     $$ = lappend($1, $3);
                               3510                 :                 }
                               3511                 :         ;
                               3512                 : 
                               3513                 : /* beware of emitting non-string list elements here; see commands/define.c */
                               3514                 : copy_generic_opt_arg_list_item:
 4552 heikki.linnakangas       3515 GIC          75 :             opt_boolean_or_string   { $$ = (Node *) makeString($1); }
                               3516                 :         ;
                               3517                 : 
 9770 scrappy                  3518 ECB             : 
                               3519                 : /*****************************************************************************
                               3520                 :  *
                               3521                 :  *      QUERY :
                               3522                 :  *              CREATE TABLE relname
                               3523                 :  *
                               3524                 :  *****************************************************************************/
                               3525                 : 
 7600 bruce                    3526 EUB             : CreateStmt: CREATE OptTemp TABLE qualified_name '(' OptTableElementList ')'
                               3527                 :             OptInherit OptPartitionSpec table_access_method_clause OptWith
 1495 andres                   3528 ECB             :             OnCommitOption OptTableSpace
                               3529                 :                 {
 9344 bruce                    3530 GIC       13410 :                     CreateStmt *n = makeNode(CreateStmt);
                               3531                 : 
 4500 rhaas                    3532           13410 :                     $4->relpersistence = $2;
 7689 tgl                      3533           13410 :                     n->relation = $4;
 8129                          3534           13410 :                     n->tableElts = $6;
 7689                          3535           13410 :                     n->inhRelations = $8;
 2314 rhaas                    3536           13410 :                     n->partspec = $9;
 2940 tgl                      3537           13410 :                     n->ofTypename = NULL;
 9257 lockhart                 3538           13410 :                     n->constraints = NIL;
 1495 andres                   3539           13410 :                     n->accessMethod = $10;
 1495 andres                   3540 CBC       13410 :                     n->options = $11;
 1495 andres                   3541 GIC       13410 :                     n->oncommit = $12;
                               3542           13410 :                     n->tablespacename = $13;
 4641 rhaas                    3543           13410 :                     n->if_not_exists = false;
  331 peter                    3544 CBC       13410 :                     $$ = (Node *) n;
                               3545                 :                 }
                               3546                 :         | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name '('
                               3547                 :             OptTableElementList ')' OptInherit OptPartitionSpec table_access_method_clause
                               3548                 :             OptWith OnCommitOption OptTableSpace
                               3549                 :                 {
 4641 rhaas                    3550 GIC          14 :                     CreateStmt *n = makeNode(CreateStmt);
  331 peter                    3551 ECB             : 
 4500 rhaas                    3552 GIC          14 :                     $7->relpersistence = $2;
 4641                          3553              14 :                     n->relation = $7;
                               3554              14 :                     n->tableElts = $9;
                               3555              14 :                     n->inhRelations = $11;
 2314 rhaas                    3556 CBC          14 :                     n->partspec = $12;
 2940 tgl                      3557 GBC          14 :                     n->ofTypename = NULL;
 4641 rhaas                    3558 CBC          14 :                     n->constraints = NIL;
 1495 andres                   3559              14 :                     n->accessMethod = $13;
                               3560              14 :                     n->options = $14;
 1495 andres                   3561 GIC          14 :                     n->oncommit = $15;
                               3562              14 :                     n->tablespacename = $16;
 4641 rhaas                    3563              14 :                     n->if_not_exists = true;
  331 peter                    3564              14 :                     $$ = (Node *) n;
                               3565                 :                 }
 4819 peter_e                  3566 ECB             :         | CREATE OptTemp TABLE qualified_name OF any_name
                               3567                 :             OptTypedTableElementList OptPartitionSpec table_access_method_clause
                               3568                 :             OptWith OnCommitOption OptTableSpace
                               3569                 :                 {
 7553 lockhart                 3570 CBC          55 :                     CreateStmt *n = makeNode(CreateStmt);
                               3571                 : 
 4500 rhaas                    3572 GIC          55 :                     $4->relpersistence = $2;
 7553 lockhart                 3573              55 :                     n->relation = $4;
 4819 peter_e                  3574              55 :                     n->tableElts = $7;
 2940 tgl                      3575              55 :                     n->inhRelations = NIL;
 2314 rhaas                    3576 CBC          55 :                     n->partspec = $8;
 4819 peter_e                  3577 GIC          55 :                     n->ofTypename = makeTypeNameFromNameList($6);
                               3578              55 :                     n->ofTypename->location = @6;
 7553 lockhart                 3579              55 :                     n->constraints = NIL;
 1495 andres                   3580              55 :                     n->accessMethod = $9;
                               3581              55 :                     n->options = $10;
                               3582              55 :                     n->oncommit = $11;
                               3583              55 :                     n->tablespacename = $12;
 4641 rhaas                    3584              55 :                     n->if_not_exists = false;
  331 peter                    3585              55 :                     $$ = (Node *) n;
                               3586                 :                 }
                               3587                 :         | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name OF any_name
                               3588                 :             OptTypedTableElementList OptPartitionSpec table_access_method_clause
                               3589                 :             OptWith OnCommitOption OptTableSpace
                               3590                 :                 {
 4641 rhaas                    3591 CBC           3 :                     CreateStmt *n = makeNode(CreateStmt);
                               3592                 : 
 4500                          3593               3 :                     $7->relpersistence = $2;
 4641                          3594               3 :                     n->relation = $7;
                               3595               3 :                     n->tableElts = $10;
 2940 tgl                      3596               3 :                     n->inhRelations = NIL;
 2314 rhaas                    3597               3 :                     n->partspec = $11;
 4641                          3598               3 :                     n->ofTypename = makeTypeNameFromNameList($9);
                               3599               3 :                     n->ofTypename->location = @9;
                               3600               3 :                     n->constraints = NIL;
 1495 andres                   3601               3 :                     n->accessMethod = $12;
                               3602               3 :                     n->options = $13;
                               3603               3 :                     n->oncommit = $14;
                               3604               3 :                     n->tablespacename = $15;
 2314 rhaas                    3605               3 :                     n->if_not_exists = true;
  331 peter                    3606 GIC           3 :                     $$ = (Node *) n;
                               3607                 :                 }
                               3608                 :         | CREATE OptTemp TABLE qualified_name PARTITION OF qualified_name
                               3609                 :             OptTypedTableElementList PartitionBoundSpec OptPartitionSpec
                               3610                 :             table_access_method_clause OptWith OnCommitOption OptTableSpace
 2314 rhaas                    3611 ECB             :                 {
 2314 rhaas                    3612 GIC        3580 :                     CreateStmt *n = makeNode(CreateStmt);
  331 peter                    3613 ECB             : 
 2314 rhaas                    3614 CBC        3580 :                     $4->relpersistence = $2;
                               3615            3580 :                     n->relation = $4;
                               3616            3580 :                     n->tableElts = $8;
                               3617            3580 :                     n->inhRelations = list_make1($7);
 2142 tgl                      3618            3580 :                     n->partbound = $9;
 2314 rhaas                    3619            3580 :                     n->partspec = $10;
                               3620            3580 :                     n->ofTypename = NULL;
                               3621            3580 :                     n->constraints = NIL;
 1495 andres                   3622            3580 :                     n->accessMethod = $11;
                               3623            3580 :                     n->options = $12;
                               3624            3580 :                     n->oncommit = $13;
                               3625            3580 :                     n->tablespacename = $14;
 2314 rhaas                    3626 GIC        3580 :                     n->if_not_exists = false;
  331 peter                    3627            3580 :                     $$ = (Node *) n;
                               3628                 :                 }
                               3629                 :         | CREATE OptTemp TABLE IF_P NOT EXISTS qualified_name PARTITION OF
                               3630                 :             qualified_name OptTypedTableElementList PartitionBoundSpec OptPartitionSpec
 1495 andres                   3631 ECB             :             table_access_method_clause OptWith OnCommitOption OptTableSpace
                               3632                 :                 {
 2314 rhaas                    3633 LBC           0 :                     CreateStmt *n = makeNode(CreateStmt);
  331 peter                    3634 ECB             : 
 2314 rhaas                    3635 LBC           0 :                     $7->relpersistence = $2;
                               3636               0 :                     n->relation = $7;
                               3637               0 :                     n->tableElts = $11;
                               3638               0 :                     n->inhRelations = list_make1($10);
 2142 tgl                      3639               0 :                     n->partbound = $12;
 2314 rhaas                    3640               0 :                     n->partspec = $13;
                               3641               0 :                     n->ofTypename = NULL;
                               3642               0 :                     n->constraints = NIL;
 1495 andres                   3643               0 :                     n->accessMethod = $14;
                               3644               0 :                     n->options = $15;
                               3645               0 :                     n->oncommit = $16;
                               3646               0 :                     n->tablespacename = $17;
 4641 rhaas                    3647 UIC           0 :                     n->if_not_exists = true;
  331 peter                    3648               0 :                     $$ = (Node *) n;
                               3649                 :                 }
                               3650                 :         ;
                               3651                 : 
 8439 tgl                      3652 ECB             : /*
                               3653                 :  * Redundancy here is needed to avoid shift/reduce conflicts,
                               3654                 :  * since TEMP is not a reserved word.  See also OptTempTableName.
 7280                          3655                 :  *
 3952                          3656                 :  * NOTE: we accept both GLOBAL and LOCAL options.  They currently do nothing,
                               3657                 :  * but future versions might consider GLOBAL to request SQL-spec-compliant
                               3658                 :  * temp table behavior, so warn about that.  Since we have no modules the
                               3659                 :  * LOCAL keyword is really meaningless; furthermore, some other products
                               3660                 :  * implement LOCAL as meaning the same as our default temp table behavior,
                               3661                 :  * so we'll probably continue to treat LOCAL as a noise word.
 8439                          3662                 :  */
 4500 rhaas                    3663 CBC         147 : OptTemp:    TEMPORARY                   { $$ = RELPERSISTENCE_TEMP; }
                               3664            1252 :             | TEMP                      { $$ = RELPERSISTENCE_TEMP; }
 3955 simon                    3665 LBC           0 :             | LOCAL TEMPORARY           { $$ = RELPERSISTENCE_TEMP; }
                               3666               0 :             | LOCAL TEMP                { $$ = RELPERSISTENCE_TEMP; }
 3952 tgl                      3667 ECB             :             | GLOBAL TEMPORARY
                               3668                 :                 {
 3952 tgl                      3669 UIC           0 :                     ereport(WARNING,
                               3670                 :                             (errmsg("GLOBAL is deprecated in temporary table creation"),
                               3671                 :                              parser_errposition(@1)));
                               3672               0 :                     $$ = RELPERSISTENCE_TEMP;
 3952 tgl                      3673 ECB             :                 }
                               3674                 :             | GLOBAL TEMP
                               3675                 :                 {
 3952 tgl                      3676 LBC           0 :                     ereport(WARNING,
 3952 tgl                      3677 ECB             :                             (errmsg("GLOBAL is deprecated in temporary table creation"),
                               3678                 :                              parser_errposition(@1)));
 3952 tgl                      3679 LBC           0 :                     $$ = RELPERSISTENCE_TEMP;
 3952 tgl                      3680 ECB             :                 }
 4484 rhaas                    3681 CBC          69 :             | UNLOGGED                  { $$ = RELPERSISTENCE_UNLOGGED; }
 4500                          3682           60671 :             | /*EMPTY*/                 { $$ = RELPERSISTENCE_PERMANENT; }
 8733 lockhart                 3683 ECB             :         ;
                               3684                 : 
 7601 bruce                    3685                 : OptTableElementList:
 7552 tgl                      3686 CBC       13006 :             TableElementList                    { $$ = $1; }
                               3687             618 :             | /*EMPTY*/                         { $$ = NIL; }
 7552 tgl                      3688 ECB             :         ;
                               3689                 : 
                               3690                 : OptTypedTableElementList:
 4819 peter_e                  3691 GIC         144 :             '(' TypedTableElementList ')'       { $$ = $2; }
                               3692            3537 :             | /*EMPTY*/                         { $$ = NIL; }
                               3693                 :         ;
 4819 peter_e                  3694 EUB             : 
                               3695                 : TableElementList:
 7528 tgl                      3696                 :             TableElement
 9132 lockhart                 3697                 :                 {
 6888 neilc                    3698 GBC       13030 :                     $$ = list_make1($1);
 9132 lockhart                 3699 EUB             :                 }
 7528 tgl                      3700                 :             | TableElementList ',' TableElement
 9132 lockhart                 3701                 :                 {
 7528 tgl                      3702 GBC       22068 :                     $$ = lappend($1, $3);
 9132 lockhart                 3703 EUB             :                 }
 9344 bruce                    3704                 :         ;
 9770 scrappy                  3705                 : 
 4819 peter_e                  3706                 : TypedTableElementList:
                               3707                 :             TypedTableElement
                               3708                 :                 {
 4819 peter_e                  3709 GBC         144 :                     $$ = list_make1($1);
                               3710                 :                 }
                               3711                 :             | TypedTableElementList ',' TypedTableElement
                               3712                 :                 {
 4819 peter_e                  3713 GIC          34 :                     $$ = lappend($1, $3);
                               3714                 :                 }
                               3715                 :         ;
                               3716                 : 
                               3717                 : TableElement:
 7601 bruce                    3718           33886 :             columnDef                           { $$ = $1; }
 7596 lockhart                 3719             348 :             | TableLikeClause                   { $$ = $1; }
 9257                          3720             864 :             | TableConstraint                   { $$ = $1; }
                               3721                 :         ;
                               3722                 : 
                               3723                 : TypedTableElement:
 4819 peter_e                  3724 CBC         143 :             columnOptions                       { $$ = $1; }
                               3725              35 :             | TableConstraint                   { $$ = $1; }
 4819 peter_e                  3726 EUB             :         ;
                               3727                 : 
                               3728                 : columnDef:  ColId Typename opt_column_storage opt_column_compression create_generic_options ColQualList
                               3729                 :                 {
 9257 lockhart                 3730 GBC       34789 :                     ColumnDef *n = makeNode(ColumnDef);
                               3731                 : 
 9257 lockhart                 3732 GIC       34789 :                     n->colname = $1;
 5015 peter_e                  3733 GBC       34789 :                     n->typeName = $2;
  270 peter                    3734 GNC       34789 :                     n->storage_name = $3;
                               3735           34789 :                     n->compression = $4;
 4414 tgl                      3736 GIC       34789 :                     n->inhcount = 0;
 7504                          3737           34789 :                     n->is_local = true;
 4414 tgl                      3738 GBC       34789 :                     n->is_not_null = false;
 4414 tgl                      3739 GIC       34789 :                     n->is_from_type = false;
                               3740           34789 :                     n->storage = 0;
 4414 tgl                      3741 GBC       34789 :                     n->raw_default = NULL;
 4414 tgl                      3742 GIC       34789 :                     n->cooked_default = NULL;
 4414 tgl                      3743 CBC       34789 :                     n->collOid = InvalidOid;
  270 peter                    3744 GNC       34789 :                     n->fdwoptions = $5;
                               3745           34789 :                     SplitColQualList($6, &n->constraints, &n->collClause,
                               3746                 :                                      yyscanner);
 3426 tgl                      3747 GIC       34789 :                     n->location = @1;
  331 peter                    3748 CBC       34789 :                     $$ = (Node *) n;
 9257 lockhart                 3749 ECB             :                 }
                               3750                 :         ;
                               3751                 : 
                               3752                 : columnOptions:  ColId ColQualList
 2173 sfrost                   3753                 :                 {
 2173 sfrost                   3754 CBC          60 :                     ColumnDef *n = makeNode(ColumnDef);
                               3755                 : 
 2173 sfrost                   3756 GIC          60 :                     n->colname = $1;
                               3757              60 :                     n->typeName = NULL;
                               3758              60 :                     n->inhcount = 0;
                               3759              60 :                     n->is_local = true;
 2173 sfrost                   3760 CBC          60 :                     n->is_not_null = false;
 2173 sfrost                   3761 GIC          60 :                     n->is_from_type = false;
                               3762              60 :                     n->storage = 0;
                               3763              60 :                     n->raw_default = NULL;
 2173 sfrost                   3764 CBC          60 :                     n->cooked_default = NULL;
 2173 sfrost                   3765 GIC          60 :                     n->collOid = InvalidOid;
                               3766              60 :                     SplitColQualList($2, &n->constraints, &n->collClause,
                               3767                 :                                      yyscanner);
                               3768              60 :                     n->location = @1;
  331 peter                    3769              60 :                     $$ = (Node *) n;
                               3770                 :                 }
 2173 sfrost                   3771 ECB             :                 | ColId WITH OPTIONS ColQualList
                               3772                 :                 {
 4819 peter_e                  3773 GIC          83 :                     ColumnDef *n = makeNode(ColumnDef);
                               3774                 : 
 4819 peter_e                  3775 CBC          83 :                     n->colname = $1;
 4414 tgl                      3776 GIC          83 :                     n->typeName = NULL;
                               3777              83 :                     n->inhcount = 0;
 4819 peter_e                  3778              83 :                     n->is_local = true;
 4414 tgl                      3779              83 :                     n->is_not_null = false;
 4414 tgl                      3780 CBC          83 :                     n->is_from_type = false;
                               3781              83 :                     n->storage = 0;
                               3782              83 :                     n->raw_default = NULL;
 4414 tgl                      3783 GIC          83 :                     n->cooked_default = NULL;
                               3784              83 :                     n->collOid = InvalidOid;
                               3785              83 :                     SplitColQualList($4, &n->constraints, &n->collClause,
 4414 tgl                      3786 ECB             :                                      yyscanner);
 3426 tgl                      3787 CBC          83 :                     n->location = @1;
  331 peter                    3788 GIC          83 :                     $$ = (Node *) n;
                               3789                 :                 }
                               3790                 :         ;
                               3791                 : 
  682 tgl                      3792 ECB             : column_compression:
  682 tgl                      3793 GIC          68 :             COMPRESSION ColId                       { $$ = $2; }
  682 tgl                      3794 CBC           3 :             | COMPRESSION DEFAULT                   { $$ = pstrdup("default"); }
  682 tgl                      3795 ECB             :         ;
                               3796                 : 
                               3797                 : opt_column_compression:
  682 tgl                      3798 CBC          38 :             column_compression                      { $$ = $1; }
                               3799           34781 :             | /*EMPTY*/                             { $$ = NULL; }
  682 tgl                      3800 ECB             :         ;
  751 rhaas                    3801                 : 
                               3802                 : column_storage:
  270 peter                    3803 GNC         107 :             STORAGE ColId                           { $$ = $2; }
  150 tgl                      3804               3 :             | STORAGE DEFAULT                       { $$ = pstrdup("default"); }
                               3805                 :         ;
                               3806                 : 
                               3807                 : opt_column_storage:
  270 peter                    3808               6 :             column_storage                          { $$ = $1; }
                               3809           34813 :             | /*EMPTY*/                             { $$ = NULL; }
                               3810                 :         ;
                               3811                 : 
 7601 bruce                    3812 ECB             : ColQualList:
 7601 bruce                    3813 CBC        9328 :             ColQualList ColConstraint               { $$ = lappend($1, $2); }
                               3814           36824 :             | /*EMPTY*/                             { $$ = NIL; }
 8454 lockhart                 3815 ECB             :         ;
                               3816                 : 
 8439 tgl                      3817                 : ColConstraint:
                               3818                 :             CONSTRAINT name ColConstraintElem
 9257 lockhart                 3819                 :                 {
 2238 peter_e                  3820 CBC         675 :                     Constraint *n = castNode(Constraint, $3);
                               3821                 : 
 5001 tgl                      3822 GIC         675 :                     n->conname = $2;
                               3823             675 :                     n->location = @1;
                               3824             675 :                     $$ = (Node *) n;
                               3825                 :                 }
 7601 bruce                    3826 CBC        7704 :             | ColConstraintElem                     { $$ = $1; }
 7601 bruce                    3827 GIC          76 :             | ConstraintAttr                        { $$ = $1; }
 4414 tgl                      3828 ECB             :             | COLLATE any_name
                               3829                 :                 {
                               3830                 :                     /*
                               3831                 :                      * Note: the CollateClause is momentarily included in
                               3832                 :                      * the list built by ColQualList, but we split it out
                               3833                 :                      * again in SplitColQualList.
                               3834                 :                      */
 4414 tgl                      3835 CBC         873 :                     CollateClause *n = makeNode(CollateClause);
  331 peter                    3836 ECB             : 
 4414 tgl                      3837 CBC         873 :                     n->arg = NULL;
 4412                          3838             873 :                     n->collname = $2;
 4414 tgl                      3839 GIC         873 :                     n->location = @1;
 4414 tgl                      3840 CBC         873 :                     $$ = (Node *) n;
 4414 tgl                      3841 ECB             :                 }
                               3842                 :         ;
                               3843                 : 
                               3844                 : /* DEFAULT NULL is already the default for Postgres.
 8589                          3845                 :  * But define it here and carry it forward into the system
                               3846                 :  * to make it explicit.
 8971 lockhart                 3847                 :  * - thomas 1998-09-13
 8541 tgl                      3848                 :  *
 3641 peter_e                  3849                 :  * WITH NULL and NULL are not SQL-standard syntax elements,
 8811 lockhart                 3850                 :  * so leave them out. Use DEFAULT NULL to explicitly indicate
                               3851                 :  * that a column may have that value. WITH NULL leads to
                               3852                 :  * shift/reduce conflicts with WITH TIME ZONE anyway.
                               3853                 :  * - thomas 1999-01-08
 8439 tgl                      3854                 :  *
                               3855                 :  * DEFAULT expression must be b_expr not a_expr to prevent shift/reduce
                               3856                 :  * conflict on NOT (since NOT might start a subsequent NOT NULL constraint,
                               3857                 :  * or be part of a_expr NOT LIKE or similar constructs).
                               3858                 :  */
                               3859                 : ColConstraintElem:
 7601 bruce                    3860                 :             NOT NULL_P
                               3861                 :                 {
 8439 tgl                      3862 GIC        2770 :                     Constraint *n = makeNode(Constraint);
                               3863                 : 
                               3864            2770 :                     n->contype = CONSTR_NOTNULL;
 5001 tgl                      3865 CBC        2770 :                     n->location = @1;
  331 peter                    3866            2770 :                     $$ = (Node *) n;
                               3867                 :                 }
                               3868                 :             | NULL_P
                               3869                 :                 {
 8439 tgl                      3870              11 :                     Constraint *n = makeNode(Constraint);
  331 peter                    3871 ECB             : 
 8439 tgl                      3872 GIC          11 :                     n->contype = CONSTR_NULL;
 5001                          3873              11 :                     n->location = @1;
  331 peter                    3874              11 :                     $$ = (Node *) n;
 8454 lockhart                 3875 ECB             :                 }
  430 peter                    3876                 :             | UNIQUE opt_unique_null_treatment opt_definition OptConsTableSpace
                               3877                 :                 {
 8971 lockhart                 3878 GIC         183 :                     Constraint *n = makeNode(Constraint);
                               3879                 : 
 8454 lockhart                 3880 CBC         183 :                     n->contype = CONSTR_UNIQUE;
 5001 tgl                      3881             183 :                     n->location = @1;
  430 peter                    3882 GIC         183 :                     n->nulls_not_distinct = !$2;
 8971 lockhart                 3883             183 :                     n->keys = NULL;
  430 peter                    3884             183 :                     n->options = $3;
 4457 tgl                      3885 CBC         183 :                     n->indexname = NULL;
  430 peter                    3886             183 :                     n->indexspace = $4;
  331 peter                    3887 GIC         183 :                     $$ = (Node *) n;
                               3888                 :                 }
                               3889                 :             | PRIMARY KEY opt_definition OptConsTableSpace
                               3890                 :                 {
 8439 tgl                      3891            2578 :                     Constraint *n = makeNode(Constraint);
  331 peter                    3892 ECB             : 
 8439 tgl                      3893 GIC        2578 :                     n->contype = CONSTR_PRIMARY;
 5001 tgl                      3894 CBC        2578 :                     n->location = @1;
 8439                          3895            2578 :                     n->keys = NULL;
 6125 bruce                    3896            2578 :                     n->options = $3;
 4457 tgl                      3897 GIC        2578 :                     n->indexname = NULL;
 6125 bruce                    3898 CBC        2578 :                     n->indexspace = $4;
  331 peter                    3899            2578 :                     $$ = (Node *) n;
                               3900                 :                 }
                               3901                 :             | CHECK '(' a_expr ')' opt_no_inherit
                               3902                 :                 {
 9257 lockhart                 3903 GIC         898 :                     Constraint *n = makeNode(Constraint);
                               3904                 : 
 8454                          3905             898 :                     n->contype = CONSTR_CHECK;
 5001 tgl                      3906             898 :                     n->location = @1;
 3911 alvherre                 3907 CBC         898 :                     n->is_no_inherit = $5;
 3911 alvherre                 3908 GIC         898 :                     n->raw_expr = $3;
 8589 tgl                      3909 CBC         898 :                     n->cooked_expr = NULL;
 2671 rhaas                    3910             898 :                     n->skip_validation = false;
                               3911             898 :                     n->initially_valid = true;
  331 peter                    3912             898 :                     $$ = (Node *) n;
                               3913                 :                 }
                               3914                 :             | DEFAULT b_expr
                               3915                 :                 {
 8439 tgl                      3916 GIC        1052 :                     Constraint *n = makeNode(Constraint);
                               3917                 : 
                               3918            1052 :                     n->contype = CONSTR_DEFAULT;
 5001                          3919            1052 :                     n->location = @1;
 5641                          3920            1052 :                     n->raw_expr = $2;
 8439                          3921            1052 :                     n->cooked_expr = NULL;
  331 peter                    3922            1052 :                     $$ = (Node *) n;
                               3923                 :                 }
                               3924                 :             | GENERATED generated_when AS IDENTITY_P OptParenthesizedSeqOptList
                               3925                 :                 {
 2194 peter_e                  3926             114 :                     Constraint *n = makeNode(Constraint);
                               3927                 : 
                               3928             114 :                     n->contype = CONSTR_IDENTITY;
                               3929             114 :                     n->generated_when = $2;
                               3930             114 :                     n->options = $5;
                               3931             114 :                     n->location = @1;
  331 peter                    3932             114 :                     $$ = (Node *) n;
                               3933                 :                 }
 1471 peter                    3934 ECB             :             | GENERATED generated_when AS '(' a_expr ')' STORED
                               3935                 :                 {
 1471 peter                    3936 CBC         415 :                     Constraint *n = makeNode(Constraint);
  331 peter                    3937 ECB             : 
 1471 peter                    3938 CBC         415 :                     n->contype = CONSTR_GENERATED;
 1471 peter                    3939 GIC         415 :                     n->generated_when = $2;
                               3940             415 :                     n->raw_expr = $5;
                               3941             415 :                     n->cooked_expr = NULL;
 1471 peter                    3942 CBC         415 :                     n->location = @1;
                               3943                 : 
 1469 peter                    3944 ECB             :                     /*
                               3945                 :                      * Can't do this in the grammar because of shift/reduce
                               3946                 :                      * conflicts.  (IDENTITY allows both ALWAYS and BY
                               3947                 :                      * DEFAULT, but generated columns only allow ALWAYS.)  We
                               3948                 :                      * can also give a more useful error message and location.
                               3949                 :                      */
 1469 peter                    3950 CBC         415 :                     if ($2 != ATTRIBUTE_IDENTITY_ALWAYS)
 1469 peter                    3951 GIC           3 :                         ereport(ERROR,
 1469 peter                    3952 ECB             :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               3953                 :                                  errmsg("for a generated column, GENERATED ALWAYS must be specified"),
                               3954                 :                                  parser_errposition(@2)));
                               3955                 : 
  331 peter                    3956 CBC         412 :                     $$ = (Node *) n;
 1471 peter                    3957 ECB             :                 }
 7601 bruce                    3958                 :             | REFERENCES qualified_name opt_column_list key_match key_actions
 9257 lockhart                 3959                 :                 {
 5001 tgl                      3960 GIC         361 :                     Constraint *n = makeNode(Constraint);
                               3961                 : 
                               3962             361 :                     n->contype = CONSTR_FOREIGN;
 5001 tgl                      3963 CBC         361 :                     n->location = @1;
  634 peter                    3964 GIC         361 :                     n->pktable = $2;
  634 peter                    3965 CBC         361 :                     n->fk_attrs = NIL;
                               3966             361 :                     n->pk_attrs = $3;
                               3967             361 :                     n->fk_matchtype = $4;
  487                          3968             361 :                     n->fk_upd_action = ($5)->updateAction->action;
                               3969             361 :                     n->fk_del_action = ($5)->deleteAction->action;
                               3970             361 :                     n->fk_del_set_cols = ($5)->deleteAction->cols;
  634                          3971             361 :                     n->skip_validation = false;
  634 peter                    3972 GIC         361 :                     n->initially_valid = true;
  331                          3973             361 :                     $$ = (Node *) n;
                               3974                 :                 }
 9344 bruce                    3975 ECB             :         ;
                               3976                 : 
  430 peter                    3977                 : opt_unique_null_treatment:
  430 peter                    3978 CBC           6 :             NULLS_P DISTINCT        { $$ = true; }
                               3979              15 :             | NULLS_P NOT DISTINCT  { $$ = false; }
                               3980            3214 :             | /*EMPTY*/             { $$ = true; }
  430 peter                    3981 ECB             :         ;
                               3982                 : 
 2194 peter_e                  3983                 : generated_when:
 2194 peter_e                  3984 CBC         536 :             ALWAYS          { $$ = ATTRIBUTE_IDENTITY_ALWAYS; }
 2194 peter_e                  3985 GIC          57 :             | BY DEFAULT    { $$ = ATTRIBUTE_IDENTITY_BY_DEFAULT; }
                               3986                 :         ;
                               3987                 : 
 8439 tgl                      3988 ECB             : /*
                               3989                 :  * ConstraintAttr represents constraint attributes, which we parse as if
                               3990                 :  * they were independent constraint clauses, in order to avoid shift/reduce
                               3991                 :  * conflicts (since NOT might start either an independent NOT NULL clause
 5769                          3992                 :  * or an attribute).  parse_utilcmd.c is responsible for attaching the
                               3993                 :  * attribute information to the preceding "real" constraint node, and for
                               3994                 :  * complaining if attribute clauses appear in the wrong place or wrong
                               3995                 :  * combinations.
                               3996                 :  *
                               3997                 :  * See also ConstraintAttributeSpec, which can be used in places where
 3911 alvherre                 3998                 :  * there is no parsing conflict.  (Note: currently, NOT VALID and NO INHERIT
                               3999                 :  * are allowed clauses in ConstraintAttributeSpec, but not here.  Someday we
                               4000                 :  * might need to allow them here too, but for the moment it doesn't seem
                               4001                 :  * useful in the statements that use ConstraintAttr.)
 8439 tgl                      4002                 :  */
 7601 bruce                    4003                 : ConstraintAttr:
                               4004                 :             DEFERRABLE
                               4005                 :                 {
 8450 lockhart                 4006 GIC          42 :                     Constraint *n = makeNode(Constraint);
                               4007                 : 
 8439 tgl                      4008 CBC          42 :                     n->contype = CONSTR_ATTR_DEFERRABLE;
 5001 tgl                      4009 GIC          42 :                     n->location = @1;
  331 peter                    4010 CBC          42 :                     $$ = (Node *) n;
 8450 lockhart                 4011 ECB             :                 }
 8439 tgl                      4012                 :             | NOT DEFERRABLE
 8450 lockhart                 4013                 :                 {
 8450 lockhart                 4014 LBC           0 :                     Constraint *n = makeNode(Constraint);
                               4015                 : 
 8439 tgl                      4016 UIC           0 :                     n->contype = CONSTR_ATTR_NOT_DEFERRABLE;
 5001                          4017               0 :                     n->location = @1;
  331 peter                    4018               0 :                     $$ = (Node *) n;
                               4019                 :                 }
                               4020                 :             | INITIALLY DEFERRED
                               4021                 :                 {
 8439 tgl                      4022 CBC          31 :                     Constraint *n = makeNode(Constraint);
  331 peter                    4023 ECB             : 
 8439 tgl                      4024 GIC          31 :                     n->contype = CONSTR_ATTR_DEFERRED;
 5001                          4025              31 :                     n->location = @1;
  331 peter                    4026              31 :                     $$ = (Node *) n;
                               4027                 :                 }
 8439 tgl                      4028 ECB             :             | INITIALLY IMMEDIATE
                               4029                 :                 {
 8439 tgl                      4030 GIC           3 :                     Constraint *n = makeNode(Constraint);
                               4031                 : 
 8439 tgl                      4032 CBC           3 :                     n->contype = CONSTR_ATTR_IMMEDIATE;
 5001 tgl                      4033 GIC           3 :                     n->location = @1;
  331 peter                    4034 CBC           3 :                     $$ = (Node *) n;
 8450 lockhart                 4035 ECB             :                 }
 8439 tgl                      4036                 :         ;
                               4037                 : 
 8450 lockhart                 4038                 : 
 7228 bruce                    4039                 : TableLikeClause:
 6130                          4040                 :             LIKE qualified_name TableLikeOptionList
 7596 lockhart                 4041                 :                 {
 4110 peter_e                  4042 CBC         348 :                     TableLikeClause *n = makeNode(TableLikeClause);
  331 peter                    4043 ECB             : 
 7228 bruce                    4044 CBC         348 :                     n->relation = $2;
 6130                          4045             348 :                     n->options = $3;
  859 tgl                      4046 GIC         348 :                     n->relationOid = InvalidOid;
  331 peter                    4047             348 :                     $$ = (Node *) n;
                               4048                 :                 }
                               4049                 :         ;
 7596 lockhart                 4050 ECB             : 
 6130 bruce                    4051                 : TableLikeOptionList:
 4927 andrew                   4052 CBC         120 :                 TableLikeOptionList INCLUDING TableLikeOption   { $$ = $1 | $3; }
 4927 andrew                   4053 GIC           1 :                 | TableLikeOptionList EXCLUDING TableLikeOption { $$ = $1 & ~$3; }
                               4054             348 :                 | /* EMPTY */                       { $$ = 0; }
                               4055                 :         ;
 6130 bruce                    4056 ECB             : 
                               4057                 : TableLikeOption:
 1861 alvherre                 4058 GIC          12 :                 COMMENTS            { $$ = CREATE_TABLE_LIKE_COMMENTS; }
  716 fujii                    4059               3 :                 | COMPRESSION       { $$ = CREATE_TABLE_LIKE_COMPRESSION; }
 4927 andrew                   4060              27 :                 | CONSTRAINTS       { $$ = CREATE_TABLE_LIKE_CONSTRAINTS; }
 1861 alvherre                 4061              10 :                 | DEFAULTS          { $$ = CREATE_TABLE_LIKE_DEFAULTS; }
 2194 peter_e                  4062               3 :                 | IDENTITY_P        { $$ = CREATE_TABLE_LIKE_IDENTITY; }
 1471 peter                    4063              12 :                 | GENERATED         { $$ = CREATE_TABLE_LIKE_GENERATED; }
 4927 andrew                   4064              19 :                 | INDEXES           { $$ = CREATE_TABLE_LIKE_INDEXES; }
 1861 alvherre                 4065 UIC           0 :                 | STATISTICS        { $$ = CREATE_TABLE_LIKE_STATISTICS; }
 4927 andrew                   4066 GIC          13 :                 | STORAGE           { $$ = CREATE_TABLE_LIKE_STORAGE; }
                               4067              22 :                 | ALL               { $$ = CREATE_TABLE_LIKE_ALL; }
                               4068                 :         ;
                               4069                 : 
                               4070                 : 
                               4071                 : /* ConstraintElem specifies constraint syntax which is not embedded into
                               4072                 :  *  a column definition. ColConstraintElem specifies the embedded form.
                               4073                 :  * - thomas 1997-12-03
                               4074                 :  */
                               4075                 : TableConstraint:
                               4076                 :             CONSTRAINT name ConstraintElem
                               4077                 :                 {
 2238 peter_e                  4078 CBC        1280 :                     Constraint *n = castNode(Constraint, $3);
                               4079                 : 
 5001 tgl                      4080            1280 :                     n->conname = $2;
                               4081            1280 :                     n->location = @1;
                               4082            1280 :                     $$ = (Node *) n;
                               4083                 :                 }
 7601 bruce                    4084 GIC       34426 :             | ConstraintElem                        { $$ = $1; }
                               4085                 :         ;
 9344 bruce                    4086 EUB             : 
                               4087                 : ConstraintElem:
 3911 alvherre                 4088                 :             CHECK '(' a_expr ')' ConstraintAttributeSpec
 9344 bruce                    4089                 :                 {
 9257 lockhart                 4090 GBC         579 :                     Constraint *n = makeNode(Constraint);
                               4091                 : 
 9257 lockhart                 4092 GIC         579 :                     n->contype = CONSTR_CHECK;
 5001 tgl                      4093             579 :                     n->location = @1;
 3911 alvherre                 4094 CBC         579 :                     n->raw_expr = $3;
 8589 tgl                      4095 GIC         579 :                     n->cooked_expr = NULL;
 3911 alvherre                 4096 CBC         579 :                     processCASbits($5, @5, "CHECK",
 4330 alvherre                 4097 ECB             :                                    NULL, NULL, &n->skip_validation,
 3911                          4098                 :                                    &n->is_no_inherit, yyscanner);
 4330 alvherre                 4099 GIC         579 :                     n->initially_valid = !n->skip_validation;
  331 peter                    4100             579 :                     $$ = (Node *) n;
                               4101                 :                 }
                               4102                 :             | NOT NULL_P ColId ConstraintAttributeSpec
                               4103                 :                 {
    2 alvherre                 4104 GNC          40 :                     Constraint *n = makeNode(Constraint);
                               4105                 : 
                               4106              40 :                     n->contype = CONSTR_NOTNULL;
                               4107              40 :                     n->location = @1;
                               4108              40 :                     n->colname = $3;
                               4109              40 :                     processCASbits($4, @4, "NOT NULL",
                               4110                 :                                    NULL, NULL, NULL,
                               4111                 :                                    &n->is_no_inherit, yyscanner);
                               4112              40 :                     n->initially_valid = !n->skip_validation;
                               4113              40 :                     $$ = (Node *) n;
                               4114                 :                 }
  430 peter                    4115 ECB             :             | UNIQUE opt_unique_null_treatment '(' columnList ')' opt_c_include opt_definition OptConsTableSpace
                               4116                 :                 ConstraintAttributeSpec
 9257 lockhart                 4117                 :                 {
 9257 lockhart                 4118 CBC         223 :                     Constraint *n = makeNode(Constraint);
  331 peter                    4119 ECB             : 
 9257 lockhart                 4120 GIC         223 :                     n->contype = CONSTR_UNIQUE;
 5001 tgl                      4121             223 :                     n->location = @1;
  430 peter                    4122             223 :                     n->nulls_not_distinct = !$2;
                               4123             223 :                     n->keys = $4;
                               4124             223 :                     n->including = $6;
                               4125             223 :                     n->options = $7;
 4457 tgl                      4126             223 :                     n->indexname = NULL;
  430 peter                    4127 CBC         223 :                     n->indexspace = $8;
  430 peter                    4128 GIC         223 :                     processCASbits($9, @9, "UNIQUE",
 4316 tgl                      4129 ECB             :                                    &n->deferrable, &n->initdeferred, NULL,
 3911 alvherre                 4130                 :                                    NULL, yyscanner);
  331 peter                    4131 CBC         223 :                     $$ = (Node *) n;
 9257 lockhart                 4132 ECB             :                 }
                               4133                 :             | UNIQUE ExistingIndex ConstraintAttributeSpec
                               4134                 :                 {
 4457 tgl                      4135 GIC       14555 :                     Constraint *n = makeNode(Constraint);
                               4136                 : 
 4457 tgl                      4137 CBC       14555 :                     n->contype = CONSTR_UNIQUE;
                               4138           14555 :                     n->location = @1;
                               4139           14555 :                     n->keys = NIL;
 1828 teodor                   4140 GIC       14555 :                     n->including = NIL;
 4457 tgl                      4141           14555 :                     n->options = NIL;
                               4142           14555 :                     n->indexname = $2;
 4457 tgl                      4143 CBC       14555 :                     n->indexspace = NULL;
 4316                          4144           14555 :                     processCASbits($3, @3, "UNIQUE",
 4316 tgl                      4145 ECB             :                                    &n->deferrable, &n->initdeferred, NULL,
 3911 alvherre                 4146                 :                                    NULL, yyscanner);
  331 peter                    4147 CBC       14555 :                     $$ = (Node *) n;
 4457 tgl                      4148 ECB             :                 }
 1828 teodor                   4149                 :             | PRIMARY KEY '(' columnList ')' opt_c_include opt_definition OptConsTableSpace
 5002 tgl                      4150 EUB             :                 ConstraintAttributeSpec
 9257 lockhart                 4151 ECB             :                 {
 8439 tgl                      4152 CBC         742 :                     Constraint *n = makeNode(Constraint);
                               4153                 : 
 8439 tgl                      4154 GIC         742 :                     n->contype = CONSTR_PRIMARY;
 5001                          4155             742 :                     n->location = @1;
 8439                          4156             742 :                     n->keys = $4;
 1828 teodor                   4157             742 :                     n->including = $6;
                               4158             742 :                     n->options = $7;
 4457 tgl                      4159             742 :                     n->indexname = NULL;
 1828 teodor                   4160             742 :                     n->indexspace = $8;
                               4161             742 :                     processCASbits($9, @9, "PRIMARY KEY",
                               4162                 :                                    &n->deferrable, &n->initdeferred, NULL,
 3911 alvherre                 4163 ECB             :                                    NULL, yyscanner);
  331 peter                    4164 GIC         742 :                     $$ = (Node *) n;
 9257 lockhart                 4165 ECB             :                 }
 4457 tgl                      4166                 :             | PRIMARY KEY ExistingIndex ConstraintAttributeSpec
                               4167                 :                 {
 4457 tgl                      4168 GIC       18813 :                     Constraint *n = makeNode(Constraint);
  331 peter                    4169 ECB             : 
 4457 tgl                      4170 GIC       18813 :                     n->contype = CONSTR_PRIMARY;
                               4171           18813 :                     n->location = @1;
                               4172           18813 :                     n->keys = NIL;
 1828 teodor                   4173           18813 :                     n->including = NIL;
 4457 tgl                      4174           18813 :                     n->options = NIL;
 4457 tgl                      4175 CBC       18813 :                     n->indexname = $3;
 4457 tgl                      4176 GIC       18813 :                     n->indexspace = NULL;
 4316 tgl                      4177 CBC       18813 :                     processCASbits($4, @4, "PRIMARY KEY",
 4316 tgl                      4178 ECB             :                                    &n->deferrable, &n->initdeferred, NULL,
 3911 alvherre                 4179                 :                                    NULL, yyscanner);
  331 peter                    4180 CBC       18813 :                     $$ = (Node *) n;
 4457 tgl                      4181 ECB             :                 }
                               4182                 :             | EXCLUDE access_method_clause '(' ExclusionConstraintList ')'
                               4183                 :                 opt_c_include opt_definition OptConsTableSpace OptWhereClause
 4871                          4184                 :                 ConstraintAttributeSpec
                               4185                 :                 {
 4871 tgl                      4186 GIC          76 :                     Constraint *n = makeNode(Constraint);
                               4187                 : 
                               4188              76 :                     n->contype = CONSTR_EXCLUSION;
 4871 tgl                      4189 CBC          76 :                     n->location = @1;
  634 peter                    4190 GIC          76 :                     n->access_method = $2;
  634 peter                    4191 CBC          76 :                     n->exclusions = $4;
                               4192              76 :                     n->including = $6;
                               4193              76 :                     n->options = $7;
                               4194              76 :                     n->indexname = NULL;
  634 peter                    4195 GIC          76 :                     n->indexspace = $8;
                               4196              76 :                     n->where_clause = $9;
 1828 teodor                   4197 CBC          76 :                     processCASbits($10, @10, "EXCLUDE",
 4316 tgl                      4198 ECB             :                                    &n->deferrable, &n->initdeferred, NULL,
                               4199                 :                                    NULL, yyscanner);
  331 peter                    4200 GIC          76 :                     $$ = (Node *) n;
                               4201                 :                 }
                               4202                 :             | FOREIGN KEY '(' columnList ')' REFERENCES qualified_name
 7576 tgl                      4203 ECB             :                 opt_column_list key_match key_actions ConstraintAttributeSpec
                               4204                 :                 {
 5001 tgl                      4205 CBC         678 :                     Constraint *n = makeNode(Constraint);
  331 peter                    4206 ECB             : 
 5001 tgl                      4207 CBC         678 :                     n->contype = CONSTR_FOREIGN;
                               4208             678 :                     n->location = @1;
  634 peter                    4209             678 :                     n->pktable = $7;
                               4210             678 :                     n->fk_attrs = $4;
                               4211             678 :                     n->pk_attrs = $8;
                               4212             678 :                     n->fk_matchtype = $9;
  487                          4213             678 :                     n->fk_upd_action = ($10)->updateAction->action;
  487 peter                    4214 GIC         678 :                     n->fk_del_action = ($10)->deleteAction->action;
                               4215             678 :                     n->fk_del_set_cols = ($10)->deleteAction->cols;
 4316 tgl                      4216 CBC         678 :                     processCASbits($11, @11, "FOREIGN KEY",
                               4217                 :                                    &n->deferrable, &n->initdeferred,
                               4218                 :                                    &n->skip_validation, NULL,
                               4219                 :                                    yyscanner);
                               4220             678 :                     n->initially_valid = !n->skip_validation;
  331 peter                    4221 GIC         678 :                     $$ = (Node *) n;
 9132 lockhart                 4222 ECB             :                 }
 9344 bruce                    4223                 :         ;
 9770 scrappy                  4224                 : 
 2062 peter_e                  4225 CBC           6 : opt_no_inherit: NO INHERIT                          {  $$ = true; }
                               4226             892 :             | /* EMPTY */                           {  $$ = false; }
 4006 alvherre                 4227 ECB             :         ;
                               4228                 : 
 7601 bruce                    4229                 : opt_column_list:
 7601 bruce                    4230 GIC        4861 :             '(' columnList ')'                      { $$ = $2; }
                               4231           92629 :             | /*EMPTY*/                             { $$ = NIL; }
 7689 tgl                      4232 ECB             :         ;
                               4233                 : 
                               4234                 : columnList:
 6888 neilc                    4235 GIC        6786 :             columnElem                              { $$ = list_make1($1); }
 7600 bruce                    4236           16448 :             | columnList ',' columnElem             { $$ = lappend($1, $3); }
 7689 tgl                      4237 ECB             :         ;
                               4238                 : 
 7601 bruce                    4239                 : columnElem: ColId
 7689 tgl                      4240                 :                 {
 7538 tgl                      4241 CBC       23234 :                     $$ = (Node *) makeString($1);
 7689 tgl                      4242 ECB             :                 }
                               4243                 :         ;
                               4244                 : 
 1828 teodor                   4245 CBC          84 : opt_c_include:  INCLUDE '(' columnList ')'          { $$ = $3; }
                               4246             957 :              |      /* EMPTY */                     { $$ = NIL; }
                               4247                 :         ;
                               4248                 : 
 7596 lockhart                 4249 ECB             : key_match:  MATCH FULL
                               4250                 :             {
 7576 tgl                      4251 GIC          49 :                 $$ = FKCONSTR_MATCH_FULL;
                               4252                 :             }
 7596 lockhart                 4253 ECB             :         | MATCH PARTIAL
                               4254                 :             {
 7204 tgl                      4255 LBC           0 :                 ereport(ERROR,
 7204 tgl                      4256 ECB             :                         (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 5333                          4257                 :                          errmsg("MATCH PARTIAL not yet implemented"),
 5018                          4258                 :                          parser_errposition(@1)));
 7576                          4259                 :                 $$ = FKCONSTR_MATCH_PARTIAL;
 7596 lockhart                 4260                 :             }
                               4261                 :         | MATCH SIMPLE
                               4262                 :             {
 3948 tgl                      4263 GIC           3 :                 $$ = FKCONSTR_MATCH_SIMPLE;
                               4264                 :             }
 7596 lockhart                 4265 ECB             :         | /*EMPTY*/
                               4266                 :             {
 3948 tgl                      4267 GIC         990 :                 $$ = FKCONSTR_MATCH_SIMPLE;
                               4268                 :             }
                               4269                 :         ;
                               4270                 : 
 4871 tgl                      4271 ECB             : ExclusionConstraintList:
 4871 tgl                      4272 GIC          76 :             ExclusionConstraintElem                 { $$ = list_make1($1); }
 4871 tgl                      4273 ECB             :             | ExclusionConstraintList ',' ExclusionConstraintElem
 4871 tgl                      4274 CBC          15 :                                                     { $$ = lappend($1, $3); }
 4871 tgl                      4275 ECB             :         ;
                               4276                 : 
                               4277                 : ExclusionConstraintElem: index_elem WITH any_operator
                               4278                 :             {
 4871 tgl                      4279 CBC          91 :                 $$ = list_make2($1, $3);
 4871 tgl                      4280 ECB             :             }
                               4281                 :             /* allow OPERATOR() decoration for the benefit of ruleutils.c */
                               4282                 :             | index_elem WITH OPERATOR '(' any_operator ')'
                               4283                 :             {
 4871 tgl                      4284 UIC           0 :                 $$ = list_make2($1, $5);
 4871 tgl                      4285 ECB             :             }
                               4286                 :         ;
                               4287                 : 
                               4288                 : OptWhereClause:
 4871 tgl                      4289 GIC         213 :             WHERE '(' a_expr ')'                    { $$ = $3; }
 4871 tgl                      4290 CBC         509 :             | /*EMPTY*/                             { $$ = NULL; }
                               4291                 :         ;
 4871 tgl                      4292 ECB             : 
 7601 bruce                    4293                 : key_actions:
 7576 tgl                      4294                 :             key_update
  487 peter                    4295                 :                 {
  487 peter                    4296 CBC          13 :                     KeyActions *n = palloc(sizeof(KeyActions));
  331 peter                    4297 ECB             : 
  487 peter                    4298 CBC          13 :                     n->updateAction = $1;
                               4299              13 :                     n->deleteAction = palloc(sizeof(KeyAction));
                               4300              13 :                     n->deleteAction->action = FKCONSTR_ACTION_NOACTION;
                               4301              13 :                     n->deleteAction->cols = NIL;
  487 peter                    4302 GIC          13 :                     $$ = n;
                               4303                 :                 }
                               4304                 :             | key_delete
  487 peter                    4305 ECB             :                 {
  487 peter                    4306 CBC          58 :                     KeyActions *n = palloc(sizeof(KeyActions));
                               4307                 : 
  487 peter                    4308 GIC          58 :                     n->updateAction = palloc(sizeof(KeyAction));
                               4309              58 :                     n->updateAction->action = FKCONSTR_ACTION_NOACTION;
  487 peter                    4310 CBC          58 :                     n->updateAction->cols = NIL;
                               4311              58 :                     n->deleteAction = $1;
  487 peter                    4312 GIC          58 :                     $$ = n;
                               4313                 :                 }
                               4314                 :             | key_update key_delete
  487 peter                    4315 ECB             :                 {
  487 peter                    4316 CBC          75 :                     KeyActions *n = palloc(sizeof(KeyActions));
                               4317                 : 
  487 peter                    4318 GIC          75 :                     n->updateAction = $1;
                               4319              75 :                     n->deleteAction = $2;
  487 peter                    4320 CBC          75 :                     $$ = n;
  487 peter                    4321 ECB             :                 }
                               4322                 :             | key_delete key_update
                               4323                 :                 {
  487 peter                    4324 GIC          48 :                     KeyActions *n = palloc(sizeof(KeyActions));
                               4325                 : 
  487 peter                    4326 CBC          48 :                     n->updateAction = $2;
  487 peter                    4327 GIC          48 :                     n->deleteAction = $1;
                               4328              48 :                     $$ = n;
                               4329                 :                 }
 7576 tgl                      4330 ECB             :             | /*EMPTY*/
  487 peter                    4331                 :                 {
  487 peter                    4332 GIC         845 :                     KeyActions *n = palloc(sizeof(KeyActions));
                               4333                 : 
                               4334             845 :                     n->updateAction = palloc(sizeof(KeyAction));
                               4335             845 :                     n->updateAction->action = FKCONSTR_ACTION_NOACTION;
  487 peter                    4336 CBC         845 :                     n->updateAction->cols = NIL;
  487 peter                    4337 GIC         845 :                     n->deleteAction = palloc(sizeof(KeyAction));
                               4338             845 :                     n->deleteAction->action = FKCONSTR_ACTION_NOACTION;
                               4339             845 :                     n->deleteAction->cols = NIL;
  487 peter                    4340 GBC         845 :                     $$ = n;
                               4341                 :                 }
                               4342                 :         ;
                               4343                 : 
                               4344                 : key_update: ON UPDATE key_action
                               4345                 :                 {
  487 peter                    4346 GIC         139 :                     if (($3)->cols)
                               4347               3 :                         ereport(ERROR,
  487 peter                    4348 ECB             :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               4349                 :                                  errmsg("a column list with %s is only supported for ON DELETE actions",
                               4350                 :                                         ($3)->action == FKCONSTR_ACTION_SETNULL ? "SET NULL" : "SET DEFAULT"),
                               4351                 :                                  parser_errposition(@1)));
  487 peter                    4352 CBC         136 :                     $$ = $3;
                               4353                 :                 }
                               4354                 :         ;
                               4355                 : 
                               4356                 : key_delete: ON DELETE_P key_action
  487 peter                    4357 ECB             :                 {
  487 peter                    4358 GIC         181 :                     $$ = $3;
  487 peter                    4359 ECB             :                 }
                               4360                 :         ;
                               4361                 : 
                               4362                 : key_action:
                               4363                 :             NO ACTION
                               4364                 :                 {
  487 peter                    4365 GIC          29 :                     KeyAction *n = palloc(sizeof(KeyAction));
                               4366                 : 
                               4367              29 :                     n->action = FKCONSTR_ACTION_NOACTION;
                               4368              29 :                     n->cols = NIL;
  487 peter                    4369 GBC          29 :                     $$ = n;
                               4370                 :                 }
                               4371                 :             | RESTRICT
                               4372                 :                 {
  487 peter                    4373 GIC          12 :                     KeyAction *n = palloc(sizeof(KeyAction));
  331 peter                    4374 ECB             : 
  487 peter                    4375 CBC          12 :                     n->action = FKCONSTR_ACTION_RESTRICT;
  487 peter                    4376 GIC          12 :                     n->cols = NIL;
                               4377              12 :                     $$ = n;
                               4378                 :                 }
                               4379                 :             | CASCADE
                               4380                 :                 {
  487 peter                    4381 CBC         179 :                     KeyAction *n = palloc(sizeof(KeyAction));
                               4382                 : 
                               4383             179 :                     n->action = FKCONSTR_ACTION_CASCADE;
                               4384             179 :                     n->cols = NIL;
                               4385             179 :                     $$ = n;
  487 peter                    4386 ECB             :                 }
                               4387                 :             | SET NULL_P opt_column_list
                               4388                 :                 {
  487 peter                    4389 GIC          67 :                     KeyAction *n = palloc(sizeof(KeyAction));
                               4390                 : 
  487 peter                    4391 CBC          67 :                     n->action = FKCONSTR_ACTION_SETNULL;
  487 peter                    4392 GIC          67 :                     n->cols = $3;
  487 peter                    4393 CBC          67 :                     $$ = n;
  487 peter                    4394 ECB             :                 }
                               4395                 :             | SET DEFAULT opt_column_list
                               4396                 :                 {
  487 peter                    4397 CBC          33 :                     KeyAction *n = palloc(sizeof(KeyAction));
                               4398                 : 
  487 peter                    4399 GIC          33 :                     n->action = FKCONSTR_ACTION_SETDEFAULT;
                               4400              33 :                     n->cols = $3;
  487 peter                    4401 CBC          33 :                     $$ = n;
                               4402                 :                 }
 9297 lockhart                 4403 ECB             :         ;
                               4404                 : 
 7601 bruce                    4405 CBC         761 : OptInherit: INHERITS '(' qualified_name_list ')'    { $$ = $3; }
 7601 bruce                    4406 GIC       12854 :             | /*EMPTY*/                             { $$ = NIL; }
                               4407                 :         ;
                               4408                 : 
 2314 rhaas                    4409 ECB             : /* Optional partition key specification */
 2314 rhaas                    4410 GIC        2187 : OptPartitionSpec: PartitionSpec { $$ = $1; }
 2314 rhaas                    4411 CBC       14881 :             | /*EMPTY*/         { $$ = NULL; }
 2314 rhaas                    4412 ECB             :         ;
                               4413                 : 
                               4414                 : PartitionSpec: PARTITION BY ColId '(' part_params ')'
                               4415                 :                 {
 2314 rhaas                    4416 GIC        2190 :                     PartitionSpec *n = makeNode(PartitionSpec);
 2314 rhaas                    4417 ECB             : 
  157 alvherre                 4418 GNC        2190 :                     n->strategy = parsePartitionStrategy($3);
 2314 rhaas                    4419 CBC        2187 :                     n->partParams = $5;
                               4420            2187 :                     n->location = @1;
 2314 rhaas                    4421 ECB             : 
 2314 rhaas                    4422 CBC        2187 :                     $$ = n;
 2314 rhaas                    4423 ECB             :                 }
                               4424                 :         ;
                               4425                 : 
 2314 rhaas                    4426 GIC        2190 : part_params:    part_elem                       { $$ = list_make1($1); }
                               4427             195 :             | part_params ',' part_elem         { $$ = lappend($1, $3); }
                               4428                 :         ;
                               4429                 : 
                               4430                 : part_elem: ColId opt_collate opt_qualified_name
 2314 rhaas                    4431 ECB             :                 {
 2314 rhaas                    4432 CBC        2242 :                     PartitionElem *n = makeNode(PartitionElem);
                               4433                 : 
 2314 rhaas                    4434 GIC        2242 :                     n->name = $1;
                               4435            2242 :                     n->expr = NULL;
                               4436            2242 :                     n->collation = $2;
 2314 rhaas                    4437 CBC        2242 :                     n->opclass = $3;
 2314 rhaas                    4438 GIC        2242 :                     n->location = @1;
                               4439            2242 :                     $$ = n;
                               4440                 :                 }
                               4441                 :             | func_expr_windowless opt_collate opt_qualified_name
                               4442                 :                 {
 2314 rhaas                    4443 CBC          65 :                     PartitionElem *n = makeNode(PartitionElem);
                               4444                 : 
 2314 rhaas                    4445 GIC          65 :                     n->name = NULL;
                               4446              65 :                     n->expr = $1;
                               4447              65 :                     n->collation = $2;
                               4448              65 :                     n->opclass = $3;
                               4449              65 :                     n->location = @1;
 2314 rhaas                    4450 CBC          65 :                     $$ = n;
                               4451                 :                 }
                               4452                 :             | '(' a_expr ')' opt_collate opt_qualified_name
 2314 rhaas                    4453 ECB             :                 {
 2314 rhaas                    4454 CBC          78 :                     PartitionElem *n = makeNode(PartitionElem);
                               4455                 : 
 2314 rhaas                    4456 GIC          78 :                     n->name = NULL;
                               4457              78 :                     n->expr = $2;
 2314 rhaas                    4458 CBC          78 :                     n->collation = $4;
 2314 rhaas                    4459 GIC          78 :                     n->opclass = $5;
 2314 rhaas                    4460 CBC          78 :                     n->location = @1;
                               4461              78 :                     $$ = n;
 2314 rhaas                    4462 ECB             :                 }
                               4463                 :         ;
                               4464                 : 
                               4465                 : table_access_method_clause:
 1033 peter                    4466 CBC          57 :             USING name                          { $$ = $2; }
 1495 andres                   4467 GIC       17918 :             | /*EMPTY*/                         { $$ = NULL; }
 1495 andres                   4468 ECB             :         ;
                               4469                 : 
 1601                          4470                 : /* WITHOUT OIDS is legacy only */
                               4471                 : OptWith:
 5179 alvherre                 4472 GIC         299 :             WITH reloptions             { $$ = $2; }
 1601 andres                   4473              12 :             | WITHOUT OIDS              { $$ = NIL; }
 6124 tgl                      4474 CBC       17389 :             | /*EMPTY*/                 { $$ = NIL; }
                               4475                 :         ;
 7912 tgl                      4476 ECB             : 
 7454 tgl                      4477 CBC          25 : OnCommitOption:  ON COMMIT DROP             { $$ = ONCOMMIT_DROP; }
                               4478              49 :             | ON COMMIT DELETE_P ROWS       { $$ = ONCOMMIT_DELETE_ROWS; }
 7454 tgl                      4479 GIC          12 :             | ON COMMIT PRESERVE ROWS       { $$ = ONCOMMIT_PRESERVE_ROWS; }
                               4480           17614 :             | /*EMPTY*/                     { $$ = ONCOMMIT_NOOP; }
                               4481                 :         ;
 7454 tgl                      4482 ECB             : 
 6869 tgl                      4483 GIC          96 : OptTableSpace:   TABLESPACE name                    { $$ = $2; }
 6869 tgl                      4484 CBC       20705 :             | /*EMPTY*/                             { $$ = NULL; }
 6869 tgl                      4485 ECB             :         ;
                               4486                 : 
 6824 tgl                      4487 GIC          33 : OptConsTableSpace:   USING INDEX TABLESPACE name    { $$ = $4; }
                               4488            3769 :             | /*EMPTY*/                             { $$ = NULL; }
                               4489                 :         ;
 6824 tgl                      4490 ECB             : 
 1033 peter                    4491 CBC       33368 : ExistingIndex:   USING INDEX name                   { $$ = $3; }
                               4492                 :         ;
                               4493                 : 
                               4494                 : /*****************************************************************************
 2207 alvherre                 4495 ECB             :  *
                               4496                 :  *      QUERY :
                               4497                 :  *              CREATE STATISTICS [[IF NOT EXISTS] stats_name] [(stat types)]
                               4498                 :  *                  ON expression-list FROM from_list
                               4499                 :  *
                               4500                 :  * Note: the expectation here is that the clauses after ON are a subset of
 2158                          4501                 :  * SELECT syntax, allowing for expressions and joined tables, and probably
                               4502                 :  * someday a WHERE clause.  Much less than that is currently implemented,
                               4503                 :  * but the grammar accepts it and then we'll throw FEATURE_NOT_SUPPORTED
                               4504                 :  * errors as necessary at execution.
 2207                          4505                 :  *
                               4506                 :  * Statistics name is optional unless IF NOT EXISTS is specified.
                               4507                 :  *
                               4508                 :  *****************************************************************************/
                               4509                 : 
                               4510                 : CreateStatsStmt:
                               4511                 :             CREATE STATISTICS opt_qualified_name
                               4512                 :             opt_name_list ON stats_params FROM from_list
 2158                          4513                 :                 {
 2158 alvherre                 4514 CBC         274 :                     CreateStatsStmt *n = makeNode(CreateStatsStmt);
                               4515                 : 
 2117 alvherre                 4516 GIC         274 :                     n->defnames = $3;
                               4517             274 :                     n->stat_types = $4;
                               4518             274 :                     n->exprs = $6;
 2117 alvherre                 4519 CBC         274 :                     n->relations = $8;
 1861 alvherre                 4520 GIC         274 :                     n->stxcomment = NULL;
 2117 alvherre                 4521 CBC         274 :                     n->if_not_exists = false;
  331 peter                    4522             274 :                     $$ = (Node *) n;
 2117 alvherre                 4523 ECB             :                 }
                               4524                 :             | CREATE STATISTICS IF_P NOT EXISTS any_name
  744 tomas.vondra             4525                 :             opt_name_list ON stats_params FROM from_list
 2117 alvherre                 4526                 :                 {
 2117 alvherre                 4527 GIC           6 :                     CreateStatsStmt *n = makeNode(CreateStatsStmt);
                               4528                 : 
                               4529               6 :                     n->defnames = $6;
 2117 alvherre                 4530 CBC           6 :                     n->stat_types = $7;
 2117 alvherre                 4531 GIC           6 :                     n->exprs = $9;
 2117 alvherre                 4532 CBC           6 :                     n->relations = $11;
 1861                          4533               6 :                     n->stxcomment = NULL;
 2117                          4534               6 :                     n->if_not_exists = true;
  331 peter                    4535               6 :                     $$ = (Node *) n;
 2158 alvherre                 4536 ECB             :                 }
 2207                          4537                 :             ;
                               4538                 : 
                               4539                 : /*
                               4540                 :  * Statistics attributes can be either simple column references, or arbitrary
  744 tomas.vondra             4541                 :  * expressions in parens.  For compatibility with index attributes permitted
                               4542                 :  * in CREATE INDEX, we allow an expression that's just a function call to be
                               4543                 :  * written without parens.
                               4544                 :  */
                               4545                 : 
  744 tomas.vondra             4546 CBC         286 : stats_params:   stats_param                         { $$ = list_make1($1); }
                               4547             461 :             | stats_params ',' stats_param          { $$ = lappend($1, $3); }
  744 tomas.vondra             4548 ECB             :         ;
                               4549                 : 
                               4550                 : stats_param:    ColId
                               4551                 :                 {
  744 tomas.vondra             4552 GIC         531 :                     $$ = makeNode(StatsElem);
  744 tomas.vondra             4553 CBC         531 :                     $$->name = $1;
                               4554             531 :                     $$->expr = NULL;
                               4555                 :                 }
                               4556                 :             | func_expr_windowless
                               4557                 :                 {
  744 tomas.vondra             4558 GIC          10 :                     $$ = makeNode(StatsElem);
  744 tomas.vondra             4559 CBC          10 :                     $$->name = NULL;
                               4560              10 :                     $$->expr = $1;
  744 tomas.vondra             4561 ECB             :                 }
                               4562                 :             | '(' a_expr ')'
                               4563                 :                 {
  744 tomas.vondra             4564 CBC         206 :                     $$ = makeNode(StatsElem);
                               4565             206 :                     $$->name = NULL;
                               4566             206 :                     $$->expr = $2;
  744 tomas.vondra             4567 ECB             :                 }
                               4568                 :         ;
                               4569                 : 
 1307                          4570                 : /*****************************************************************************
                               4571                 :  *
                               4572                 :  *      QUERY :
                               4573                 :  *              ALTER STATISTICS [IF EXISTS] stats_name
                               4574                 :  *                  SET STATISTICS  <SignedIconst>
                               4575                 :  *
                               4576                 :  *****************************************************************************/
                               4577                 : 
                               4578                 : AlterStatsStmt:
                               4579                 :             ALTER STATISTICS any_name SET STATISTICS SignedIconst
                               4580                 :                 {
 1307 tomas.vondra             4581 GIC          10 :                     AlterStatsStmt *n = makeNode(AlterStatsStmt);
                               4582                 : 
                               4583              10 :                     n->defnames = $3;
                               4584              10 :                     n->missing_ok = false;
                               4585              10 :                     n->stxstattarget = $6;
  331 peter                    4586              10 :                     $$ = (Node *) n;
                               4587                 :                 }
                               4588                 :             | ALTER STATISTICS IF_P EXISTS any_name SET STATISTICS SignedIconst
                               4589                 :                 {
 1307 tomas.vondra             4590               3 :                     AlterStatsStmt *n = makeNode(AlterStatsStmt);
                               4591                 : 
                               4592               3 :                     n->defnames = $5;
                               4593               3 :                     n->missing_ok = true;
                               4594               3 :                     n->stxstattarget = $8;
  331 peter                    4595               3 :                     $$ = (Node *) n;
                               4596                 :                 }
                               4597                 :             ;
                               4598                 : 
                               4599                 : /*****************************************************************************
                               4600                 :  *
 4038 tgl                      4601 ECB             :  *      QUERY :
                               4602                 :  *              CREATE TABLE relname AS SelectStmt [ WITH [NO] DATA ]
                               4603                 :  *
                               4604                 :  *
                               4605                 :  * Note: SELECT ... INTO is a now-deprecated alternative for this.
                               4606                 :  *
                               4607                 :  *****************************************************************************/
 8546                          4608                 : 
 7601 bruce                    4609                 : CreateAsStmt:
                               4610                 :         CREATE OptTemp TABLE create_as_target AS SelectStmt opt_with_data
                               4611                 :                 {
 4038 tgl                      4612 GIC         571 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
                               4613                 : 
 4038 tgl                      4614 CBC         571 :                     ctas->query = $6;
 4038 tgl                      4615 GIC         571 :                     ctas->into = $4;
 1002 michael                  4616 CBC         571 :                     ctas->objtype = OBJECT_TABLE;
 4038 tgl                      4617             571 :                     ctas->is_select_into = false;
 3039 andrew                   4618             571 :                     ctas->if_not_exists = false;
 4154 tgl                      4619 ECB             :                     /* cram additional flags into the IntoClause */
 4154 tgl                      4620 CBC         571 :                     $4->rel->relpersistence = $2;
                               4621             571 :                     $4->skipData = !($7);
 4038                          4622             571 :                     $$ = (Node *) ctas;
                               4623                 :                 }
                               4624                 :         | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS SelectStmt opt_with_data
                               4625                 :                 {
 3039 andrew                   4626 GIC          25 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
                               4627                 : 
                               4628              25 :                     ctas->query = $9;
                               4629              25 :                     ctas->into = $7;
 1002 michael                  4630              25 :                     ctas->objtype = OBJECT_TABLE;
 3039 andrew                   4631              25 :                     ctas->is_select_into = false;
                               4632              25 :                     ctas->if_not_exists = true;
 3039 andrew                   4633 ECB             :                     /* cram additional flags into the IntoClause */
 3039 andrew                   4634 CBC          25 :                     $7->rel->relpersistence = $2;
 3039 andrew                   4635 GIC          25 :                     $7->skipData = !($10);
                               4636              25 :                     $$ = (Node *) ctas;
                               4637                 :                 }
                               4638                 :         ;
 5892 tgl                      4639 ECB             : 
                               4640                 : create_as_target:
 1495 andres                   4641                 :             qualified_name opt_column_list table_access_method_clause
                               4642                 :             OptWith OnCommitOption OptTableSpace
                               4643                 :                 {
 5892 tgl                      4644 GIC         638 :                     $$ = makeNode(IntoClause);
 5892 tgl                      4645 CBC         638 :                     $$->rel = $1;
                               4646             638 :                     $$->colNames = $2;
 1495 andres                   4647             638 :                     $$->accessMethod = $3;
 1495 andres                   4648 GIC         638 :                     $$->options = $4;
                               4649             638 :                     $$->onCommit = $5;
                               4650             638 :                     $$->tableSpaceName = $6;
 3649 tgl                      4651 CBC         638 :                     $$->viewQuery = NULL;
 4154                          4652             638 :                     $$->skipData = false;        /* might get changed later */
 9238 lockhart                 4653 ECB             :                 }
                               4654                 :         ;
                               4655                 : 
                               4656                 : opt_with_data:
 2062 peter_e                  4657 GIC          18 :             WITH DATA_P                             { $$ = true; }
                               4658             105 :             | WITH NO DATA_P                        { $$ = false; }
                               4659             910 :             | /*EMPTY*/                             { $$ = true; }
                               4660                 :         ;
                               4661                 : 
                               4662                 : 
                               4663                 : /*****************************************************************************
                               4664                 :  *
                               4665                 :  *      QUERY :
                               4666                 :  *              CREATE MATERIALIZED VIEW relname AS SelectStmt
                               4667                 :  *
 3689 kgrittn                  4668 ECB             :  *****************************************************************************/
                               4669                 : 
                               4670                 : CreateMatViewStmt:
                               4671                 :         CREATE OptNoLog MATERIALIZED VIEW create_mv_target AS SelectStmt opt_with_data
                               4672                 :                 {
 3689 kgrittn                  4673 CBC         248 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
                               4674                 : 
 3689 kgrittn                  4675 GIC         248 :                     ctas->query = $7;
                               4676             248 :                     ctas->into = $5;
 1002 michael                  4677 CBC         248 :                     ctas->objtype = OBJECT_MATVIEW;
 3689 kgrittn                  4678 GIC         248 :                     ctas->is_select_into = false;
 3039 andrew                   4679 CBC         248 :                     ctas->if_not_exists = false;
 3689 kgrittn                  4680 ECB             :                     /* cram additional flags into the IntoClause */
 3689 kgrittn                  4681 CBC         248 :                     $5->rel->relpersistence = $2;
                               4682             248 :                     $5->skipData = !($8);
 3689 kgrittn                  4683 GIC         248 :                     $$ = (Node *) ctas;
                               4684                 :                 }
                               4685                 :         | CREATE OptNoLog MATERIALIZED VIEW IF_P NOT EXISTS create_mv_target AS SelectStmt opt_with_data
                               4686                 :                 {
 3039 andrew                   4687              24 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
                               4688                 : 
                               4689              24 :                     ctas->query = $10;
                               4690              24 :                     ctas->into = $8;
 1002 michael                  4691              24 :                     ctas->objtype = OBJECT_MATVIEW;
 3039 andrew                   4692              24 :                     ctas->is_select_into = false;
                               4693              24 :                     ctas->if_not_exists = true;
                               4694                 :                     /* cram additional flags into the IntoClause */
                               4695              24 :                     $8->rel->relpersistence = $2;
                               4696              24 :                     $8->skipData = !($11);
                               4697              24 :                     $$ = (Node *) ctas;
                               4698                 :                 }
 3689 kgrittn                  4699 ECB             :         ;
                               4700                 : 
                               4701                 : create_mv_target:
 1495 andres                   4702                 :             qualified_name opt_column_list table_access_method_clause opt_reloptions OptTableSpace
 3689 kgrittn                  4703                 :                 {
 3689 kgrittn                  4704 CBC         272 :                     $$ = makeNode(IntoClause);
                               4705             272 :                     $$->rel = $1;
 3689 kgrittn                  4706 GIC         272 :                     $$->colNames = $2;
 1495 andres                   4707 CBC         272 :                     $$->accessMethod = $3;
                               4708             272 :                     $$->options = $4;
 3689 kgrittn                  4709             272 :                     $$->onCommit = ONCOMMIT_NOOP;
 1495 andres                   4710 GIC         272 :                     $$->tableSpaceName = $5;
 3649 tgl                      4711             272 :                     $$->viewQuery = NULL;        /* filled at analysis time */
 3689 kgrittn                  4712             272 :                     $$->skipData = false;        /* might get changed later */
 3689 kgrittn                  4713 ECB             :                 }
                               4714                 :         ;
                               4715                 : 
 3689 kgrittn                  4716 LBC           0 : OptNoLog:   UNLOGGED                    { $$ = RELPERSISTENCE_UNLOGGED; }
 3689 kgrittn                  4717 CBC         272 :             | /*EMPTY*/                 { $$ = RELPERSISTENCE_PERMANENT; }
 3689 kgrittn                  4718 ECB             :         ;
                               4719                 : 
                               4720                 : 
                               4721                 : /*****************************************************************************
                               4722                 :  *
                               4723                 :  *      QUERY :
                               4724                 :  *              REFRESH MATERIALIZED VIEW qualified_name
                               4725                 :  *
                               4726                 :  *****************************************************************************/
                               4727                 : 
                               4728                 : RefreshMatViewStmt:
                               4729                 :             REFRESH MATERIALIZED VIEW opt_concurrently qualified_name opt_with_data
                               4730                 :                 {
 3689 kgrittn                  4731 CBC         123 :                     RefreshMatViewStmt *n = makeNode(RefreshMatViewStmt);
  331 peter                    4732 ECB             : 
 3554 kgrittn                  4733 CBC         123 :                     n->concurrent = $4;
                               4734             123 :                     n->relation = $5;
                               4735             123 :                     n->skipData = !($6);
 3689                          4736             123 :                     $$ = (Node *) n;
 3689 kgrittn                  4737 ECB             :                 }
                               4738                 :         ;
                               4739                 : 
                               4740                 : 
                               4741                 : /*****************************************************************************
                               4742                 :  *
                               4743                 :  *      QUERY :
 9344 bruce                    4744                 :  *              CREATE SEQUENCE seqname
 7325                          4745                 :  *              ALTER SEQUENCE seqname
 9503 vadim4o                  4746                 :  *
                               4747                 :  *****************************************************************************/
                               4748                 : 
                               4749                 : CreateSeqStmt:
                               4750                 :             CREATE OptTemp SEQUENCE qualified_name OptSeqOptList
                               4751                 :                 {
 9344 bruce                    4752 GIC         296 :                     CreateSeqStmt *n = makeNode(CreateSeqStmt);
                               4753                 : 
 4500 rhaas                    4754             296 :                     $4->relpersistence = $2;
 7689 tgl                      4755             296 :                     n->sequence = $4;
 7960 bruce                    4756             296 :                     n->options = $5;
 4617 tgl                      4757             296 :                     n->ownerId = InvalidOid;
 3148 heikki.linnakangas       4758             296 :                     n->if_not_exists = false;
  331 peter                    4759             296 :                     $$ = (Node *) n;
 3148 heikki.linnakangas       4760 ECB             :                 }
                               4761                 :             | CREATE OptTemp SEQUENCE IF_P NOT EXISTS qualified_name OptSeqOptList
                               4762                 :                 {
 3148 heikki.linnakangas       4763 CBC          12 :                     CreateSeqStmt *n = makeNode(CreateSeqStmt);
  331 peter                    4764 ECB             : 
 3148 heikki.linnakangas       4765 CBC          12 :                     $7->relpersistence = $2;
                               4766              12 :                     n->sequence = $7;
 3148 heikki.linnakangas       4767 GIC          12 :                     n->options = $8;
 3148 heikki.linnakangas       4768 CBC          12 :                     n->ownerId = InvalidOid;
                               4769              12 :                     n->if_not_exists = true;
  331 peter                    4770              12 :                     $$ = (Node *) n;
                               4771                 :                 }
                               4772                 :         ;
                               4773                 : 
 7325 bruce                    4774 ECB             : AlterSeqStmt:
                               4775                 :             ALTER SEQUENCE qualified_name SeqOptList
                               4776                 :                 {
 7325 bruce                    4777 CBC          87 :                     AlterSeqStmt *n = makeNode(AlterSeqStmt);
  331 peter                    4778 ECB             : 
 7325 bruce                    4779 CBC          87 :                     n->sequence = $3;
                               4780              87 :                     n->options = $4;
 4094 simon                    4781 GIC          87 :                     n->missing_ok = false;
  331 peter                    4782 CBC          87 :                     $$ = (Node *) n;
 7325 bruce                    4783 ECB             :                 }
 4094 simon                    4784                 :             | ALTER SEQUENCE IF_P EXISTS qualified_name SeqOptList
                               4785                 :                 {
 4094 simon                    4786 GIC           6 :                     AlterSeqStmt *n = makeNode(AlterSeqStmt);
                               4787                 : 
                               4788               6 :                     n->sequence = $5;
                               4789               6 :                     n->options = $6;
                               4790               6 :                     n->missing_ok = true;
  331 peter                    4791 CBC           6 :                     $$ = (Node *) n;
 4094 simon                    4792 ECB             :                 }
                               4793                 : 
 7325 bruce                    4794                 :         ;
                               4795                 : 
 5411 tgl                      4796 CBC         118 : OptSeqOptList: SeqOptList                           { $$ = $1; }
 7552                          4797             190 :             | /*EMPTY*/                             { $$ = NIL; }
 9344 bruce                    4798 ECB             :         ;
                               4799                 : 
 2194 peter_e                  4800 GIC          20 : OptParenthesizedSeqOptList: '(' SeqOptList ')'      { $$ = $2; }
                               4801             145 :             | /*EMPTY*/                             { $$ = NIL; }
                               4802                 :         ;
 2194 peter_e                  4803 EUB             : 
 5411 tgl                      4804 CBC         231 : SeqOptList: SeqOptElem                              { $$ = list_make1($1); }
 5411 tgl                      4805 GIC         322 :             | SeqOptList SeqOptElem                 { $$ = lappend($1, $2); }
                               4806                 :         ;
                               4807                 : 
                               4808                 : SeqOptElem: AS SimpleTypename
                               4809                 :                 {
  331 peter                    4810              90 :                     $$ = makeDefElem("as", (Node *) $2, @1);
                               4811                 :                 }
                               4812                 :             | CACHE NumericOnly
                               4813                 :                 {
                               4814              48 :                     $$ = makeDefElem("cache", (Node *) $2, @1);
                               4815                 :                 }
                               4816                 :             | CYCLE
                               4817                 :                 {
  331 peter                    4818 CBC          17 :                     $$ = makeDefElem("cycle", (Node *) makeBoolean(true), @1);
                               4819                 :                 }
 7455 bruce                    4820 ECB             :             | NO CYCLE
 9153 lockhart                 4821                 :                 {
  331 peter                    4822 CBC           7 :                     $$ = makeDefElem("cycle", (Node *) makeBoolean(false), @1);
 7455 bruce                    4823 ECB             :                 }
                               4824                 :             | INCREMENT opt_by NumericOnly
                               4825                 :                 {
  331 peter                    4826 GIC          99 :                     $$ = makeDefElem("increment", (Node *) $3, @1);
                               4827                 :                 }
                               4828                 :             | MAXVALUE NumericOnly
                               4829                 :                 {
                               4830              34 :                     $$ = makeDefElem("maxvalue", (Node *) $2, @1);
                               4831                 :                 }
                               4832                 :             | MINVALUE NumericOnly
                               4833                 :                 {
                               4834              36 :                     $$ = makeDefElem("minvalue", (Node *) $2, @1);
                               4835                 :                 }
                               4836                 :             | NO MAXVALUE
                               4837                 :                 {
 2406 peter_e                  4838              37 :                     $$ = makeDefElem("maxvalue", NULL, @1);
 7360 bruce                    4839 ECB             :                 }
                               4840                 :             | NO MINVALUE
                               4841                 :                 {
 2406 peter_e                  4842 CBC          37 :                     $$ = makeDefElem("minvalue", NULL, @1);
 7360 bruce                    4843 ECB             :                 }
 6075 tgl                      4844                 :             | OWNED BY any_name
                               4845                 :                 {
  331 peter                    4846 CBC          31 :                     $$ = makeDefElem("owned_by", (Node *) $3, @1);
                               4847                 :                 }
                               4848                 :             | SEQUENCE NAME_P any_name
                               4849                 :                 {
 2194 peter_e                  4850 ECB             :                     /* not documented, only used by pg_dump */
  331 peter                    4851 GIC          14 :                     $$ = makeDefElem("sequence_name", (Node *) $3, @1);
 2194 peter_e                  4852 ECB             :                 }
 7455 bruce                    4853                 :             | START opt_with NumericOnly
 9153 lockhart                 4854                 :                 {
  331 peter                    4855 CBC          82 :                     $$ = makeDefElem("start", (Node *) $3, @1);
 9153 lockhart                 4856 ECB             :                 }
 5441 tgl                      4857                 :             | RESTART
                               4858                 :                 {
 2406 peter_e                  4859 GIC           3 :                     $$ = makeDefElem("restart", NULL, @1);
                               4860                 :                 }
                               4861                 :             | RESTART opt_with NumericOnly
                               4862                 :                 {
  331 peter                    4863              30 :                     $$ = makeDefElem("restart", (Node *) $3, @1);
 7325 bruce                    4864 ECB             :                 }
                               4865                 :         ;
 9153 lockhart                 4866                 : 
  878 peter                    4867                 : opt_by:     BY
  874                          4868                 :             | /* EMPTY */
 7455 bruce                    4869                 :       ;
                               4870                 : 
                               4871                 : NumericOnly:
  577 peter                    4872 GIC         158 :             FCONST                              { $$ = (Node *) makeFloat($1); }
  577 peter                    4873 LBC           0 :             | '+' FCONST                        { $$ = (Node *) makeFloat($2); }
                               4874                 :             | '-' FCONST
 9041 lockhart                 4875 ECB             :                 {
  331 peter                    4876 CBC          10 :                     Float      *f = makeFloat($2);
  331 peter                    4877 ECB             : 
  577 peter                    4878 CBC          10 :                     doNegateFloat(f);
  577 peter                    4879 GIC          10 :                     $$ = (Node *) f;
                               4880                 :                 }
                               4881           18454 :             | SignedIconst                      { $$ = (Node *) makeInteger($1); }
                               4882                 :         ;
 9041 lockhart                 4883 ECB             : 
 4683 rhaas                    4884 CBC          40 : NumericOnly_list:   NumericOnly                     { $$ = list_make1($1); }
 4683 rhaas                    4885 GIC           3 :                 | NumericOnly_list ',' NumericOnly  { $$ = lappend($1, $3); }
                               4886                 :         ;
 4683 rhaas                    4887 ECB             : 
 9294 vadim4o                  4888                 : /*****************************************************************************
                               4889                 :  *
                               4890                 :  *      QUERIES :
 4793 tgl                      4891                 :  *              CREATE [OR REPLACE] [TRUSTED] [PROCEDURAL] LANGUAGE ...
                               4892                 :  *              DROP [PROCEDURAL] LANGUAGE ...
                               4893                 :  *
                               4894                 :  *****************************************************************************/
                               4895                 : 
                               4896                 : CreatePLangStmt:
 1032 peter                    4897                 :             CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name
                               4898                 :             {
                               4899                 :                 /*
                               4900                 :                  * We now interpret parameterless CREATE LANGUAGE as
 1166 tgl                      4901                 :                  * CREATE EXTENSION.  "OR REPLACE" is silently translated
                               4902                 :                  * to "IF NOT EXISTS", which isn't quite the same, but
                               4903                 :                  * seems more useful than throwing an error.  We just
                               4904                 :                  * ignore TRUSTED, as the previous code would have too.
                               4905                 :                  */
 1166 tgl                      4906 UIC           0 :                 CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
                               4907                 : 
                               4908               0 :                 n->if_not_exists = $2;
 1166 tgl                      4909 LBC           0 :                 n->extname = $6;
 1166 tgl                      4910 UIC           0 :                 n->options = NIL;
  331 peter                    4911               0 :                 $$ = (Node *) n;
                               4912                 :             }
 1032 peter                    4913 ECB             :             | CREATE opt_or_replace opt_trusted opt_procedural LANGUAGE name
                               4914                 :               HANDLER handler_name opt_inline_handler opt_validator
                               4915                 :             {
 9294 vadim4o                  4916 GIC         326 :                 CreatePLangStmt *n = makeNode(CreatePLangStmt);
  331 peter                    4917 ECB             : 
 4793 tgl                      4918 GIC         326 :                 n->replace = $2;
                               4919             326 :                 n->plname = $6;
                               4920             326 :                 n->plhandler = $8;
 4793 tgl                      4921 CBC         326 :                 n->plinline = $9;
 4793 tgl                      4922 GIC         326 :                 n->plvalidator = $10;
                               4923             326 :                 n->pltrusted = $3;
  331 peter                    4924             326 :                 $$ = (Node *) n;
 9294 vadim4o                  4925 ECB             :             }
                               4926                 :         ;
                               4927                 : 
                               4928                 : opt_trusted:
 2062 peter_e                  4929 CBC         311 :             TRUSTED                                 { $$ = true; }
 2062 peter_e                  4930 GIC          18 :             | /*EMPTY*/                             { $$ = false; }
                               4931                 :         ;
                               4932                 : 
 7681 tgl                      4933 ECB             : /* This ought to be just func_name, but that causes reduce/reduce conflicts
                               4934                 :  * (CREATE LANGUAGE is the only place where func_name isn't followed by '(').
                               4935                 :  * Work around by using simple names, instead.
                               4936                 :  */
                               4937                 : handler_name:
 6878 tgl                      4938 CBC        1038 :             name                        { $$ = list_make1(makeString($1)); }
 6878 tgl                      4939 GIC           1 :             | name attrs                { $$ = lcons(makeString($1), $2); }
                               4940                 :         ;
                               4941                 : 
 4947 tgl                      4942 ECB             : opt_inline_handler:
 4947 tgl                      4943 GIC         317 :             INLINE_P handler_name                   { $$ = $2; }
                               4944               9 :             | /*EMPTY*/                             { $$ = NIL; }
                               4945                 :         ;
 4947 tgl                      4946 ECB             : 
                               4947                 : validator_clause:
 6425 tgl                      4948 GIC         317 :             VALIDATOR handler_name                  { $$ = $2; }
 5157 peter_e                  4949 UIC           0 :             | NO VALIDATOR                          { $$ = NIL; }
 5157 peter_e                  4950 ECB             :         ;
                               4951                 : 
                               4952                 : opt_validator:
 5157 peter_e                  4953 GIC         317 :             validator_clause                        { $$ = $1; }
 6425 tgl                      4954               9 :             | /*EMPTY*/                             { $$ = NIL; }
                               4955                 :         ;
                               4956                 : 
                               4957                 : opt_procedural:
                               4958                 :             PROCEDURAL
  878 peter                    4959 ECB             :             | /*EMPTY*/
 8191 bruce                    4960 EUB             :         ;
                               4961                 : 
                               4962                 : /*****************************************************************************
 6869 tgl                      4963 ECB             :  *
                               4964                 :  *      QUERY:
                               4965                 :  *             CREATE TABLESPACE tablespace LOCATION '/path/to/tablespace/'
                               4966                 :  *
                               4967                 :  *****************************************************************************/
                               4968                 : 
                               4969                 : CreateTableSpaceStmt: CREATE TABLESPACE name OptTableSpaceOwner LOCATION Sconst opt_reloptions
                               4970                 :                 {
 6869 tgl                      4971 CBC          48 :                     CreateTableSpaceStmt *n = makeNode(CreateTableSpaceStmt);
  331 peter                    4972 ECB             : 
 6869 tgl                      4973 GIC          48 :                     n->tablespacename = $3;
                               4974              48 :                     n->owner = $4;
                               4975              48 :                     n->location = $6;
 3368 sfrost                   4976              48 :                     n->options = $7;
 6869 tgl                      4977              48 :                     $$ = (Node *) n;
                               4978                 :                 }
                               4979                 :         ;
                               4980                 : 
 2953 alvherre                 4981 UIC           0 : OptTableSpaceOwner: OWNER RoleSpec      { $$ = $2; }
 6869 tgl                      4982 GIC          48 :             | /*EMPTY */                { $$ = NULL; }
                               4983                 :         ;
                               4984                 : 
                               4985                 : /*****************************************************************************
                               4986                 :  *
                               4987                 :  *      QUERY :
                               4988                 :  *              DROP TABLESPACE <tablespace>
                               4989                 :  *
                               4990                 :  *      No need for drop behaviour as we cannot implement dependencies for
                               4991                 :  *      objects in other databases; we can only support RESTRICT.
                               4992                 :  *
 6869 tgl                      4993 EUB             :  ****************************************************************************/
                               4994                 : 
                               4995                 : DropTableSpaceStmt: DROP TABLESPACE name
                               4996                 :                 {
 6869 tgl                      4997 GBC          30 :                     DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
  331 peter                    4998 EUB             : 
 6869 tgl                      4999 GIC          30 :                     n->tablespacename = $3;
 6141 andrew                   5000              30 :                     n->missing_ok = false;
                               5001              30 :                     $$ = (Node *) n;
                               5002                 :                 }
 6141 andrew                   5003 ECB             :                 |  DROP TABLESPACE IF_P EXISTS name
                               5004                 :                 {
 6141 andrew                   5005 LBC           0 :                     DropTableSpaceStmt *n = makeNode(DropTableSpaceStmt);
  331 peter                    5006 ECB             : 
 6141 andrew                   5007 LBC           0 :                     n->tablespacename = $5;
                               5008               0 :                     n->missing_ok = true;
 6869 tgl                      5009               0 :                     $$ = (Node *) n;
 6869 tgl                      5010 ECB             :                 }
                               5011                 :         ;
                               5012                 : 
                               5013                 : /*****************************************************************************
                               5014                 :  *
                               5015                 :  *      QUERY:
 4443                          5016                 :  *             CREATE EXTENSION extension
 1145                          5017                 :  *             [ WITH ] [ SCHEMA schema ] [ VERSION version ]
                               5018                 :  *
                               5019                 :  *****************************************************************************/
                               5020                 : 
                               5021                 : CreateExtensionStmt: CREATE EXTENSION name opt_with create_extension_opt_list
                               5022                 :                 {
 4443 tgl                      5023 GIC         445 :                     CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
                               5024                 : 
 4443 tgl                      5025 CBC         445 :                     n->extname = $3;
 4419                          5026             445 :                     n->if_not_exists = false;
 4443 tgl                      5027 GIC         445 :                     n->options = $5;
                               5028             445 :                     $$ = (Node *) n;
                               5029                 :                 }
 4419 tgl                      5030 ECB             :                 | CREATE EXTENSION IF_P NOT EXISTS name opt_with create_extension_opt_list
                               5031                 :                 {
 4419 tgl                      5032 GIC           7 :                     CreateExtensionStmt *n = makeNode(CreateExtensionStmt);
                               5033                 : 
                               5034               7 :                     n->extname = $6;
 4419 tgl                      5035 CBC           7 :                     n->if_not_exists = true;
 4419 tgl                      5036 GBC           7 :                     n->options = $8;
 4419 tgl                      5037 GIC           7 :                     $$ = (Node *) n;
                               5038                 :                 }
                               5039                 :         ;
 4443 tgl                      5040 ECB             : 
                               5041                 : create_extension_opt_list:
                               5042                 :             create_extension_opt_list create_extension_opt_item
 4443 tgl                      5043 GIC          39 :                 { $$ = lappend($1, $2); }
                               5044                 :             | /* EMPTY */
                               5045             452 :                 { $$ = NIL; }
                               5046                 :         ;
                               5047                 : 
                               5048                 : create_extension_opt_item:
                               5049                 :             SCHEMA name
                               5050                 :                 {
  331 peter                    5051              17 :                     $$ = makeDefElem("schema", (Node *) makeString($2), @1);
                               5052                 :                 }
                               5053                 :             | VERSION_P NonReservedWord_or_Sconst
                               5054                 :                 {
                               5055               3 :                     $$ = makeDefElem("new_version", (Node *) makeString($2), @1);
                               5056                 :                 }
                               5057                 :             | FROM NonReservedWord_or_Sconst
 4440 tgl                      5058 ECB             :                 {
 1145 tgl                      5059 UIC           0 :                     ereport(ERROR,
 1145 tgl                      5060 ECB             :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               5061                 :                              errmsg("CREATE EXTENSION ... FROM is no longer supported"),
                               5062                 :                              parser_errposition(@1)));
 4440                          5063                 :                 }
 2745 andres                   5064                 :             | CASCADE
                               5065                 :                 {
  331 peter                    5066 GIC          19 :                     $$ = makeDefElem("cascade", (Node *) makeBoolean(true), @1);
                               5067                 :                 }
 4440 tgl                      5068 EUB             :         ;
 4440 tgl                      5069 ECB             : 
                               5070                 : /*****************************************************************************
                               5071                 :  *
                               5072                 :  * ALTER EXTENSION name UPDATE [ TO version ]
                               5073                 :  *
                               5074                 :  *****************************************************************************/
                               5075                 : 
                               5076                 : AlterExtensionStmt: ALTER EXTENSION name UPDATE alter_extension_opt_list
                               5077                 :                 {
 4440 tgl                      5078 GIC          11 :                     AlterExtensionStmt *n = makeNode(AlterExtensionStmt);
                               5079                 : 
                               5080              11 :                     n->extname = $3;
                               5081              11 :                     n->options = $5;
                               5082              11 :                     $$ = (Node *) n;
                               5083                 :                 }
 4440 tgl                      5084 ECB             :         ;
                               5085                 : 
                               5086                 : alter_extension_opt_list:
                               5087                 :             alter_extension_opt_list alter_extension_opt_item
 4440 tgl                      5088 CBC          11 :                 { $$ = lappend($1, $2); }
                               5089                 :             | /* EMPTY */
 4440 tgl                      5090 GIC          11 :                 { $$ = NIL; }
                               5091                 :         ;
 4440 tgl                      5092 EUB             : 
                               5093                 : alter_extension_opt_item:
 3598                          5094                 :             TO NonReservedWord_or_Sconst
 4440                          5095                 :                 {
  331 peter                    5096 GBC          11 :                     $$ = makeDefElem("new_version", (Node *) makeString($2), @1);
                               5097                 :                 }
                               5098                 :         ;
                               5099                 : 
                               5100                 : /*****************************************************************************
                               5101                 :  *
                               5102                 :  * ALTER EXTENSION name ADD/DROP object-identifier
                               5103                 :  *
                               5104                 :  *****************************************************************************/
                               5105                 : 
                               5106                 : AlterExtensionContentsStmt:
                               5107                 :             ALTER EXTENSION name add_drop object_type_name name
                               5108                 :                 {
 2380 tgl                      5109 GIC           9 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  331 peter                    5110 ECB             : 
 2380 tgl                      5111 GIC           9 :                     n->extname = $3;
 2380 tgl                      5112 CBC           9 :                     n->action = $4;
 1030 peter                    5113               9 :                     n->objtype = $5;
                               5114               9 :                     n->object = (Node *) makeString($6);
  331                          5115               9 :                     $$ = (Node *) n;
                               5116                 :                 }
                               5117                 :             | ALTER EXTENSION name add_drop object_type_any_name any_name
                               5118                 :                 {
 4441 tgl                      5119              24 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5120                 : 
 4442                          5121              24 :                     n->extname = $3;
 4441                          5122              24 :                     n->action = $4;
 1030 peter                    5123              24 :                     n->objtype = $5;
 2339 peter_e                  5124              24 :                     n->object = (Node *) $6;
  331 peter                    5125 GIC          24 :                     $$ = (Node *) n;
                               5126                 :                 }
                               5127                 :             | ALTER EXTENSION name add_drop AGGREGATE aggregate_with_argtypes
                               5128                 :                 {
 4439 peter_e                  5129               4 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  331 peter                    5130 ECB             : 
 4439 peter_e                  5131 GIC           4 :                     n->extname = $3;
 4439 peter_e                  5132 CBC           4 :                     n->action = $4;
 1030 peter                    5133 GIC           4 :                     n->objtype = OBJECT_AGGREGATE;
 2339 peter_e                  5134               4 :                     n->object = (Node *) $6;
  331 peter                    5135               4 :                     $$ = (Node *) n;
                               5136                 :                 }
                               5137                 :             | ALTER EXTENSION name add_drop CAST '(' Typename AS Typename ')'
 4442 tgl                      5138 ECB             :                 {
 4441 tgl                      5139 GIC           2 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5140                 : 
 4442                          5141               2 :                     n->extname = $3;
 4441 tgl                      5142 CBC           2 :                     n->action = $4;
 1030 peter                    5143 GIC           2 :                     n->objtype = OBJECT_CAST;
                               5144               2 :                     n->object = (Node *) list_make2($7, $9);
                               5145               2 :                     $$ = (Node *) n;
 4442 tgl                      5146 EUB             :                 }
                               5147                 :             | ALTER EXTENSION name add_drop DOMAIN_P Typename
                               5148                 :                 {
 4441 tgl                      5149 UIC           0 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5150                 : 
 4442                          5151               0 :                     n->extname = $3;
 4441                          5152               0 :                     n->action = $4;
 4442 tgl                      5153 LBC           0 :                     n->objtype = OBJECT_DOMAIN;
 2339 peter_e                  5154 UIC           0 :                     n->object = (Node *) $6;
  331 peter                    5155               0 :                     $$ = (Node *) n;
                               5156                 :                 }
                               5157                 :             | ALTER EXTENSION name add_drop FUNCTION function_with_argtypes
                               5158                 :                 {
 4441 tgl                      5159 GIC          31 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5160                 : 
 4442                          5161              31 :                     n->extname = $3;
 4441                          5162              31 :                     n->action = $4;
 4442                          5163              31 :                     n->objtype = OBJECT_FUNCTION;
 2339 peter_e                  5164              31 :                     n->object = (Node *) $6;
  331 peter                    5165 CBC          31 :                     $$ = (Node *) n;
                               5166                 :                 }
 2293 peter_e                  5167 ECB             :             | ALTER EXTENSION name add_drop OPERATOR operator_with_argtypes
 4442 tgl                      5168                 :                 {
 4441 tgl                      5169 CBC           9 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5170                 : 
 4442 tgl                      5171 GIC           9 :                     n->extname = $3;
 4441                          5172               9 :                     n->action = $4;
 4442                          5173               9 :                     n->objtype = OBJECT_OPERATOR;
 2339 peter_e                  5174               9 :                     n->object = (Node *) $6;
  331 peter                    5175 CBC           9 :                     $$ = (Node *) n;
                               5176                 :                 }
 1033 peter                    5177 ECB             :             | ALTER EXTENSION name add_drop OPERATOR CLASS any_name USING name
                               5178                 :                 {
 4441 tgl                      5179 GIC           2 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5180                 : 
 4442                          5181               2 :                     n->extname = $3;
 4441                          5182               2 :                     n->action = $4;
 4442 tgl                      5183 CBC           2 :                     n->objtype = OBJECT_OPCLASS;
 2339 peter_e                  5184 GIC           2 :                     n->object = (Node *) lcons(makeString($9), $7);
  331 peter                    5185               2 :                     $$ = (Node *) n;
                               5186                 :                 }
                               5187                 :             | ALTER EXTENSION name add_drop OPERATOR FAMILY any_name USING name
                               5188                 :                 {
 4441 tgl                      5189               2 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
                               5190                 : 
 4442                          5191               2 :                     n->extname = $3;
 4441                          5192               2 :                     n->action = $4;
 4442                          5193               2 :                     n->objtype = OBJECT_OPFAMILY;
 2339 peter_e                  5194               2 :                     n->object = (Node *) lcons(makeString($9), $7);
  331 peter                    5195               2 :                     $$ = (Node *) n;
 4442 tgl                      5196 ECB             :                 }
                               5197                 :             | ALTER EXTENSION name add_drop PROCEDURE function_with_argtypes
 1956 peter_e                  5198                 :                 {
 1956 peter_e                  5199 LBC           0 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  331 peter                    5200 ECB             : 
 1956 peter_e                  5201 LBC           0 :                     n->extname = $3;
                               5202               0 :                     n->action = $4;
 1956 peter_e                  5203 UIC           0 :                     n->objtype = OBJECT_PROCEDURE;
                               5204               0 :                     n->object = (Node *) $6;
  331 peter                    5205               0 :                     $$ = (Node *) n;
 1956 peter_e                  5206 ECB             :                 }
                               5207                 :             | ALTER EXTENSION name add_drop ROUTINE function_with_argtypes
                               5208                 :                 {
 1956 peter_e                  5209 LBC           0 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  331 peter                    5210 ECB             : 
 1956 peter_e                  5211 LBC           0 :                     n->extname = $3;
                               5212               0 :                     n->action = $4;
 1956 peter_e                  5213 UIC           0 :                     n->objtype = OBJECT_ROUTINE;
                               5214               0 :                     n->object = (Node *) $6;
  331 peter                    5215               0 :                     $$ = (Node *) n;
 1956 peter_e                  5216 ECB             :                 }
                               5217                 :             | ALTER EXTENSION name add_drop TRANSFORM FOR Typename LANGUAGE name
 2905                          5218                 :                 {
 2905 peter_e                  5219 CBC           2 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  331 peter                    5220 ECB             : 
 2905 peter_e                  5221 CBC           2 :                     n->extname = $3;
                               5222               2 :                     n->action = $4;
 2905 peter_e                  5223 GIC           2 :                     n->objtype = OBJECT_TRANSFORM;
 2339                          5224               2 :                     n->object = (Node *) list_make2($7, makeString($9));
  331 peter                    5225               2 :                     $$ = (Node *) n;
 2905 peter_e                  5226 ECB             :                 }
                               5227                 :             | ALTER EXTENSION name add_drop TYPE_P Typename
 4442 tgl                      5228                 :                 {
 4441 tgl                      5229 CBC           2 :                     AlterExtensionContentsStmt *n = makeNode(AlterExtensionContentsStmt);
  331 peter                    5230 ECB             : 
 4442 tgl                      5231 CBC           2 :                     n->extname = $3;
 4441                          5232               2 :                     n->action = $4;
 4442 tgl                      5233 GIC           2 :                     n->objtype = OBJECT_TYPE;
 2339 peter_e                  5234               2 :                     n->object = (Node *) $6;
  331 peter                    5235               2 :                     $$ = (Node *) n;
 4442 tgl                      5236 EUB             :                 }
                               5237                 :         ;
                               5238                 : 
 5224 peter_e                  5239                 : /*****************************************************************************
                               5240                 :  *
 4177                          5241                 :  *      QUERY:
 4432 tgl                      5242                 :  *             CREATE FOREIGN DATA WRAPPER name options
                               5243                 :  *
                               5244                 :  *****************************************************************************/
                               5245                 : 
 4432 tgl                      5246 ECB             : CreateFdwStmt: CREATE FOREIGN DATA_P WRAPPER name opt_fdw_options create_generic_options
                               5247                 :                 {
 5224 peter_e                  5248 CBC          94 :                     CreateFdwStmt *n = makeNode(CreateFdwStmt);
  331 peter                    5249 ECB             : 
 5224 peter_e                  5250 CBC          94 :                     n->fdwname = $5;
 4432 tgl                      5251              94 :                     n->func_options = $6;
 5157 peter_e                  5252              94 :                     n->options = $7;
 5224 peter_e                  5253 GIC          94 :                     $$ = (Node *) n;
                               5254                 :                 }
                               5255                 :         ;
 5224 peter_e                  5256 ECB             : 
                               5257                 : fdw_option:
  331 peter                    5258 CBC          27 :             HANDLER handler_name                { $$ = makeDefElem("handler", (Node *) $2, @1); }
 2406 peter_e                  5259 LBC           0 :             | NO HANDLER                        { $$ = makeDefElem("handler", NULL, @1); }
  331 peter                    5260 CBC          22 :             | VALIDATOR handler_name            { $$ = makeDefElem("validator", (Node *) $2, @1); }
 2406 peter_e                  5261               3 :             | NO VALIDATOR                      { $$ = makeDefElem("validator", NULL, @1); }
 4432 tgl                      5262 ECB             :         ;
                               5263                 : 
                               5264                 : fdw_options:
 4432 tgl                      5265 GIC          43 :             fdw_option                          { $$ = list_make1($1); }
 4432 tgl                      5266 CBC           9 :             | fdw_options fdw_option            { $$ = lappend($1, $2); }
                               5267                 :         ;
 4432 tgl                      5268 ECB             : 
                               5269                 : opt_fdw_options:
 4432 tgl                      5270 CBC          25 :             fdw_options                         { $$ = $1; }
                               5271             115 :             | /*EMPTY*/                         { $$ = NIL; }
 4432 tgl                      5272 ECB             :         ;
                               5273                 : 
                               5274                 : /*****************************************************************************
                               5275                 :  *
 4177 peter_e                  5276                 :  *      QUERY :
                               5277                 :  *              ALTER FOREIGN DATA WRAPPER name options
 5224                          5278                 :  *
                               5279                 :  ****************************************************************************/
                               5280                 : 
 4432 tgl                      5281                 : AlterFdwStmt: ALTER FOREIGN DATA_P WRAPPER name opt_fdw_options alter_generic_options
 5224 peter_e                  5282                 :                 {
 5224 peter_e                  5283 GIC          43 :                     AlterFdwStmt *n = makeNode(AlterFdwStmt);
                               5284                 : 
                               5285              43 :                     n->fdwname = $5;
 4432 tgl                      5286 GBC          43 :                     n->func_options = $6;
 5157 peter_e                  5287 GIC          43 :                     n->options = $7;
 5224 peter_e                  5288 GBC          43 :                     $$ = (Node *) n;
 5224 peter_e                  5289 EUB             :                 }
 4432 tgl                      5290                 :             | ALTER FOREIGN DATA_P WRAPPER name fdw_options
 5224 peter_e                  5291                 :                 {
 5224 peter_e                  5292 GBC          18 :                     AlterFdwStmt *n = makeNode(AlterFdwStmt);
                               5293                 : 
 5224 peter_e                  5294 GIC          18 :                     n->fdwname = $5;
 4432 tgl                      5295              18 :                     n->func_options = $6;
 4432 tgl                      5296 GBC          18 :                     n->options = NIL;
 5224 peter_e                  5297 GIC          18 :                     $$ = (Node *) n;
 5224 peter_e                  5298 EUB             :                 }
                               5299                 :         ;
                               5300                 : 
                               5301                 : /* Options definition for CREATE FDW, SERVER and USER MAPPING */
                               5302                 : create_generic_options:
 5118 tgl                      5303 GIC         340 :             OPTIONS '(' generic_option_list ')'         { $$ = $3; }
                               5304           35067 :             | /*EMPTY*/                                 { $$ = NIL; }
                               5305                 :         ;
 5224 peter_e                  5306 ECB             : 
                               5307                 : generic_option_list:
 5118 tgl                      5308                 :             generic_option_elem
                               5309                 :                 {
 5118 tgl                      5310 CBC         340 :                     $$ = list_make1($1);
 5118 tgl                      5311 ECB             :                 }
                               5312                 :             | generic_option_list ',' generic_option_elem
                               5313                 :                 {
 5118 tgl                      5314 GIC         216 :                     $$ = lappend($1, $3);
                               5315                 :                 }
 5224 peter_e                  5316 ECB             :         ;
                               5317                 : 
                               5318                 : /* Options definition for ALTER FDW, SERVER and USER MAPPING */
                               5319                 : alter_generic_options:
 5118 tgl                      5320 CBC         235 :             OPTIONS '(' alter_generic_option_list ')'       { $$ = $3; }
 5224 peter_e                  5321 ECB             :         ;
                               5322                 : 
                               5323                 : alter_generic_option_list:
                               5324                 :             alter_generic_option_elem
                               5325                 :                 {
 5118 tgl                      5326 GIC         235 :                     $$ = list_make1($1);
                               5327                 :                 }
                               5328                 :             | alter_generic_option_list ',' alter_generic_option_elem
                               5329                 :                 {
                               5330              83 :                     $$ = lappend($1, $3);
                               5331                 :                 }
                               5332                 :         ;
                               5333                 : 
                               5334                 : alter_generic_option_elem:
 5118 tgl                      5335 ECB             :             generic_option_elem
                               5336                 :                 {
 5118 tgl                      5337 CBC          99 :                     $$ = $1;
 5118 tgl                      5338 ECB             :                 }
                               5339                 :             | SET generic_option_elem
                               5340                 :                 {
 5118 tgl                      5341 GIC          61 :                     $$ = $2;
                               5342              61 :                     $$->defaction = DEFELEM_SET;
                               5343                 :                 }
                               5344                 :             | ADD_P generic_option_elem
 5118 tgl                      5345 ECB             :                 {
 5118 tgl                      5346 GBC          96 :                     $$ = $2;
 5118 tgl                      5347 CBC          96 :                     $$->defaction = DEFELEM_ADD;
 5118 tgl                      5348 ECB             :                 }
                               5349                 :             | DROP generic_option_name
                               5350                 :                 {
 2406 peter_e                  5351 GIC          62 :                     $$ = makeDefElemExtended(NULL, $2, NULL, DEFELEM_DROP, @2);
 5118 tgl                      5352 ECB             :                 }
 5224 peter_e                  5353                 :         ;
                               5354                 : 
                               5355                 : generic_option_elem:
                               5356                 :             generic_option_name generic_option_arg
 5118 tgl                      5357                 :                 {
 2406 peter_e                  5358 CBC         812 :                     $$ = makeDefElem($1, $2, @1);
                               5359                 :                 }
                               5360                 :         ;
                               5361                 : 
                               5362                 : generic_option_name:
 5118 tgl                      5363 GIC         874 :                 ColLabel            { $$ = $1; }
                               5364                 :         ;
                               5365                 : 
                               5366                 : /* We could use def_arg here, but the spec only requires string literals */
                               5367                 : generic_option_arg:
                               5368             812 :                 Sconst              { $$ = (Node *) makeString($1); }
                               5369                 :         ;
 5224 peter_e                  5370 ECB             : 
                               5371                 : /*****************************************************************************
                               5372                 :  *
 4177                          5373                 :  *      QUERY:
 5224                          5374                 :  *             CREATE SERVER name [TYPE] [VERSION] [OPTIONS]
                               5375                 :  *
                               5376                 :  *****************************************************************************/
                               5377                 : 
                               5378                 : CreateForeignServerStmt: CREATE SERVER name opt_type opt_foreign_server_version
                               5379                 :                          FOREIGN DATA_P WRAPPER name create_generic_options
                               5380                 :                 {
 5224 peter_e                  5381 CBC         123 :                     CreateForeignServerStmt *n = makeNode(CreateForeignServerStmt);
  331 peter                    5382 ECB             : 
 5224 peter_e                  5383 CBC         123 :                     n->servername = $3;
                               5384             123 :                     n->servertype = $4;
 5224 peter_e                  5385 GIC         123 :                     n->version = $5;
                               5386             123 :                     n->fdwname = $9;
                               5387             123 :                     n->options = $10;
 2211 andrew                   5388             123 :                     n->if_not_exists = false;
                               5389             123 :                     $$ = (Node *) n;
 2211 andrew                   5390 ECB             :                 }
                               5391                 :                 | CREATE SERVER IF_P NOT EXISTS name opt_type opt_foreign_server_version
                               5392                 :                          FOREIGN DATA_P WRAPPER name create_generic_options
                               5393                 :                 {
 2211 andrew                   5394 GIC          12 :                     CreateForeignServerStmt *n = makeNode(CreateForeignServerStmt);
                               5395                 : 
                               5396              12 :                     n->servername = $6;
 2211 andrew                   5397 CBC          12 :                     n->servertype = $7;
 2211 andrew                   5398 GIC          12 :                     n->version = $8;
                               5399              12 :                     n->fdwname = $12;
                               5400              12 :                     n->options = $13;
 2211 andrew                   5401 CBC          12 :                     n->if_not_exists = true;
 5224 peter_e                  5402 GIC          12 :                     $$ = (Node *) n;
                               5403                 :                 }
                               5404                 :         ;
                               5405                 : 
                               5406                 : opt_type:
 5224 peter_e                  5407 CBC           9 :             TYPE_P Sconst           { $$ = $2; }
 5224 peter_e                  5408 GIC         126 :             | /*EMPTY*/             { $$ = NULL; }
                               5409                 :         ;
                               5410                 : 
                               5411                 : 
                               5412                 : foreign_server_version:
 5224 peter_e                  5413 CBC          33 :             VERSION_P Sconst        { $$ = $2; }
 5224 peter_e                  5414 UIC           0 :         |   VERSION_P NULL_P        { $$ = NULL; }
                               5415                 :         ;
                               5416                 : 
 5224 peter_e                  5417 ECB             : opt_foreign_server_version:
 4177 peter_e                  5418 GIC           9 :             foreign_server_version  { $$ = $1; }
 5224                          5419             126 :             | /*EMPTY*/             { $$ = NULL; }
                               5420                 :         ;
                               5421                 : 
                               5422                 : /*****************************************************************************
                               5423                 :  *
 4177 peter_e                  5424 ECB             :  *      QUERY :
                               5425                 :  *              ALTER SERVER name [VERSION] [OPTIONS]
                               5426                 :  *
                               5427                 :  ****************************************************************************/
 5224                          5428                 : 
                               5429                 : AlterForeignServerStmt: ALTER SERVER name foreign_server_version alter_generic_options
                               5430                 :                 {
 5224 peter_e                  5431 GIC           3 :                     AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
                               5432                 : 
 5224 peter_e                  5433 CBC           3 :                     n->servername = $3;
                               5434               3 :                     n->version = $4;
 5224 peter_e                  5435 GIC           3 :                     n->options = $5;
                               5436               3 :                     n->has_version = true;
                               5437               3 :                     $$ = (Node *) n;
 5224 peter_e                  5438 ECB             :                 }
                               5439                 :             | ALTER SERVER name foreign_server_version
                               5440                 :                 {
 5224 peter_e                  5441 GIC          21 :                     AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
                               5442                 : 
                               5443              21 :                     n->servername = $3;
                               5444              21 :                     n->version = $4;
 5224 peter_e                  5445 CBC          21 :                     n->has_version = true;
 5224 peter_e                  5446 GIC          21 :                     $$ = (Node *) n;
                               5447                 :                 }
                               5448                 :             | ALTER SERVER name alter_generic_options
                               5449                 :                 {
 5224 peter_e                  5450 CBC          83 :                     AlterForeignServerStmt *n = makeNode(AlterForeignServerStmt);
                               5451                 : 
 5224 peter_e                  5452 GIC          83 :                     n->servername = $3;
                               5453              83 :                     n->options = $4;
                               5454              83 :                     $$ = (Node *) n;
 5224 peter_e                  5455 ECB             :                 }
                               5456                 :         ;
                               5457                 : 
                               5458                 : /*****************************************************************************
                               5459                 :  *
                               5460                 :  *      QUERY:
                               5461                 :  *             CREATE FOREIGN TABLE relname (...) SERVER name (...)
                               5462                 :  *
                               5463                 :  *****************************************************************************/
                               5464                 : 
                               5465                 : CreateForeignTableStmt:
                               5466                 :         CREATE FOREIGN TABLE qualified_name
                               5467                 :             '(' OptTableElementList ')'
 2940 tgl                      5468                 :             OptInherit SERVER name create_generic_options
                               5469                 :                 {
 4481 rhaas                    5470 CBC         179 :                     CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
  331 peter                    5471 ECB             : 
 4481 rhaas                    5472 CBC         179 :                     $4->relpersistence = RELPERSISTENCE_PERMANENT;
                               5473             179 :                     n->base.relation = $4;
 3680 tgl                      5474             179 :                     n->base.tableElts = $6;
 2940                          5475             179 :                     n->base.inhRelations = $8;
                               5476             179 :                     n->base.ofTypename = NULL;
 2940 tgl                      5477 GIC         179 :                     n->base.constraints = NIL;
                               5478             179 :                     n->base.options = NIL;
                               5479             179 :                     n->base.oncommit = ONCOMMIT_NOOP;
                               5480             179 :                     n->base.tablespacename = NULL;
 4481 rhaas                    5481 CBC         179 :                     n->base.if_not_exists = false;
                               5482                 :                     /* FDW-specific data */
 2940 tgl                      5483             179 :                     n->servername = $10;
                               5484             179 :                     n->options = $11;
 4481 rhaas                    5485             179 :                     $$ = (Node *) n;
 4481 rhaas                    5486 ECB             :                 }
                               5487                 :         | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name
 3680 tgl                      5488                 :             '(' OptTableElementList ')'
 2940                          5489                 :             OptInherit SERVER name create_generic_options
                               5490                 :                 {
 4481 rhaas                    5491 UIC           0 :                     CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
                               5492                 : 
                               5493               0 :                     $7->relpersistence = RELPERSISTENCE_PERMANENT;
 4481 rhaas                    5494 LBC           0 :                     n->base.relation = $7;
 3680 tgl                      5495               0 :                     n->base.tableElts = $9;
 2940 tgl                      5496 UIC           0 :                     n->base.inhRelations = $11;
                               5497               0 :                     n->base.ofTypename = NULL;
                               5498               0 :                     n->base.constraints = NIL;
                               5499               0 :                     n->base.options = NIL;
 2940 tgl                      5500 LBC           0 :                     n->base.oncommit = ONCOMMIT_NOOP;
 2940 tgl                      5501 UBC           0 :                     n->base.tablespacename = NULL;
 4481 rhaas                    5502 UIC           0 :                     n->base.if_not_exists = true;
                               5503                 :                     /* FDW-specific data */
 2940 tgl                      5504               0 :                     n->servername = $13;
 2940 tgl                      5505 LBC           0 :                     n->options = $14;
 4481 rhaas                    5506               0 :                     $$ = (Node *) n;
                               5507                 :                 }
                               5508                 :         | CREATE FOREIGN TABLE qualified_name
                               5509                 :             PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec
                               5510                 :             SERVER name create_generic_options
                               5511                 :                 {
 2314 rhaas                    5512 GIC          40 :                     CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
                               5513                 : 
                               5514              40 :                     $4->relpersistence = RELPERSISTENCE_PERMANENT;
                               5515              40 :                     n->base.relation = $4;
                               5516              40 :                     n->base.inhRelations = list_make1($7);
                               5517              40 :                     n->base.tableElts = $8;
 2142 tgl                      5518 CBC          40 :                     n->base.partbound = $9;
 2314 rhaas                    5519 GIC          40 :                     n->base.ofTypename = NULL;
 2314 rhaas                    5520 CBC          40 :                     n->base.constraints = NIL;
                               5521              40 :                     n->base.options = NIL;
                               5522              40 :                     n->base.oncommit = ONCOMMIT_NOOP;
                               5523              40 :                     n->base.tablespacename = NULL;
                               5524              40 :                     n->base.if_not_exists = false;
                               5525                 :                     /* FDW-specific data */
 2314 rhaas                    5526 GIC          40 :                     n->servername = $11;
                               5527              40 :                     n->options = $12;
 2314 rhaas                    5528 CBC          40 :                     $$ = (Node *) n;
                               5529                 :                 }
 2314 rhaas                    5530 ECB             :         | CREATE FOREIGN TABLE IF_P NOT EXISTS qualified_name
 2039                          5531                 :             PARTITION OF qualified_name OptTypedTableElementList PartitionBoundSpec
 2314                          5532                 :             SERVER name create_generic_options
                               5533                 :                 {
 2314 rhaas                    5534 UIC           0 :                     CreateForeignTableStmt *n = makeNode(CreateForeignTableStmt);
                               5535                 : 
                               5536               0 :                     $7->relpersistence = RELPERSISTENCE_PERMANENT;
 2314 rhaas                    5537 LBC           0 :                     n->base.relation = $7;
 2314 rhaas                    5538 UIC           0 :                     n->base.inhRelations = list_make1($10);
 2314 rhaas                    5539 LBC           0 :                     n->base.tableElts = $11;
 2142 tgl                      5540               0 :                     n->base.partbound = $12;
 2314 rhaas                    5541               0 :                     n->base.ofTypename = NULL;
 2314 rhaas                    5542 UIC           0 :                     n->base.constraints = NIL;
                               5543               0 :                     n->base.options = NIL;
                               5544               0 :                     n->base.oncommit = ONCOMMIT_NOOP;
                               5545               0 :                     n->base.tablespacename = NULL;
                               5546               0 :                     n->base.if_not_exists = true;
                               5547                 :                     /* FDW-specific data */
                               5548               0 :                     n->servername = $14;
                               5549               0 :                     n->options = $15;
                               5550               0 :                     $$ = (Node *) n;
                               5551                 :                 }
                               5552                 :         ;
                               5553                 : 
                               5554                 : /*****************************************************************************
                               5555                 :  *
                               5556                 :  *      QUERY:
 3195 tgl                      5557 ECB             :  *              IMPORT FOREIGN SCHEMA remote_schema
                               5558                 :  *              [ { LIMIT TO | EXCEPT } ( table_list ) ]
                               5559                 :  *              FROM SERVER server_name INTO local_schema [ OPTIONS (...) ]
                               5560                 :  *
                               5561                 :  ****************************************************************************/
                               5562                 : 
                               5563                 : ImportForeignSchemaStmt:
                               5564                 :         IMPORT_P FOREIGN SCHEMA name import_qualification
                               5565                 :           FROM SERVER name INTO name create_generic_options
                               5566                 :             {
 3195 tgl                      5567 CBC          22 :                 ImportForeignSchemaStmt *n = makeNode(ImportForeignSchemaStmt);
  331 peter                    5568 ECB             : 
 3195 tgl                      5569 GIC          22 :                 n->server_name = $8;
 3195 tgl                      5570 CBC          22 :                 n->remote_schema = $4;
                               5571              22 :                 n->local_schema = $10;
                               5572              22 :                 n->list_type = $5->type;
 3195 tgl                      5573 GIC          22 :                 n->table_list = $5->table_names;
                               5574              22 :                 n->options = $11;
                               5575              22 :                 $$ = (Node *) n;
                               5576                 :             }
                               5577                 :         ;
 3195 tgl                      5578 EUB             : 
                               5579                 : import_qualification_type:
  879 peter                    5580 GBC           5 :         LIMIT TO                { $$ = FDW_IMPORT_SCHEMA_LIMIT_TO; }
                               5581               7 :         | EXCEPT                { $$ = FDW_IMPORT_SCHEMA_EXCEPT; }
 3195 tgl                      5582 EUB             :         ;
                               5583                 : 
                               5584                 : import_qualification:
                               5585                 :         import_qualification_type '(' relation_expr_list ')'
                               5586                 :             {
 3195 tgl                      5587 GBC          12 :                 ImportQual *n = (ImportQual *) palloc(sizeof(ImportQual));
  331 peter                    5588 EUB             : 
 3195 tgl                      5589 GBC          12 :                 n->type = $1;
 3195 tgl                      5590 GIC          12 :                 n->table_names = $3;
 3195 tgl                      5591 GBC          12 :                 $$ = n;
 3195 tgl                      5592 EUB             :             }
                               5593                 :         | /*EMPTY*/
                               5594                 :             {
 3195 tgl                      5595 GIC          10 :                 ImportQual *n = (ImportQual *) palloc(sizeof(ImportQual));
                               5596              10 :                 n->type = FDW_IMPORT_SCHEMA_ALL;
                               5597              10 :                 n->table_names = NIL;
                               5598              10 :                 $$ = n;
 3195 tgl                      5599 ECB             :             }
                               5600                 :         ;
                               5601                 : 
 5224 peter_e                  5602                 : /*****************************************************************************
                               5603                 :  *
 4177                          5604                 :  *      QUERY:
 5224                          5605                 :  *             CREATE USER MAPPING FOR auth_ident SERVER name [OPTIONS]
                               5606                 :  *
                               5607                 :  *****************************************************************************/
                               5608                 : 
                               5609                 : CreateUserMappingStmt: CREATE USER MAPPING FOR auth_ident SERVER name create_generic_options
                               5610                 :                 {
 5224 peter_e                  5611 CBC         115 :                     CreateUserMappingStmt *n = makeNode(CreateUserMappingStmt);
                               5612                 : 
 2953 alvherre                 5613             115 :                     n->user = $5;
 5224 peter_e                  5614             115 :                     n->servername = $7;
                               5615             115 :                     n->options = $8;
 2211 andrew                   5616 GIC         115 :                     n->if_not_exists = false;
                               5617             115 :                     $$ = (Node *) n;
                               5618                 :                 }
                               5619                 :                 | CREATE USER MAPPING IF_P NOT EXISTS FOR auth_ident SERVER name create_generic_options
                               5620                 :                 {
 2211 andrew                   5621 GBC           3 :                     CreateUserMappingStmt *n = makeNode(CreateUserMappingStmt);
                               5622                 : 
                               5623               3 :                     n->user = $8;
                               5624               3 :                     n->servername = $10;
                               5625               3 :                     n->options = $11;
                               5626               3 :                     n->if_not_exists = true;
 5224 peter_e                  5627               3 :                     $$ = (Node *) n;
 5224 peter_e                  5628 EUB             :                 }
                               5629                 :         ;
                               5630                 : 
                               5631                 : /* User mapping authorization identifier */
 2953 alvherre                 5632 GBC         212 : auth_ident: RoleSpec            { $$ = $1; }
                               5633              23 :             | USER              { $$ = makeRoleSpec(ROLESPEC_CURRENT_USER, @1); }
                               5634                 :         ;
 5224 peter_e                  5635 EUB             : 
                               5636                 : /*****************************************************************************
                               5637                 :  *
                               5638                 :  *      QUERY :
                               5639                 :  *              DROP USER MAPPING FOR auth_ident SERVER name
                               5640                 :  *
                               5641                 :  * XXX you'd think this should have a CASCADE/RESTRICT option, even if it's
                               5642                 :  * only pro forma; but the SQL standard doesn't show one.
                               5643                 :  ****************************************************************************/
                               5644                 : 
                               5645                 : DropUserMappingStmt: DROP USER MAPPING FOR auth_ident SERVER name
                               5646                 :                 {
 5224 peter_e                  5647 GIC          43 :                     DropUserMappingStmt *n = makeNode(DropUserMappingStmt);
                               5648                 : 
 2953 alvherre                 5649              43 :                     n->user = $5;
 5224 peter_e                  5650              43 :                     n->servername = $7;
                               5651              43 :                     n->missing_ok = false;
                               5652              43 :                     $$ = (Node *) n;
                               5653                 :                 }
 5224 peter_e                  5654 ECB             :                 |  DROP USER MAPPING IF_P EXISTS FOR auth_ident SERVER name
                               5655                 :                 {
 5224 peter_e                  5656 CBC          19 :                     DropUserMappingStmt *n = makeNode(DropUserMappingStmt);
  331 peter                    5657 ECB             : 
 2953 alvherre                 5658 CBC          19 :                     n->user = $7;
 5224 peter_e                  5659              19 :                     n->servername = $9;
                               5660              19 :                     n->missing_ok = true;
                               5661              19 :                     $$ = (Node *) n;
 5224 peter_e                  5662 ECB             :                 }
                               5663                 :         ;
                               5664                 : 
                               5665                 : /*****************************************************************************
                               5666                 :  *
 4177                          5667                 :  *      QUERY :
 5224                          5668                 :  *              ALTER USER MAPPING FOR auth_ident SERVER name OPTIONS
                               5669                 :  *
                               5670                 :  ****************************************************************************/
                               5671                 : 
                               5672                 : AlterUserMappingStmt: ALTER USER MAPPING FOR auth_ident SERVER name alter_generic_options
                               5673                 :                 {
 5224 peter_e                  5674 CBC          55 :                     AlterUserMappingStmt *n = makeNode(AlterUserMappingStmt);
                               5675                 : 
 2953 alvherre                 5676              55 :                     n->user = $5;
 5224 peter_e                  5677              55 :                     n->servername = $7;
                               5678              55 :                     n->options = $8;
 5224 peter_e                  5679 GIC          55 :                     $$ = (Node *) n;
                               5680                 :                 }
                               5681                 :         ;
 5224 peter_e                  5682 ECB             : 
 3124 sfrost                   5683                 : /*****************************************************************************
                               5684                 :  *
                               5685                 :  *      QUERIES:
                               5686                 :  *              CREATE POLICY name ON table
                               5687                 :  *                  [AS { PERMISSIVE | RESTRICTIVE } ]
                               5688                 :  *                  [FOR { SELECT | INSERT | UPDATE | DELETE } ]
                               5689                 :  *                  [TO role, ...]
                               5690                 :  *                  [USING (qual)] [WITH CHECK (with check qual)]
                               5691                 :  *              ALTER POLICY name ON table [TO role, ...]
                               5692                 :  *                  [USING (qual)] [WITH CHECK (with check qual)]
                               5693                 :  *
                               5694                 :  *****************************************************************************/
                               5695                 : 
                               5696                 : CreatePolicyStmt:
                               5697                 :             CREATE POLICY name ON qualified_name RowSecurityDefaultPermissive
 2316                          5698                 :                 RowSecurityDefaultForCmd RowSecurityDefaultToRole
                               5699                 :                 RowSecurityOptionalExpr RowSecurityOptionalWithCheck
 3124                          5700                 :                 {
 3124 sfrost                   5701 CBC         314 :                     CreatePolicyStmt *n = makeNode(CreatePolicyStmt);
  331 peter                    5702 ECB             : 
 3124 sfrost                   5703 CBC         314 :                     n->policy_name = $3;
                               5704             314 :                     n->table = $5;
 2316 sfrost                   5705 GIC         314 :                     n->permissive = $6;
                               5706             314 :                     n->cmd_name = $7;
                               5707             314 :                     n->roles = $8;
 2316 sfrost                   5708 CBC         314 :                     n->qual = $9;
 2316 sfrost                   5709 GIC         314 :                     n->with_check = $10;
 3124 sfrost                   5710 CBC         314 :                     $$ = (Node *) n;
 3124 sfrost                   5711 ECB             :                 }
                               5712                 :         ;
                               5713                 : 
                               5714                 : AlterPolicyStmt:
                               5715                 :             ALTER POLICY name ON qualified_name RowSecurityOptionalToRole
                               5716                 :                 RowSecurityOptionalExpr RowSecurityOptionalWithCheck
                               5717                 :                 {
 3124 sfrost                   5718 GIC          42 :                     AlterPolicyStmt *n = makeNode(AlterPolicyStmt);
  331 peter                    5719 ECB             : 
 3124 sfrost                   5720 CBC          42 :                     n->policy_name = $3;
 3124 sfrost                   5721 GIC          42 :                     n->table = $5;
                               5722              42 :                     n->roles = $6;
                               5723              42 :                     n->qual = $7;
                               5724              42 :                     n->with_check = $8;
                               5725              42 :                     $$ = (Node *) n;
                               5726                 :                 }
                               5727                 :         ;
                               5728                 : 
                               5729                 : RowSecurityOptionalExpr:
                               5730             327 :             USING '(' a_expr ')'    { $$ = $3; }
                               5731              29 :             | /* EMPTY */           { $$ = NULL; }
                               5732                 :         ;
                               5733                 : 
 3124 sfrost                   5734 ECB             : RowSecurityOptionalWithCheck:
 3124 sfrost                   5735 GIC          61 :             WITH CHECK '(' a_expr ')'       { $$ = $4; }
 3124 sfrost                   5736 CBC         295 :             | /* EMPTY */                   { $$ = NULL; }
 3124 sfrost                   5737 ECB             :         ;
                               5738                 : 
                               5739                 : RowSecurityDefaultToRole:
 3124 sfrost                   5740 GIC          56 :             TO role_list            { $$ = $2; }
 2953 alvherre                 5741             258 :             | /* EMPTY */           { $$ = list_make1(makeRoleSpec(ROLESPEC_PUBLIC, -1)); }
                               5742                 :         ;
 3124 sfrost                   5743 ECB             : 
                               5744                 : RowSecurityOptionalToRole:
 3124 sfrost                   5745 CBC           6 :             TO role_list            { $$ = $2; }
                               5746              36 :             | /* EMPTY */           { $$ = NULL; }
 3124 sfrost                   5747 ECB             :         ;
                               5748                 : 
                               5749                 : RowSecurityDefaultPermissive:
                               5750                 :             AS IDENT
                               5751                 :                 {
 2316 sfrost                   5752 GIC          40 :                     if (strcmp($2, "permissive") == 0)
                               5753               9 :                         $$ = true;
                               5754              31 :                     else if (strcmp($2, "restrictive") == 0)
                               5755              28 :                         $$ = false;
                               5756                 :                     else
                               5757               3 :                         ereport(ERROR,
                               5758                 :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               5759                 :                                  errmsg("unrecognized row security option \"%s\"", $2),
                               5760                 :                                  errhint("Only PERMISSIVE or RESTRICTIVE policies are supported currently."),
  331 peter                    5761 ECB             :                                  parser_errposition(@2)));
                               5762                 : 
 2316 sfrost                   5763                 :                 }
 2316 sfrost                   5764 CBC         277 :             | /* EMPTY */           { $$ = true; }
 2316 sfrost                   5765 ECB             :         ;
                               5766                 : 
                               5767                 : RowSecurityDefaultForCmd:
 3124 sfrost                   5768 GIC         151 :             FOR row_security_cmd    { $$ = $2; }
                               5769             163 :             | /* EMPTY */           { $$ = "all"; }
                               5770                 :         ;
                               5771                 : 
                               5772                 : row_security_cmd:
                               5773              22 :             ALL             { $$ = "all"; }
                               5774              47 :         |   SELECT          { $$ = "select"; }
                               5775              22 :         |   INSERT          { $$ = "insert"; }
                               5776              39 :         |   UPDATE          { $$ = "update"; }
                               5777              21 :         |   DELETE_P        { $$ = "delete"; }
                               5778                 :         ;
                               5779                 : 
                               5780                 : /*****************************************************************************
                               5781                 :  *
                               5782                 :  *      QUERY:
                               5783                 :  *             CREATE ACCESS METHOD name HANDLER handler_name
                               5784                 :  *
                               5785                 :  *****************************************************************************/
                               5786                 : 
                               5787                 : CreateAmStmt: CREATE ACCESS METHOD name TYPE_P am_type HANDLER handler_name
 2573 alvherre                 5788 ECB             :                 {
 2573 alvherre                 5789 GIC          30 :                     CreateAmStmt *n = makeNode(CreateAmStmt);
  331 peter                    5790 ECB             : 
 2573 alvherre                 5791 CBC          30 :                     n->amname = $4;
                               5792              30 :                     n->handler_name = $8;
 1495 andres                   5793              30 :                     n->amtype = $6;
 2573 alvherre                 5794              30 :                     $$ = (Node *) n;
 2573 alvherre                 5795 ECB             :                 }
                               5796                 :         ;
                               5797                 : 
                               5798                 : am_type:
 1495 andres                   5799 GIC          16 :             INDEX           { $$ = AMTYPE_INDEX; }
                               5800              14 :         |   TABLE           { $$ = AMTYPE_TABLE; }
                               5801                 :         ;
                               5802                 : 
                               5803                 : /*****************************************************************************
                               5804                 :  *
 9344 bruce                    5805 ECB             :  *      QUERIES :
                               5806                 :  *              CREATE TRIGGER ...
 9348 vadim4o                  5807                 :  *
                               5808                 :  *****************************************************************************/
                               5809                 : 
 7601 bruce                    5810                 : CreateTrigStmt:
  876 tgl                      5811                 :             CREATE opt_or_replace TRIGGER name TriggerActionTime TriggerEvents ON
 2347 kgrittn                  5812                 :             qualified_name TriggerReferencing TriggerForSpec TriggerWhen
                               5813                 :             EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')'
                               5814                 :                 {
 9344 bruce                    5815 GIC        1488 :                     CreateTrigStmt *n = makeNode(CreateTrigStmt);
                               5816                 : 
  876 tgl                      5817 CBC        1488 :                     n->replace = $2;
                               5818            1488 :                     n->isconstraint = false;
  876 tgl                      5819 GIC        1488 :                     n->trigname = $4;
                               5820            1488 :                     n->relation = $8;
                               5821            1488 :                     n->funcname = $14;
  876 tgl                      5822 CBC        1488 :                     n->args = $16;
                               5823            1488 :                     n->row = $10;
  876 tgl                      5824 GIC        1488 :                     n->timing = $5;
                               5825            1488 :                     n->events = intVal(linitial($6));
                               5826            1488 :                     n->columns = (List *) lsecond($6);
  876 tgl                      5827 CBC        1488 :                     n->whenClause = $11;
                               5828            1488 :                     n->transitionRels = $9;
  745 peter                    5829 GIC        1488 :                     n->deferrable = false;
                               5830            1488 :                     n->initdeferred = false;
 7689 tgl                      5831            1488 :                     n->constrrel = NULL;
  331 peter                    5832 CBC        1488 :                     $$ = (Node *) n;
 8593 JanWieck                 5833 ECB             :                 }
                               5834                 :           | CREATE opt_or_replace CONSTRAINT TRIGGER name AFTER TriggerEvents ON
                               5835                 :             qualified_name OptConstrFromTable ConstraintAttributeSpec
                               5836                 :             FOR EACH ROW TriggerWhen
                               5837                 :             EXECUTE FUNCTION_or_PROCEDURE func_name '(' TriggerFuncArgs ')'
                               5838                 :                 {
 8593 JanWieck                 5839 CBC          27 :                     CreateTrigStmt *n = makeNode(CreateTrigStmt);
  331 peter                    5840 ECB             : 
  876 tgl                      5841 CBC          27 :                     n->replace = $2;
                               5842              27 :                     if (n->replace) /* not supported, see CreateTrigger */
  876 tgl                      5843 UIC           0 :                         ereport(ERROR,
  876 tgl                      5844 ECB             :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               5845                 :                                  errmsg("CREATE OR REPLACE CONSTRAINT TRIGGER is not supported")));
  876 tgl                      5846 GIC          27 :                     n->isconstraint = true;
                               5847              27 :                     n->trigname = $5;
                               5848              27 :                     n->relation = $9;
                               5849              27 :                     n->funcname = $18;
                               5850              27 :                     n->args = $20;
 2062 peter_e                  5851 CBC          27 :                     n->row = true;
 4564 tgl                      5852 GIC          27 :                     n->timing = TRIGGER_TYPE_AFTER;
  876                          5853              27 :                     n->events = intVal(linitial($7));
                               5854              27 :                     n->columns = (List *) lsecond($7);
  876 tgl                      5855 CBC          27 :                     n->whenClause = $15;
 2347 kgrittn                  5856              27 :                     n->transitionRels = NIL;
  876 tgl                      5857 GIC          27 :                     processCASbits($11, @11, "TRIGGER",
                               5858                 :                                    &n->deferrable, &n->initdeferred, NULL,
                               5859                 :                                    NULL, yyscanner);
  876 tgl                      5860 CBC          27 :                     n->constrrel = $10;
  331 peter                    5861              27 :                     $$ = (Node *) n;
 9344 bruce                    5862 ECB             :                 }
                               5863                 :         ;
                               5864                 : 
                               5865                 : TriggerActionTime:
 4564 tgl                      5866 GIC         668 :             BEFORE                              { $$ = TRIGGER_TYPE_BEFORE; }
                               5867             760 :             | AFTER                             { $$ = TRIGGER_TYPE_AFTER; }
                               5868              66 :             | INSTEAD OF                        { $$ = TRIGGER_TYPE_INSTEAD; }
                               5869                 :         ;
                               5870                 : 
                               5871                 : TriggerEvents:
                               5872                 :             TriggerOneEvent
 5043                          5873            1521 :                 { $$ = $1; }
                               5874                 :             | TriggerEvents OR TriggerOneEvent
                               5875                 :                 {
  331 peter                    5876 CBC         514 :                     int         events1 = intVal(linitial($1));
  331 peter                    5877 GIC         514 :                     int         events2 = intVal(linitial($3));
  331 peter                    5878 CBC         514 :                     List       *columns1 = (List *) lsecond($1);
                               5879             514 :                     List       *columns2 = (List *) lsecond($3);
 4925 tgl                      5880 ECB             : 
 4925 tgl                      5881 CBC         514 :                     if (events1 & events2)
 5018 tgl                      5882 GIC           3 :                         parser_yyerror("duplicate trigger events specified");
                               5883                 :                     /*
                               5884                 :                      * concat'ing the columns lists loses information about
                               5885                 :                      * which columns went with which event, but so long as
 4925 tgl                      5886 ECB             :                      * only UPDATE carries columns and we disallow multiple
                               5887                 :                      * UPDATE items, it doesn't matter.  Command execution
                               5888                 :                      * should just ignore the columns for non-UPDATE events.
                               5889                 :                      */
 4925 tgl                      5890 GIC         511 :                     $$ = list_make2(makeInteger(events1 | events2),
                               5891                 :                                     list_concat(columns1, columns2));
                               5892                 :                 }
                               5893                 :         ;
                               5894                 : 
                               5895                 : TriggerOneEvent:
                               5896                 :             INSERT
                               5897             747 :                 { $$ = list_make2(makeInteger(TRIGGER_TYPE_INSERT), NIL); }
                               5898                 :             | DELETE_P
                               5899             417 :                 { $$ = list_make2(makeInteger(TRIGGER_TYPE_DELETE), NIL); }
                               5900                 :             | UPDATE
                               5901             805 :                 { $$ = list_make2(makeInteger(TRIGGER_TYPE_UPDATE), NIL); }
 4925 tgl                      5902 ECB             :             | UPDATE OF columnList
 4925 tgl                      5903 GIC          47 :                 { $$ = list_make2(makeInteger(TRIGGER_TYPE_UPDATE), $3); }
 4925 tgl                      5904 ECB             :             | TRUNCATE
 4925 tgl                      5905 CBC          19 :                 { $$ = list_make2(makeInteger(TRIGGER_TYPE_TRUNCATE), NIL); }
 9344 bruce                    5906 ECB             :         ;
                               5907                 : 
 2347 kgrittn                  5908                 : TriggerReferencing:
 2347 kgrittn                  5909 CBC         212 :             REFERENCING TriggerTransitions          { $$ = $2; }
                               5910            1276 :             | /*EMPTY*/                             { $$ = NIL; }
 2347 kgrittn                  5911 ECB             :         ;
                               5912                 : 
                               5913                 : TriggerTransitions:
 2347 kgrittn                  5914 CBC         212 :             TriggerTransition                       { $$ = list_make1($1); }
                               5915              69 :             | TriggerTransitions TriggerTransition  { $$ = lappend($1, $2); }
 2347 kgrittn                  5916 ECB             :         ;
                               5917                 : 
                               5918                 : TriggerTransition:
                               5919                 :             TransitionOldOrNew TransitionRowOrTable opt_as TransitionRelName
                               5920                 :                 {
 2347 kgrittn                  5921 GIC         281 :                     TriggerTransition *n = makeNode(TriggerTransition);
                               5922                 : 
                               5923             281 :                     n->name = $4;
                               5924             281 :                     n->isNew = $1;
                               5925             281 :                     n->isTable = $2;
  331 peter                    5926 CBC         281 :                     $$ = (Node *) n;
                               5927                 :                 }
 2347 kgrittn                  5928 ECB             :         ;
                               5929                 : 
 2347 kgrittn                  5930 EUB             : TransitionOldOrNew:
 2062 peter_e                  5931 GIC         153 :             NEW                                     { $$ = true; }
                               5932             128 :             | OLD                                   { $$ = false; }
 2347 kgrittn                  5933 ECB             :         ;
                               5934                 : 
                               5935                 : TransitionRowOrTable:
 2062 peter_e                  5936 CBC         281 :             TABLE                                   { $$ = true; }
 2347 kgrittn                  5937 ECB             :             /*
                               5938                 :              * According to the standard, lack of a keyword here implies ROW.
                               5939                 :              * Support for that would require prohibiting ROW entirely here,
                               5940                 :              * reserving the keyword ROW, and/or requiring AS (instead of
                               5941                 :              * allowing it to be optional, as the standard specifies) as the
                               5942                 :              * next token.  Requiring ROW seems cleanest and easiest to
                               5943                 :              * explain.
                               5944                 :              */
 2062 peter_e                  5945 UIC           0 :             | ROW                                   { $$ = false; }
                               5946                 :         ;
 2347 kgrittn                  5947 ECB             : 
                               5948                 : TransitionRelName:
 2347 kgrittn                  5949 GIC         281 :             ColId                                   { $$ = $1; }
                               5950                 :         ;
                               5951                 : 
                               5952                 : TriggerForSpec:
 4564 tgl                      5953 ECB             :             FOR TriggerForOptEach TriggerForType
 9344 bruce                    5954                 :                 {
 9188 lockhart                 5955 CBC        1388 :                     $$ = $3;
                               5956                 :                 }
                               5957                 :             | /* EMPTY */
                               5958                 :                 {
                               5959                 :                     /*
 7442 bruce                    5960 ECB             :                      * If ROW/STATEMENT not specified, default to
                               5961                 :                      * STATEMENT, per SQL
                               5962                 :                      */
 2062 peter_e                  5963 CBC         100 :                     $$ = false;
 7442 bruce                    5964 ECB             :                 }
 9344                          5965                 :         ;
 9348 vadim4o                  5966                 : 
                               5967                 : TriggerForOptEach:
  878 peter                    5968                 :             EACH
                               5969                 :             | /*EMPTY*/
                               5970                 :         ;
                               5971                 : 
                               5972                 : TriggerForType:
 2062 peter_e                  5973 GIC        1005 :             ROW                                     { $$ = true; }
                               5974             383 :             | STATEMENT                             { $$ = false; }
                               5975                 :         ;
                               5976                 : 
 4888 tgl                      5977 ECB             : TriggerWhen:
 4888 tgl                      5978 GIC          76 :             WHEN '(' a_expr ')'                     { $$ = $3; }
                               5979            1439 :             | /*EMPTY*/                             { $$ = NULL; }
                               5980                 :         ;
                               5981                 : 
                               5982                 : FUNCTION_or_PROCEDURE:
                               5983                 :             FUNCTION
 1698 peter_e                  5984 ECB             :         |   PROCEDURE
                               5985                 :         ;
                               5986                 : 
                               5987                 : TriggerFuncArgs:
 6888 neilc                    5988 CBC         287 :             TriggerFuncArg                          { $$ = list_make1($1); }
 7600 bruce                    5989 GIC         132 :             | TriggerFuncArgs ',' TriggerFuncArg    { $$ = lappend($1, $3); }
 7601 bruce                    5990 CBC        1228 :             | /*EMPTY*/                             { $$ = NIL; }
                               5991                 :         ;
 9344 bruce                    5992 ECB             : 
                               5993                 : TriggerFuncArg:
                               5994                 :             Iconst
                               5995                 :                 {
  577 peter                    5996 CBC          51 :                     $$ = (Node *) makeString(psprintf("%d", $1));
 8276 tgl                      5997 ECB             :                 }
  577 peter                    5998 UIC           0 :             | FCONST                                { $$ = (Node *) makeString($1); }
  577 peter                    5999 GIC         348 :             | Sconst                                { $$ = (Node *) makeString($1); }
                               6000              20 :             | ColLabel                              { $$ = (Node *) makeString($1); }
 7601 bruce                    6001 ECB             :         ;
                               6002                 : 
                               6003                 : OptConstrFromTable:
 7601 bruce                    6004 GIC           6 :             FROM qualified_name                     { $$ = $2; }
                               6005              21 :             | /*EMPTY*/                             { $$ = NULL; }
                               6006                 :         ;
                               6007                 : 
 7601 bruce                    6008 ECB             : ConstraintAttributeSpec:
                               6009                 :             /*EMPTY*/
 4316 tgl                      6010 CBC       35772 :                 { $$ = 0; }
 4316 tgl                      6011 ECB             :             | ConstraintAttributeSpec ConstraintAttributeElem
 8593 JanWieck                 6012                 :                 {
 4316 tgl                      6013                 :                     /*
                               6014                 :                      * We must complain about conflicting options.
                               6015                 :                      * We could, but choose not to, complain about redundant
                               6016                 :                      * options (ie, where $2's bit is already set in $1).
                               6017                 :                      */
 4316 tgl                      6018 CBC         456 :                     int     newspec = $1 | $2;
 4316 tgl                      6019 ECB             : 
                               6020                 :                     /* special message for this case */
 4316 tgl                      6021 GIC         456 :                     if ((newspec & (CAS_NOT_DEFERRABLE | CAS_INITIALLY_DEFERRED)) == (CAS_NOT_DEFERRABLE | CAS_INITIALLY_DEFERRED))
 7204                          6022               3 :                         ereport(ERROR,
 7204 tgl                      6023 ECB             :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               6024                 :                                  errmsg("constraint declared INITIALLY DEFERRED must be DEFERRABLE"),
                               6025                 :                                  parser_errposition(@2)));
                               6026                 :                     /* generic message for other conflicts */
 4316 tgl                      6027 GIC         453 :                     if ((newspec & (CAS_NOT_DEFERRABLE | CAS_DEFERRABLE)) == (CAS_NOT_DEFERRABLE | CAS_DEFERRABLE) ||
                               6028             453 :                         (newspec & (CAS_INITIALLY_IMMEDIATE | CAS_INITIALLY_DEFERRED)) == (CAS_INITIALLY_IMMEDIATE | CAS_INITIALLY_DEFERRED))
 7204 tgl                      6029 UIC           0 :                         ereport(ERROR,
                               6030                 :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                               6031                 :                                  errmsg("conflicting constraint properties"),
 4316 tgl                      6032 EUB             :                                  parser_errposition(@2)));
 4316 tgl                      6033 GIC         453 :                     $$ = newspec;
                               6034                 :                 }
                               6035                 :         ;
 8593 JanWieck                 6036 ECB             : 
                               6037                 : ConstraintAttributeElem:
 4316 tgl                      6038 GIC          18 :             NOT DEFERRABLE                  { $$ = CAS_NOT_DEFERRABLE; }
                               6039              64 :             | DEFERRABLE                    { $$ = CAS_DEFERRABLE; }
                               6040              15 :             | INITIALLY IMMEDIATE           { $$ = CAS_INITIALLY_IMMEDIATE; }
                               6041              48 :             | INITIALLY DEFERRED            { $$ = CAS_INITIALLY_DEFERRED; }
 4316 tgl                      6042 CBC         258 :             | NOT VALID                     { $$ = CAS_NOT_VALID; }
 3911 alvherre                 6043 GIC          53 :             | NO INHERIT                    { $$ = CAS_NO_INHERIT; }
                               6044                 :         ;
                               6045                 : 
                               6046                 : 
                               6047                 : /*****************************************************************************
                               6048                 :  *
                               6049                 :  *      QUERIES :
 3917 rhaas                    6050 ECB             :  *              CREATE EVENT TRIGGER ...
                               6051                 :  *              ALTER EVENT TRIGGER ...
                               6052                 :  *
                               6053                 :  *****************************************************************************/
                               6054                 : 
                               6055                 : CreateEventTrigStmt:
                               6056                 :             CREATE EVENT TRIGGER name ON ColLabel
                               6057                 :             EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'
                               6058                 :                 {
 3917 rhaas                    6059 GIC          41 :                     CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt);
  331 peter                    6060 ECB             : 
 3917 rhaas                    6061 CBC          41 :                     n->trigname = $4;
 3917 rhaas                    6062 GIC          41 :                     n->eventname = $6;
                               6063              41 :                     n->whenclause = NULL;
                               6064              41 :                     n->funcname = $9;
  331 peter                    6065 CBC          41 :                     $$ = (Node *) n;
 3917 rhaas                    6066 ECB             :                 }
                               6067                 :           | CREATE EVENT TRIGGER name ON ColLabel
                               6068                 :             WHEN event_trigger_when_list
                               6069                 :             EXECUTE FUNCTION_or_PROCEDURE func_name '(' ')'
                               6070                 :                 {
 3917 rhaas                    6071 GIC          39 :                     CreateEventTrigStmt *n = makeNode(CreateEventTrigStmt);
                               6072                 : 
                               6073              39 :                     n->trigname = $4;
                               6074              39 :                     n->eventname = $6;
 3917 rhaas                    6075 CBC          39 :                     n->whenclause = $8;
                               6076              39 :                     n->funcname = $11;
  331 peter                    6077              39 :                     $$ = (Node *) n;
                               6078                 :                 }
                               6079                 :         ;
                               6080                 : 
                               6081                 : event_trigger_when_list:
                               6082                 :           event_trigger_when_item
 3917 rhaas                    6083              39 :             { $$ = list_make1($1); }
                               6084                 :         | event_trigger_when_list AND event_trigger_when_item
 3917 rhaas                    6085 GBC           3 :             { $$ = lappend($1, $3); }
 3917 rhaas                    6086 ECB             :         ;
                               6087                 : 
                               6088                 : event_trigger_when_item:
                               6089                 :         ColId IN_P '(' event_trigger_value_list ')'
 2406 peter_e                  6090 GIC          42 :             { $$ = makeDefElem($1, (Node *) $4, @1); }
 3917 rhaas                    6091 ECB             :         ;
                               6092                 : 
                               6093                 : event_trigger_value_list:
                               6094                 :           SCONST
 3917 rhaas                    6095 GIC          42 :             { $$ = list_make1(makeString($1)); }
                               6096                 :         | event_trigger_value_list ',' SCONST
 3917 rhaas                    6097 CBC          33 :             { $$ = lappend($1, makeString($3)); }
                               6098                 :         ;
                               6099                 : 
                               6100                 : AlterEventTrigStmt:
                               6101                 :             ALTER EVENT TRIGGER name enable_trigger
                               6102                 :                 {
 3917 rhaas                    6103 GIC          16 :                     AlterEventTrigStmt *n = makeNode(AlterEventTrigStmt);
                               6104                 : 
 3917 rhaas                    6105 CBC          16 :                     n->trigname = $4;
 3917 rhaas                    6106 GIC          16 :                     n->tgenabled = $5;
                               6107              16 :                     $$ = (Node *) n;
 3917 rhaas                    6108 ECB             :                 }
                               6109                 :         ;
                               6110                 : 
                               6111                 : enable_trigger:
 3917 rhaas                    6112 GIC           3 :             ENABLE_P                    { $$ = TRIGGER_FIRES_ON_ORIGIN; }
                               6113               3 :             | ENABLE_P REPLICA          { $$ = TRIGGER_FIRES_ON_REPLICA; }
 3917 rhaas                    6114 CBC           3 :             | ENABLE_P ALWAYS           { $$ = TRIGGER_FIRES_ALWAYS; }
                               6115               7 :             | DISABLE_P                 { $$ = TRIGGER_DISABLED; }
 3917 rhaas                    6116 EUB             :         ;
                               6117                 : 
                               6118                 : /*****************************************************************************
                               6119                 :  *
 1656 peter_e                  6120 ECB             :  *      QUERY :
                               6121                 :  *              CREATE ASSERTION ...
                               6122                 :  *
                               6123                 :  *****************************************************************************/
                               6124                 : 
                               6125                 : CreateAssertionStmt:
                               6126                 :             CREATE ASSERTION any_name CHECK '(' a_expr ')' ConstraintAttributeSpec
 7658 lockhart                 6127                 :                 {
 7204 tgl                      6128 LBC           0 :                     ereport(ERROR,
 7204 tgl                      6129 ECB             :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               6130                 :                              errmsg("CREATE ASSERTION is not yet implemented")));
                               6131                 : 
                               6132                 :                     $$ = NULL;
                               6133                 :                 }
                               6134                 :         ;
                               6135                 : 
                               6136                 : 
                               6137                 : /*****************************************************************************
                               6138                 :  *
                               6139                 :  *      QUERY :
                               6140                 :  *              define (aggregate,operator,type)
                               6141                 :  *
                               6142                 :  *****************************************************************************/
                               6143                 : 
                               6144                 : DefineStmt:
                               6145                 :             CREATE opt_or_replace AGGREGATE func_name aggr_args definition
 9344 bruce                    6146                 :                 {
 8402 lockhart                 6147 GIC         268 :                     DefineStmt *n = makeNode(DefineStmt);
  331 peter                    6148 ECB             : 
 7226 peter_e                  6149 CBC         268 :                     n->kind = OBJECT_AGGREGATE;
 6203 tgl                      6150             268 :                     n->oldstyle = false;
 1482 rhodiumtoad              6151             268 :                     n->replace = $2;
                               6152             268 :                     n->defnames = $4;
 1482 rhodiumtoad              6153 GIC         268 :                     n->args = $5;
                               6154             268 :                     n->definition = $6;
  331 peter                    6155             268 :                     $$ = (Node *) n;
                               6156                 :                 }
                               6157                 :             | CREATE opt_or_replace AGGREGATE func_name old_aggr_definition
 6203 tgl                      6158 ECB             :                 {
                               6159                 :                     /* old-style (pre-8.2) syntax for CREATE AGGREGATE */
 6203 tgl                      6160 CBC         181 :                     DefineStmt *n = makeNode(DefineStmt);
  331 peter                    6161 ECB             : 
 6203 tgl                      6162 CBC         181 :                     n->kind = OBJECT_AGGREGATE;
                               6163             181 :                     n->oldstyle = true;
 1482 rhodiumtoad              6164             181 :                     n->replace = $2;
 1482 rhodiumtoad              6165 GIC         181 :                     n->defnames = $4;
 6203 tgl                      6166             181 :                     n->args = NIL;
 1482 rhodiumtoad              6167             181 :                     n->definition = $5;
  331 peter                    6168             181 :                     $$ = (Node *) n;
                               6169                 :                 }
 7601 bruce                    6170 ECB             :             | CREATE OPERATOR any_operator definition
                               6171                 :                 {
 8143 tgl                      6172 CBC         745 :                     DefineStmt *n = makeNode(DefineStmt);
                               6173                 : 
 7226 peter_e                  6174 GIC         745 :                     n->kind = OBJECT_OPERATOR;
 6203 tgl                      6175             745 :                     n->oldstyle = false;
 7663                          6176             745 :                     n->defnames = $3;
 6203 tgl                      6177 CBC         745 :                     n->args = NIL;
 8143 tgl                      6178 GIC         745 :                     n->definition = $4;
  331 peter                    6179             745 :                     $$ = (Node *) n;
                               6180                 :                 }
                               6181                 :             | CREATE TYPE_P any_name definition
 8143 tgl                      6182 ECB             :                 {
 8143 tgl                      6183 GIC         103 :                     DefineStmt *n = makeNode(DefineStmt);
  331 peter                    6184 ECB             : 
 7226 peter_e                  6185 GIC         103 :                     n->kind = OBJECT_TYPE;
 6203 tgl                      6186             103 :                     n->oldstyle = false;
 7681                          6187             103 :                     n->defnames = $3;
 6203                          6188             103 :                     n->args = NIL;
 8402 lockhart                 6189             103 :                     n->definition = $4;
  331 peter                    6190 CBC         103 :                     $$ = (Node *) n;
                               6191                 :                 }
 5944 tgl                      6192 ECB             :             | CREATE TYPE_P any_name
 6249                          6193                 :                 {
                               6194                 :                     /* Shell type (identified by lack of definition) */
 6249 tgl                      6195 GIC          77 :                     DefineStmt *n = makeNode(DefineStmt);
                               6196                 : 
                               6197              77 :                     n->kind = OBJECT_TYPE;
 6203                          6198              77 :                     n->oldstyle = false;
 6249 tgl                      6199 CBC          77 :                     n->defnames = $3;
 6203                          6200              77 :                     n->args = NIL;
 6249                          6201              77 :                     n->definition = NIL;
  331 peter                    6202              77 :                     $$ = (Node *) n;
                               6203                 :                 }
                               6204                 :             | CREATE TYPE_P any_name AS '(' OptTableFuncElementList ')'
                               6205                 :                 {
 7542 bruce                    6206 GIC         315 :                     CompositeTypeStmt *n = makeNode(CompositeTypeStmt);
                               6207                 : 
                               6208                 :                     /* can't use qualified_name, sigh */
 4578 peter_e                  6209             315 :                     n->typevar = makeRangeVarFromAnyName($3, @3, yyscanner);
 7528 tgl                      6210             315 :                     n->coldeflist = $6;
  331 peter                    6211             315 :                     $$ = (Node *) n;
                               6212                 :                 }
                               6213                 :             | CREATE TYPE_P any_name AS ENUM_P '(' opt_enum_val_list ')'
                               6214                 :                 {
 5851 tgl                      6215 GBC          90 :                     CreateEnumStmt *n = makeNode(CreateEnumStmt);
                               6216                 : 
 5015 peter_e                  6217 GIC          90 :                     n->typeName = $3;
 5851 tgl                      6218              90 :                     n->vals = $7;
  331 peter                    6219              90 :                     $$ = (Node *) n;
                               6220                 :                 }
                               6221                 :             | CREATE TYPE_P any_name AS RANGE definition
                               6222                 :                 {
 4175 heikki.linnakangas       6223              76 :                     CreateRangeStmt *n = makeNode(CreateRangeStmt);
                               6224                 : 
                               6225              76 :                     n->typeName = $3;
  634 peter                    6226              76 :                     n->params = $6;
  331                          6227              76 :                     $$ = (Node *) n;
                               6228                 :                 }
                               6229                 :             | CREATE TEXT_P SEARCH PARSER any_name definition
                               6230                 :                 {
 5710 tgl                      6231              20 :                     DefineStmt *n = makeNode(DefineStmt);
                               6232                 : 
                               6233              20 :                     n->kind = OBJECT_TSPARSER;
 5710 tgl                      6234 CBC          20 :                     n->args = NIL;
 5710 tgl                      6235 GIC          20 :                     n->defnames = $5;
 5710 tgl                      6236 CBC          20 :                     n->definition = $6;
  331 peter                    6237              20 :                     $$ = (Node *) n;
 5710 tgl                      6238 ECB             :                 }
                               6239                 :             | CREATE TEXT_P SEARCH DICTIONARY any_name definition
                               6240                 :                 {
 5710 tgl                      6241 CBC        8557 :                     DefineStmt *n = makeNode(DefineStmt);
  331 peter                    6242 ECB             : 
 5710 tgl                      6243 GIC        8557 :                     n->kind = OBJECT_TSDICTIONARY;
                               6244            8557 :                     n->args = NIL;
                               6245            8557 :                     n->defnames = $5;
                               6246            8557 :                     n->definition = $6;
  331 peter                    6247 CBC        8557 :                     $$ = (Node *) n;
                               6248                 :                 }
 5710 tgl                      6249 ECB             :             | CREATE TEXT_P SEARCH TEMPLATE any_name definition
                               6250                 :                 {
 5710 tgl                      6251 CBC         325 :                     DefineStmt *n = makeNode(DefineStmt);
  331 peter                    6252 ECB             : 
 5710 tgl                      6253 CBC         325 :                     n->kind = OBJECT_TSTEMPLATE;
                               6254             325 :                     n->args = NIL;
                               6255             325 :                     n->defnames = $5;
 5710 tgl                      6256 GIC         325 :                     n->definition = $6;
  331 peter                    6257             325 :                     $$ = (Node *) n;
                               6258                 :                 }
 5710 tgl                      6259 ECB             :             | CREATE TEXT_P SEARCH CONFIGURATION any_name definition
                               6260                 :                 {
 5710 tgl                      6261 CBC        8525 :                     DefineStmt *n = makeNode(DefineStmt);
  331 peter                    6262 ECB             : 
 5710 tgl                      6263 CBC        8525 :                     n->kind = OBJECT_TSCONFIGURATION;
                               6264            8525 :                     n->args = NIL;
                               6265            8525 :                     n->defnames = $5;
                               6266            8525 :                     n->definition = $6;
  331 peter                    6267 GIC        8525 :                     $$ = (Node *) n;
                               6268                 :                 }
                               6269                 :             | CREATE COLLATION any_name definition
 4439 peter_e                  6270 ECB             :                 {
 4439 peter_e                  6271 GIC         132 :                     DefineStmt *n = makeNode(DefineStmt);
  331 peter                    6272 ECB             : 
 4439 peter_e                  6273 CBC         132 :                     n->kind = OBJECT_COLLATION;
                               6274             132 :                     n->args = NIL;
                               6275             132 :                     n->defnames = $3;
                               6276             132 :                     n->definition = $4;
  331 peter                    6277             132 :                     $$ = (Node *) n;
                               6278                 :                 }
                               6279                 :             | CREATE COLLATION IF_P NOT EXISTS any_name definition
                               6280                 :                 {
 2251 peter_e                  6281 GIC          12 :                     DefineStmt *n = makeNode(DefineStmt);
  331 peter                    6282 ECB             : 
 2251 peter_e                  6283 GIC          12 :                     n->kind = OBJECT_COLLATION;
 2251 peter_e                  6284 CBC          12 :                     n->args = NIL;
                               6285              12 :                     n->defnames = $6;
                               6286              12 :                     n->definition = $7;
                               6287              12 :                     n->if_not_exists = true;
  331 peter                    6288              12 :                     $$ = (Node *) n;
 2251 peter_e                  6289 ECB             :                 }
                               6290                 :             | CREATE COLLATION any_name FROM any_name
                               6291                 :                 {
 4439 peter_e                  6292 GIC          38 :                     DefineStmt *n = makeNode(DefineStmt);
  331 peter                    6293 ECB             : 
 4439 peter_e                  6294 GIC          38 :                     n->kind = OBJECT_COLLATION;
                               6295              38 :                     n->args = NIL;
 4439 peter_e                  6296 CBC          38 :                     n->defnames = $3;
 2406                          6297              38 :                     n->definition = list_make1(makeDefElem("from", (Node *) $5, @5));
  331 peter                    6298              38 :                     $$ = (Node *) n;
                               6299                 :                 }
                               6300                 :             | CREATE COLLATION IF_P NOT EXISTS any_name FROM any_name
                               6301                 :                 {
 2251 peter_e                  6302               3 :                     DefineStmt *n = makeNode(DefineStmt);
                               6303                 : 
                               6304               3 :                     n->kind = OBJECT_COLLATION;
                               6305               3 :                     n->args = NIL;
                               6306               3 :                     n->defnames = $6;
 2251 peter_e                  6307 GIC           3 :                     n->definition = list_make1(makeDefElem("from", (Node *) $8, @8));
                               6308               3 :                     n->if_not_exists = true;
  331 peter                    6309               3 :                     $$ = (Node *) n;
 2251 peter_e                  6310 ECB             :                 }
                               6311                 :         ;
 9770 scrappy                  6312                 : 
 7601 bruce                    6313 CBC       19176 : definition: '(' def_list ')'                        { $$ = $2; }
 9344 bruce                    6314 ECB             :         ;
                               6315                 : 
 4177 peter_e                  6316 GIC       19176 : def_list:   def_elem                                { $$ = list_make1($1); }
 7601 bruce                    6317           18203 :             | def_list ',' def_elem                 { $$ = lappend($1, $3); }
 9344 bruce                    6318 ECB             :         ;
                               6319                 : 
 2158 peter_e                  6320                 : def_elem:   ColLabel '=' def_arg
 9344 bruce                    6321                 :                 {
 2406 peter_e                  6322 CBC       37218 :                     $$ = makeDefElem($1, (Node *) $3, @1);
 9344 bruce                    6323 ECB             :                 }
 2158 peter_e                  6324                 :             | ColLabel
                               6325                 :                 {
 2406 peter_e                  6326 GIC         161 :                     $$ = makeDefElem($1, NULL, @1);
                               6327                 :                 }
 9344 bruce                    6328 ECB             :         ;
                               6329                 : 
 7820 tgl                      6330                 : /* Note: any simple identifier will be returned as a type name! */
  331 peter                    6331 CBC       27931 : def_arg:    func_type                       { $$ = (Node *) $1; }
                               6332            9026 :             | reserved_keyword              { $$ = (Node *) makeString(pstrdup($1)); }
                               6333             572 :             | qual_all_Op                   { $$ = (Node *) $1; }
                               6334             593 :             | NumericOnly                   { $$ = (Node *) $1; }
  331 peter                    6335 GIC         888 :             | Sconst                        { $$ = (Node *) makeString($1); }
                               6336              64 :             | NONE                          { $$ = (Node *) makeString(pstrdup($1)); }
                               6337                 :         ;
 9770 scrappy                  6338 ECB             : 
 6203 tgl                      6339 GIC         181 : old_aggr_definition: '(' old_aggr_list ')'          { $$ = $2; }
 6203 tgl                      6340 ECB             :         ;
                               6341                 : 
 6203 tgl                      6342 CBC         181 : old_aggr_list: old_aggr_elem                        { $$ = list_make1($1); }
                               6343             646 :             | old_aggr_list ',' old_aggr_elem       { $$ = lappend($1, $3); }
 6203 tgl                      6344 ECB             :         ;
                               6345                 : 
                               6346                 : /*
                               6347                 :  * Must use IDENT here to avoid reduce/reduce conflicts; fortunately none of
 5215                          6348                 :  * the item names needed in old aggregate definitions are likely to become
                               6349                 :  * SQL keywords.
                               6350                 :  */
 6203                          6351                 : old_aggr_elem:  IDENT '=' def_arg
                               6352                 :                 {
  331 peter                    6353 CBC         827 :                     $$ = makeDefElem($1, (Node *) $3, @1);
 6203 tgl                      6354 ECB             :                 }
                               6355                 :         ;
                               6356                 : 
                               6357                 : opt_enum_val_list:
 4852 bruce                    6358 CBC          87 :         enum_val_list                           { $$ = $1; }
 4852 bruce                    6359 GIC           3 :         | /*EMPTY*/                             { $$ = NIL; }
 4852 bruce                    6360 ECB             :         ;
                               6361                 : 
 5851 tgl                      6362                 : enum_val_list:  Sconst
 5851 tgl                      6363 CBC          87 :                 { $$ = list_make1(makeString($1)); }
 5851 tgl                      6364 ECB             :             | enum_val_list ',' Sconst
 5851 tgl                      6365 GIC        5182 :                 { $$ = lappend($1, makeString($3)); }
                               6366                 :         ;
                               6367                 : 
 4550 tgl                      6368 ECB             : /*****************************************************************************
                               6369                 :  *
                               6370                 :  *  ALTER TYPE enumtype ADD ...
                               6371                 :  *
                               6372                 :  *****************************************************************************/
                               6373                 : 
                               6374                 : AlterEnumStmt:
 3851 andrew                   6375                 :         ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst
                               6376                 :             {
 4177 peter_e                  6377 GIC          71 :                 AlterEnumStmt *n = makeNode(AlterEnumStmt);
                               6378                 : 
 4177 peter_e                  6379 CBC          71 :                 n->typeName = $3;
 2405 tgl                      6380 GIC          71 :                 n->oldVal = NULL;
 3851 andrew                   6381 CBC          71 :                 n->newVal = $7;
 4177 peter_e                  6382              71 :                 n->newValNeighbor = NULL;
                               6383              71 :                 n->newValIsAfter = true;
 2405 tgl                      6384              71 :                 n->skipIfNewValExists = $6;
 4177 peter_e                  6385              71 :                 $$ = (Node *) n;
                               6386                 :             }
                               6387                 :          | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst BEFORE Sconst
                               6388                 :             {
                               6389              97 :                 AlterEnumStmt *n = makeNode(AlterEnumStmt);
                               6390                 : 
                               6391              97 :                 n->typeName = $3;
 2405 tgl                      6392              97 :                 n->oldVal = NULL;
 3851 andrew                   6393              97 :                 n->newVal = $7;
                               6394              97 :                 n->newValNeighbor = $9;
 4177 peter_e                  6395              97 :                 n->newValIsAfter = false;
 2405 tgl                      6396              97 :                 n->skipIfNewValExists = $6;
 4177 peter_e                  6397 GIC          97 :                 $$ = (Node *) n;
                               6398                 :             }
                               6399                 :          | ALTER TYPE_P any_name ADD_P VALUE_P opt_if_not_exists Sconst AFTER Sconst
 4177 peter_e                  6400 ECB             :             {
 4177 peter_e                  6401 GIC          11 :                 AlterEnumStmt *n = makeNode(AlterEnumStmt);
                               6402                 : 
 4177 peter_e                  6403 CBC          11 :                 n->typeName = $3;
 2405 tgl                      6404              11 :                 n->oldVal = NULL;
 3851 andrew                   6405 GIC          11 :                 n->newVal = $7;
                               6406              11 :                 n->newValNeighbor = $9;
 4177 peter_e                  6407              11 :                 n->newValIsAfter = true;
 2405 tgl                      6408              11 :                 n->skipIfNewValExists = $6;
 2405 tgl                      6409 CBC          11 :                 $$ = (Node *) n;
                               6410                 :             }
                               6411                 :          | ALTER TYPE_P any_name RENAME VALUE_P Sconst TO Sconst
                               6412                 :             {
                               6413              12 :                 AlterEnumStmt *n = makeNode(AlterEnumStmt);
                               6414                 : 
 2405 tgl                      6415 GIC          12 :                 n->typeName = $3;
                               6416              12 :                 n->oldVal = $6;
                               6417              12 :                 n->newVal = $8;
 2405 tgl                      6418 CBC          12 :                 n->newValNeighbor = NULL;
                               6419              12 :                 n->newValIsAfter = false;
                               6420              12 :                 n->skipIfNewValExists = false;
 4177 peter_e                  6421              12 :                 $$ = (Node *) n;
 4177 peter_e                  6422 ECB             :             }
 4550 tgl                      6423                 :          ;
                               6424                 : 
 3851 andrew                   6425 GIC           6 : opt_if_not_exists: IF_P NOT EXISTS              { $$ = true; }
  874 peter                    6426 CBC         173 :         | /* EMPTY */                          { $$ = false; }
                               6427                 :         ;
                               6428                 : 
 9770 scrappy                  6429 ECB             : 
 7559 tgl                      6430                 : /*****************************************************************************
                               6431                 :  *
                               6432                 :  *      QUERIES :
                               6433                 :  *              CREATE OPERATOR CLASS ...
                               6434                 :  *              CREATE OPERATOR FAMILY ...
                               6435                 :  *              ALTER OPERATOR FAMILY ...
                               6436                 :  *              DROP OPERATOR CLASS ...
                               6437                 :  *              DROP OPERATOR FAMILY ...
                               6438                 :  *
                               6439                 :  *****************************************************************************/
                               6440                 : 
                               6441                 : CreateOpClassStmt:
                               6442                 :             CREATE OPERATOR CLASS any_name opt_default FOR TYPE_P Typename
                               6443                 :             USING name opt_opfamily AS opclass_item_list
                               6444                 :                 {
 7559 tgl                      6445 CBC         183 :                     CreateOpClassStmt *n = makeNode(CreateOpClassStmt);
  331 peter                    6446 ECB             : 
 7559 tgl                      6447 GIC         183 :                     n->opclassname = $4;
                               6448             183 :                     n->isDefault = $5;
                               6449             183 :                     n->datatype = $8;
 7559 tgl                      6450 CBC         183 :                     n->amname = $10;
 5920 tgl                      6451 GIC         183 :                     n->opfamilyname = $11;
 5920 tgl                      6452 CBC         183 :                     n->items = $13;
 7559 tgl                      6453 GIC         183 :                     $$ = (Node *) n;
                               6454                 :                 }
                               6455                 :         ;
                               6456                 : 
                               6457                 : opclass_item_list:
 6888 neilc                    6458             376 :             opclass_item                            { $$ = list_make1($1); }
 7559 tgl                      6459            1484 :             | opclass_item_list ',' opclass_item    { $$ = lappend($1, $3); }
                               6460                 :         ;
                               6461                 : 
                               6462                 : opclass_item:
                               6463                 :             OPERATOR Iconst any_operator opclass_purpose opt_recheck
 7559 tgl                      6464 ECB             :                 {
 7559 tgl                      6465 GIC         529 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
 2293 peter_e                  6466 CBC         529 :                     ObjectWithArgs *owa = makeNode(ObjectWithArgs);
  331 peter                    6467 ECB             : 
 2293 peter_e                  6468 CBC         529 :                     owa->objname = $3;
                               6469             529 :                     owa->objargs = NIL;
 7559 tgl                      6470             529 :                     n->itemtype = OPCLASS_ITEM_OPERATOR;
 2293 peter_e                  6471             529 :                     n->name = owa;
 7559 tgl                      6472             529 :                     n->number = $2;
 4519 tgl                      6473 GIC         529 :                     n->order_family = $4;
 7559                          6474             529 :                     $$ = (Node *) n;
                               6475                 :                 }
 2293 peter_e                  6476 ECB             :             | OPERATOR Iconst operator_with_argtypes opclass_purpose
                               6477                 :               opt_recheck
 7559 tgl                      6478                 :                 {
 7559 tgl                      6479 CBC         493 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
  331 peter                    6480 ECB             : 
 7559 tgl                      6481 CBC         493 :                     n->itemtype = OPCLASS_ITEM_OPERATOR;
 2293 peter_e                  6482             493 :                     n->name = $3;
 7559 tgl                      6483             493 :                     n->number = $2;
 2293 peter_e                  6484             493 :                     n->order_family = $4;
 7559 tgl                      6485 GIC         493 :                     $$ = (Node *) n;
                               6486                 :                 }
                               6487                 :             | FUNCTION Iconst function_with_argtypes
 7559 tgl                      6488 ECB             :                 {
 7559 tgl                      6489 GIC         671 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
  331 peter                    6490 ECB             : 
 7559 tgl                      6491 CBC         671 :                     n->itemtype = OPCLASS_ITEM_FUNCTION;
 2293 peter_e                  6492             671 :                     n->name = $3;
 7559 tgl                      6493             671 :                     n->number = $2;
                               6494             671 :                     $$ = (Node *) n;
 7559 tgl                      6495 ECB             :                 }
 2397 peter_e                  6496                 :             | FUNCTION Iconst '(' type_list ')' function_with_argtypes
                               6497                 :                 {
 5920 tgl                      6498 GIC          68 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
                               6499                 : 
 5920 tgl                      6500 CBC          68 :                     n->itemtype = OPCLASS_ITEM_FUNCTION;
 2293 peter_e                  6501 GIC          68 :                     n->name = $6;
 5920 tgl                      6502 CBC          68 :                     n->number = $2;
                               6503              68 :                     n->class_args = $4;
                               6504              68 :                     $$ = (Node *) n;
 5920 tgl                      6505 ECB             :                 }
 7559                          6506                 :             | STORAGE Typename
                               6507                 :                 {
 7559 tgl                      6508 CBC          99 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
                               6509                 : 
 7559 tgl                      6510 GIC          99 :                     n->itemtype = OPCLASS_ITEM_STORAGETYPE;
                               6511              99 :                     n->storedtype = $2;
 7559 tgl                      6512 CBC          99 :                     $$ = (Node *) n;
 7559 tgl                      6513 ECB             :                 }
                               6514                 :         ;
                               6515                 : 
 2062 peter_e                  6516 GIC         141 : opt_default:    DEFAULT                     { $$ = true; }
                               6517              74 :             | /*EMPTY*/                     { $$ = false; }
                               6518                 :         ;
                               6519                 : 
 5920 tgl                      6520              22 : opt_opfamily:   FAMILY any_name             { $$ = $2; }
                               6521             161 :             | /*EMPTY*/                     { $$ = NIL; }
                               6522                 :         ;
                               6523                 : 
 4519 tgl                      6524 UIC           0 : opclass_purpose: FOR SEARCH                 { $$ = NIL; }
 4519 tgl                      6525 GIC          36 :             | FOR ORDER BY any_name         { $$ = $4; }
                               6526             986 :             | /*EMPTY*/                     { $$ = NIL; }
                               6527                 :         ;
                               6528                 : 
                               6529                 : opt_recheck:    RECHECK
                               6530                 :                 {
                               6531                 :                     /*
 5065 tgl                      6532 ECB             :                      * RECHECK no longer does anything in opclass definitions,
                               6533                 :                      * but we still accept it to ease porting of old database
                               6534                 :                      * dumps.
                               6535                 :                      */
 5065 tgl                      6536 LBC           0 :                     ereport(NOTICE,
 5473 tgl                      6537 ECB             :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 5065                          6538                 :                              errmsg("RECHECK is no longer required"),
 5333                          6539                 :                              errhint("Update your data type."),
 5018                          6540                 :                              parser_errposition(@1)));
 2062 peter_e                  6541 UIC           0 :                     $$ = true;
                               6542                 :                 }
 2062 peter_e                  6543 GIC        1022 :             | /*EMPTY*/                     { $$ = false; }
                               6544                 :         ;
 5920 tgl                      6545 ECB             : 
                               6546                 : 
                               6547                 : CreateOpFamilyStmt:
                               6548                 :             CREATE OPERATOR FAMILY any_name USING name
                               6549                 :                 {
 5920 tgl                      6550 GIC          74 :                     CreateOpFamilyStmt *n = makeNode(CreateOpFamilyStmt);
                               6551                 : 
 5920 tgl                      6552 CBC          74 :                     n->opfamilyname = $4;
                               6553              74 :                     n->amname = $6;
 5920 tgl                      6554 GIC          74 :                     $$ = (Node *) n;
 5920 tgl                      6555 ECB             :                 }
                               6556                 :         ;
                               6557                 : 
                               6558                 : AlterOpFamilyStmt:
 1033 peter                    6559                 :             ALTER OPERATOR FAMILY any_name USING name ADD_P opclass_item_list
 5920 tgl                      6560                 :                 {
 5920 tgl                      6561 CBC         193 :                     AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
                               6562                 : 
 5920 tgl                      6563 GIC         193 :                     n->opfamilyname = $4;
                               6564             193 :                     n->amname = $6;
                               6565             193 :                     n->isDrop = false;
 5920 tgl                      6566 CBC         193 :                     n->items = $8;
 5920 tgl                      6567 GIC         193 :                     $$ = (Node *) n;
 5920 tgl                      6568 ECB             :                 }
 1033 peter                    6569                 :             | ALTER OPERATOR FAMILY any_name USING name DROP opclass_drop_list
 5920 tgl                      6570                 :                 {
 5920 tgl                      6571 CBC          30 :                     AlterOpFamilyStmt *n = makeNode(AlterOpFamilyStmt);
  331 peter                    6572 ECB             : 
 5920 tgl                      6573 GIC          30 :                     n->opfamilyname = $4;
                               6574              30 :                     n->amname = $6;
                               6575              30 :                     n->isDrop = true;
 5920 tgl                      6576 CBC          30 :                     n->items = $8;
 5920 tgl                      6577 GIC          30 :                     $$ = (Node *) n;
 5920 tgl                      6578 ECB             :                 }
                               6579                 :         ;
                               6580                 : 
                               6581                 : opclass_drop_list:
 5920 tgl                      6582 GIC          30 :             opclass_drop                            { $$ = list_make1($1); }
                               6583              15 :             | opclass_drop_list ',' opclass_drop    { $$ = lappend($1, $3); }
                               6584                 :         ;
 7559 tgl                      6585 ECB             : 
                               6586                 : opclass_drop:
 5920                          6587                 :             OPERATOR Iconst '(' type_list ')'
                               6588                 :                 {
 5920 tgl                      6589 CBC          28 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
  331 peter                    6590 ECB             : 
 5920 tgl                      6591 CBC          28 :                     n->itemtype = OPCLASS_ITEM_OPERATOR;
 5920 tgl                      6592 GIC          28 :                     n->number = $2;
 2293 peter_e                  6593              28 :                     n->class_args = $4;
 5920 tgl                      6594              28 :                     $$ = (Node *) n;
 5920 tgl                      6595 ECB             :                 }
                               6596                 :             | FUNCTION Iconst '(' type_list ')'
                               6597                 :                 {
 5920 tgl                      6598 CBC          17 :                     CreateOpClassItem *n = makeNode(CreateOpClassItem);
  331 peter                    6599 ECB             : 
 5920 tgl                      6600 GIC          17 :                     n->itemtype = OPCLASS_ITEM_FUNCTION;
                               6601              17 :                     n->number = $2;
 2293 peter_e                  6602              17 :                     n->class_args = $4;
 5920 tgl                      6603 CBC          17 :                     $$ = (Node *) n;
 5920 tgl                      6604 ECB             :                 }
                               6605                 :         ;
                               6606                 : 
 7559                          6607                 : 
                               6608                 : DropOpClassStmt:
                               6609                 :             DROP OPERATOR CLASS any_name USING name opt_drop_behavior
                               6610                 :                 {
 4161 rhaas                    6611 GBC          19 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6612 ECB             : 
 2946 alvherre                 6613 CBC          19 :                     n->objects = list_make1(lcons(makeString($6), $4));
 4161 rhaas                    6614 GIC          19 :                     n->removeType = OBJECT_OPCLASS;
 7559 tgl                      6615              19 :                     n->behavior = $7;
 6141 andrew                   6616              19 :                     n->missing_ok = false;
 4020 simon                    6617              19 :                     n->concurrent = false;
 6141 andrew                   6618              19 :                     $$ = (Node *) n;
                               6619                 :                 }
                               6620                 :             | DROP OPERATOR CLASS IF_P EXISTS any_name USING name opt_drop_behavior
                               6621                 :                 {
 4161 rhaas                    6622               9 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6623 EUB             : 
 2946 alvherre                 6624 GIC           9 :                     n->objects = list_make1(lcons(makeString($8), $6));
 4161 rhaas                    6625               9 :                     n->removeType = OBJECT_OPCLASS;
 6141 andrew                   6626               9 :                     n->behavior = $9;
                               6627               9 :                     n->missing_ok = true;
 4020 simon                    6628 GBC           9 :                     n->concurrent = false;
 7559 tgl                      6629 GIC           9 :                     $$ = (Node *) n;
 7559 tgl                      6630 ECB             :                 }
                               6631                 :         ;
                               6632                 : 
                               6633                 : DropOpFamilyStmt:
                               6634                 :             DROP OPERATOR FAMILY any_name USING name opt_drop_behavior
                               6635                 :                 {
 4161 rhaas                    6636 GIC          55 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6637 ECB             : 
 2946 alvherre                 6638 GIC          55 :                     n->objects = list_make1(lcons(makeString($6), $4));
 4161 rhaas                    6639 CBC          55 :                     n->removeType = OBJECT_OPFAMILY;
 5920 tgl                      6640              55 :                     n->behavior = $7;
                               6641              55 :                     n->missing_ok = false;
 4020 simon                    6642 GIC          55 :                     n->concurrent = false;
 5920 tgl                      6643              55 :                     $$ = (Node *) n;
                               6644                 :                 }
                               6645                 :             | DROP OPERATOR FAMILY IF_P EXISTS any_name USING name opt_drop_behavior
                               6646                 :                 {
 4161 rhaas                    6647               9 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6648 ECB             : 
 2946 alvherre                 6649 GIC           9 :                     n->objects = list_make1(lcons(makeString($8), $6));
 4161 rhaas                    6650 CBC           9 :                     n->removeType = OBJECT_OPFAMILY;
 5920 tgl                      6651               9 :                     n->behavior = $9;
                               6652               9 :                     n->missing_ok = true;
 4020 simon                    6653               9 :                     n->concurrent = false;
 5920 tgl                      6654               9 :                     $$ = (Node *) n;
                               6655                 :                 }
                               6656                 :         ;
                               6657                 : 
 5920 tgl                      6658 ECB             : 
                               6659                 : /*****************************************************************************
 6348 alvherre                 6660                 :  *
                               6661                 :  *      QUERY:
                               6662                 :  *
                               6663                 :  *      DROP OWNED BY username [, username ...] [ RESTRICT | CASCADE ]
                               6664                 :  *      REASSIGN OWNED BY username [, username ...] TO username
                               6665                 :  *
                               6666                 :  *****************************************************************************/
                               6667                 : DropOwnedStmt:
                               6668                 :             DROP OWNED BY role_list opt_drop_behavior
 4177 peter_e                  6669                 :                 {
 6348 alvherre                 6670 CBC          69 :                     DropOwnedStmt *n = makeNode(DropOwnedStmt);
                               6671                 : 
 6348 alvherre                 6672 GIC          69 :                     n->roles = $4;
                               6673              69 :                     n->behavior = $5;
  331 peter                    6674              69 :                     $$ = (Node *) n;
                               6675                 :                 }
 6348 alvherre                 6676 ECB             :         ;
                               6677                 : 
                               6678                 : ReassignOwnedStmt:
 2953                          6679                 :             REASSIGN OWNED BY role_list TO RoleSpec
 6348                          6680                 :                 {
 6348 alvherre                 6681 CBC          19 :                     ReassignOwnedStmt *n = makeNode(ReassignOwnedStmt);
                               6682                 : 
 6348 alvherre                 6683 GIC          19 :                     n->roles = $4;
                               6684              19 :                     n->newrole = $6;
  331 peter                    6685 CBC          19 :                     $$ = (Node *) n;
                               6686                 :                 }
 6348 alvherre                 6687 ECB             :         ;
 7559 tgl                      6688                 : 
 9770 scrappy                  6689                 : /*****************************************************************************
                               6690                 :  *
                               6691                 :  *      QUERY:
                               6692                 :  *
                               6693                 :  *      DROP itemtype [ IF EXISTS ] itemname [, itemname ...]
                               6694                 :  *           [ RESTRICT | CASCADE ]
                               6695                 :  *
                               6696                 :  *****************************************************************************/
                               6697                 : 
 1030 peter                    6698                 : DropStmt:   DROP object_type_any_name IF_P EXISTS any_name_list opt_drop_behavior
                               6699                 :                 {
 8208 bruce                    6700 CBC         609 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6701 ECB             : 
 8204 tgl                      6702 CBC         609 :                     n->removeType = $2;
 2062 peter_e                  6703             609 :                     n->missing_ok = true;
 6350 andrew                   6704             609 :                     n->objects = $5;
                               6705             609 :                     n->behavior = $6;
 4020 simon                    6706 GIC         609 :                     n->concurrent = false;
  331 peter                    6707             609 :                     $$ = (Node *) n;
                               6708                 :                 }
 1030 peter                    6709 ECB             :             | DROP object_type_any_name any_name_list opt_drop_behavior
                               6710                 :                 {
 2339 peter_e                  6711 CBC        6997 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6712 ECB             : 
 2339 peter_e                  6713 CBC        6997 :                     n->removeType = $2;
 2062                          6714            6997 :                     n->missing_ok = false;
 2339                          6715            6997 :                     n->objects = $3;
                               6716            6997 :                     n->behavior = $4;
 2339 peter_e                  6717 GIC        6997 :                     n->concurrent = false;
  331 peter                    6718            6997 :                     $$ = (Node *) n;
                               6719                 :                 }
                               6720                 :             | DROP drop_type_name IF_P EXISTS name_list opt_drop_behavior
                               6721                 :                 {
 2339 peter_e                  6722              39 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6723 ECB             : 
 2339 peter_e                  6724 GIC          39 :                     n->removeType = $2;
 2062 peter_e                  6725 CBC          39 :                     n->missing_ok = true;
 2339                          6726              39 :                     n->objects = $5;
                               6727              39 :                     n->behavior = $6;
                               6728              39 :                     n->concurrent = false;
  331 peter                    6729              39 :                     $$ = (Node *) n;
 2339 peter_e                  6730 ECB             :                 }
                               6731                 :             | DROP drop_type_name name_list opt_drop_behavior
                               6732                 :                 {
 6350 andrew                   6733 GIC         574 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6734 ECB             : 
 6350 andrew                   6735 GIC         574 :                     n->removeType = $2;
 2062 peter_e                  6736 CBC         574 :                     n->missing_ok = false;
 7689 tgl                      6737             574 :                     n->objects = $3;
 7691 bruce                    6738             574 :                     n->behavior = $4;
 4020 simon                    6739             574 :                     n->concurrent = false;
  331 peter                    6740             574 :                     $$ = (Node *) n;
 4020 simon                    6741 ECB             :                 }
                               6742                 :             | DROP object_type_name_on_any_name name ON any_name opt_drop_behavior
                               6743                 :                 {
 2238 peter_e                  6744 GIC         521 :                     DropStmt *n = makeNode(DropStmt);
                               6745                 : 
                               6746             521 :                     n->removeType = $2;
                               6747             521 :                     n->objects = list_make1(lappend($5, makeString($3)));
                               6748             521 :                     n->behavior = $6;
                               6749             521 :                     n->missing_ok = false;
                               6750             521 :                     n->concurrent = false;
                               6751             521 :                     $$ = (Node *) n;
                               6752                 :                 }
                               6753                 :             | DROP object_type_name_on_any_name IF_P EXISTS name ON any_name opt_drop_behavior
                               6754                 :                 {
                               6755              24 :                     DropStmt *n = makeNode(DropStmt);
                               6756                 : 
 2238 peter_e                  6757 CBC          24 :                     n->removeType = $2;
 2238 peter_e                  6758 GIC          24 :                     n->objects = list_make1(lappend($7, makeString($5)));
 2238 peter_e                  6759 CBC          24 :                     n->behavior = $8;
                               6760              24 :                     n->missing_ok = true;
                               6761              24 :                     n->concurrent = false;
 2238 peter_e                  6762 GIC          24 :                     $$ = (Node *) n;
                               6763                 :                 }
                               6764                 :             | DROP TYPE_P type_name_list opt_drop_behavior
                               6765                 :                 {
 3022 alvherre                 6766             253 :                     DropStmt *n = makeNode(DropStmt);
                               6767                 : 
 3022 alvherre                 6768 CBC         253 :                     n->removeType = OBJECT_TYPE;
 2062 peter_e                  6769 GIC         253 :                     n->missing_ok = false;
 3022 alvherre                 6770 CBC         253 :                     n->objects = $3;
                               6771             253 :                     n->behavior = $4;
                               6772             253 :                     n->concurrent = false;
 3022 alvherre                 6773 GIC         253 :                     $$ = (Node *) n;
                               6774                 :                 }
                               6775                 :             | DROP TYPE_P IF_P EXISTS type_name_list opt_drop_behavior
                               6776                 :                 {
                               6777              11 :                     DropStmt *n = makeNode(DropStmt);
                               6778                 : 
                               6779              11 :                     n->removeType = OBJECT_TYPE;
 2062 peter_e                  6780              11 :                     n->missing_ok = true;
 3022 alvherre                 6781              11 :                     n->objects = $5;
                               6782              11 :                     n->behavior = $6;
                               6783              11 :                     n->concurrent = false;
                               6784              11 :                     $$ = (Node *) n;
                               6785                 :                 }
                               6786                 :             | DROP DOMAIN_P type_name_list opt_drop_behavior
 3022 alvherre                 6787 ECB             :                 {
 3022 alvherre                 6788 GIC         178 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6789 ECB             : 
 3022 alvherre                 6790 CBC         178 :                     n->removeType = OBJECT_DOMAIN;
 2062 peter_e                  6791             178 :                     n->missing_ok = false;
 3022 alvherre                 6792             178 :                     n->objects = $3;
                               6793             178 :                     n->behavior = $4;
                               6794             178 :                     n->concurrent = false;
 3022 alvherre                 6795 GIC         178 :                     $$ = (Node *) n;
                               6796                 :                 }
                               6797                 :             | DROP DOMAIN_P IF_P EXISTS type_name_list opt_drop_behavior
 3022 alvherre                 6798 ECB             :                 {
 3022 alvherre                 6799 GIC           9 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6800 ECB             : 
 3022 alvherre                 6801 CBC           9 :                     n->removeType = OBJECT_DOMAIN;
 2062 peter_e                  6802               9 :                     n->missing_ok = true;
 3022 alvherre                 6803               9 :                     n->objects = $5;
                               6804               9 :                     n->behavior = $6;
                               6805               9 :                     n->concurrent = false;
 3022 alvherre                 6806 GIC           9 :                     $$ = (Node *) n;
                               6807                 :                 }
                               6808                 :             | DROP INDEX CONCURRENTLY any_name_list opt_drop_behavior
 4020 simon                    6809 ECB             :                 {
 4020 simon                    6810 GIC          67 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6811 ECB             : 
 4020 simon                    6812 CBC          67 :                     n->removeType = OBJECT_INDEX;
 2062 peter_e                  6813              67 :                     n->missing_ok = false;
 4020 simon                    6814              67 :                     n->objects = $4;
                               6815              67 :                     n->behavior = $5;
                               6816              67 :                     n->concurrent = true;
  331 peter                    6817 GIC          67 :                     $$ = (Node *) n;
                               6818                 :                 }
                               6819                 :             | DROP INDEX CONCURRENTLY IF_P EXISTS any_name_list opt_drop_behavior
 4020 simon                    6820 ECB             :                 {
 4020 simon                    6821 GIC           6 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    6822 ECB             : 
 4020 simon                    6823 CBC           6 :                     n->removeType = OBJECT_INDEX;
 2062 peter_e                  6824               6 :                     n->missing_ok = true;
 4020 simon                    6825               6 :                     n->objects = $6;
                               6826               6 :                     n->behavior = $7;
                               6827               6 :                     n->concurrent = true;
  331 peter                    6828 GIC           6 :                     $$ = (Node *) n;
                               6829                 :                 }
                               6830                 :         ;
 9770 scrappy                  6831 ECB             : 
                               6832                 : /* object types taking any_name/any_name_list */
 1030 peter                    6833                 : object_type_any_name:
 2339 peter_e                  6834 CBC        6541 :             TABLE                                   { $$ = OBJECT_TABLE; }
 7226                          6835              97 :             | SEQUENCE                              { $$ = OBJECT_SEQUENCE; }
                               6836             427 :             | VIEW                                  { $$ = OBJECT_VIEW; }
 3689 kgrittn                  6837              59 :             | MATERIALIZED VIEW                     { $$ = OBJECT_MATVIEW; }
 7226 peter_e                  6838             341 :             | INDEX                                 { $$ = OBJECT_INDEX; }
 4481 rhaas                    6839 GIC          85 :             | FOREIGN TABLE                         { $$ = OBJECT_FOREIGN_TABLE; }
 4439 peter_e                  6840              60 :             | COLLATION                             { $$ = OBJECT_COLLATION; }
 7226                          6841              28 :             | CONVERSION_P                          { $$ = OBJECT_CONVERSION; }
 2207 alvherre                 6842 CBC          96 :             | STATISTICS                            { $$ = OBJECT_STATISTIC_EXT; }
 5710 tgl                      6843 GIC          10 :             | TEXT_P SEARCH PARSER                  { $$ = OBJECT_TSPARSER; }
 5710 tgl                      6844 CBC        8499 :             | TEXT_P SEARCH DICTIONARY              { $$ = OBJECT_TSDICTIONARY; }
                               6845             313 :             | TEXT_P SEARCH TEMPLATE                { $$ = OBJECT_TSTEMPLATE; }
                               6846            8498 :             | TEXT_P SEARCH CONFIGURATION           { $$ = OBJECT_TSCONFIGURATION; }
 2339 peter_e                  6847 ECB             :         ;
                               6848                 : 
 1030 peter                    6849                 : /*
                               6850                 :  * object types taking name/name_list
                               6851                 :  *
                               6852                 :  * DROP handles some of them separately
                               6853                 :  */
                               6854                 : 
                               6855                 : object_type_name:
 1030 peter                    6856 CBC         353 :             drop_type_name                          { $$ = $1; }
                               6857             609 :             | DATABASE                              { $$ = OBJECT_DATABASE; }
                               6858              26 :             | ROLE                                  { $$ = OBJECT_ROLE; }
                               6859               5 :             | SUBSCRIPTION                          { $$ = OBJECT_SUBSCRIPTION; }
 1030 peter                    6860 LBC           0 :             | TABLESPACE                            { $$ = OBJECT_TABLESPACE; }
                               6861                 :         ;
                               6862                 : 
                               6863                 : drop_type_name:
 2339 peter_e                  6864 CBC          23 :             ACCESS METHOD                           { $$ = OBJECT_ACCESS_METHOD; }
 2339 peter_e                  6865 GIC          50 :             | EVENT TRIGGER                         { $$ = OBJECT_EVENT_TRIGGER; }
 2339 peter_e                  6866 CBC          50 :             | EXTENSION                             { $$ = OBJECT_EXTENSION; }
 2238                          6867              74 :             | FOREIGN DATA_P WRAPPER                { $$ = OBJECT_FDW; }
 1032 peter                    6868             332 :             | opt_procedural LANGUAGE               { $$ = OBJECT_LANGUAGE; }
 2271 peter_e                  6869             134 :             | PUBLICATION                           { $$ = OBJECT_PUBLICATION; }
 2339                          6870             238 :             | SCHEMA                                { $$ = OBJECT_SCHEMA; }
 2238                          6871              65 :             | SERVER                                { $$ = OBJECT_FOREIGN_SERVER; }
                               6872                 :         ;
                               6873                 : 
                               6874                 : /* object types attached to a table */
 1030 peter                    6875 ECB             : object_type_name_on_any_name:
 2238 peter_e                  6876 GIC          76 :             POLICY                                  { $$ = OBJECT_POLICY; }
 2238 peter_e                  6877 CBC         122 :             | RULE                                  { $$ = OBJECT_RULE; }
                               6878             373 :             | TRIGGER                               { $$ = OBJECT_TRIGGER; }
 8204 tgl                      6879 ECB             :         ;
                               6880                 : 
 7601 bruce                    6881                 : any_name_list:
 6888 neilc                    6882 CBC       33271 :             any_name                                { $$ = list_make1($1); }
 7601 bruce                    6883 GIC        1782 :             | any_name_list ',' any_name            { $$ = lappend($1, $3); }
                               6884                 :         ;
                               6885                 : 
 6888 neilc                    6886 CBC      102341 : any_name:   ColId                       { $$ = list_make1(makeString($1)); }
 6878 tgl                      6887 GIC        3829 :             | ColId attrs               { $$ = lcons(makeString($1), $2); }
 7681 tgl                      6888 ECB             :         ;
                               6889                 : 
 6878                          6890                 : attrs:      '.' attr_name
 6878 tgl                      6891 CBC       35320 :                     { $$ = list_make1(makeString($2)); }
 6726 tgl                      6892 ECB             :             | attrs '.' attr_name
 6726 tgl                      6893 CBC          24 :                     { $$ = lappend($1, makeString($3)); }
                               6894                 :         ;
                               6895                 : 
                               6896                 : type_name_list:
 2339 peter_e                  6897             451 :             Typename                                { $$ = list_make1($1); }
 2339 peter_e                  6898 GIC          24 :             | type_name_list ',' Typename           { $$ = lappend($1, $3); }
 1505 tgl                      6899 ECB             :         ;
 6878                          6900                 : 
 8599 bruce                    6901                 : /*****************************************************************************
                               6902                 :  *
                               6903                 :  *      QUERY:
 6646 tgl                      6904                 :  *              truncate table relname1, relname2, ...
                               6905                 :  *
                               6906                 :  *****************************************************************************/
                               6907                 : 
 7601 bruce                    6908                 : TruncateStmt:
                               6909                 :             TRUNCATE opt_table relation_expr_list opt_restart_seqs opt_drop_behavior
 8599                          6910                 :                 {
 8599 bruce                    6911 CBC         644 :                     TruncateStmt *n = makeNode(TruncateStmt);
  331 peter                    6912 ECB             : 
 6646 tgl                      6913 CBC         644 :                     n->relations = $3;
 5441                          6914             644 :                     n->restart_seqs = $4;
                               6915             644 :                     n->behavior = $5;
  331 peter                    6916 GIC         644 :                     $$ = (Node *) n;
                               6917                 :                 }
                               6918                 :         ;
                               6919                 : 
                               6920                 : opt_restart_seqs:
 5441 tgl                      6921 CBC          12 :             CONTINUE_P IDENTITY_P       { $$ = false; }
                               6922              12 :             | RESTART IDENTITY_P        { $$ = true; }
                               6923             620 :             | /* EMPTY */               { $$ = false; }
 5441 tgl                      6924 ECB             :         ;
                               6925                 : 
 8577 bruce                    6926                 : /*****************************************************************************
                               6927                 :  *
 1030 peter                    6928                 :  * COMMENT ON <object> IS <text>
 8577 bruce                    6929                 :  *
                               6930                 :  *****************************************************************************/
 7601                          6931                 : 
                               6932                 : CommentStmt:
 1030 peter                    6933                 :             COMMENT ON object_type_any_name any_name IS comment_text
                               6934                 :                 {
 7601 bruce                    6935 GIC       17391 :                     CommentStmt *n = makeNode(CommentStmt);
                               6936                 : 
                               6937           17391 :                     n->objtype = $3;
 2339 peter_e                  6938           17391 :                     n->object = (Node *) $4;
                               6939           17391 :                     n->comment = $6;
                               6940           17391 :                     $$ = (Node *) n;
                               6941                 :                 }
                               6942                 :             | COMMENT ON COLUMN any_name IS comment_text
 1030 peter                    6943 ECB             :                 {
 1030 peter                    6944 CBC          54 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    6945 ECB             : 
 1030 peter                    6946 CBC          54 :                     n->objtype = OBJECT_COLUMN;
 1030 peter                    6947 GBC          54 :                     n->object = (Node *) $4;
 1030 peter                    6948 GIC          54 :                     n->comment = $6;
                               6949              54 :                     $$ = (Node *) n;
                               6950                 :                 }
 1030 peter                    6951 ECB             :             | COMMENT ON object_type_name name IS comment_text
 2339 peter_e                  6952                 :                 {
 2339 peter_e                  6953 CBC         962 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    6954 ECB             : 
 2339 peter_e                  6955 CBC         962 :                     n->objtype = $3;
                               6956             962 :                     n->object = (Node *) makeString($4);
 7601 bruce                    6957             962 :                     n->comment = $6;
                               6958             962 :                     $$ = (Node *) n;
                               6959                 :                 }
                               6960                 :             | COMMENT ON TYPE_P Typename IS comment_text
                               6961                 :                 {
 3022 alvherre                 6962 GIC          27 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    6963 ECB             : 
 3022 alvherre                 6964 CBC          27 :                     n->objtype = OBJECT_TYPE;
 2339 peter_e                  6965              27 :                     n->object = (Node *) $4;
 3022 alvherre                 6966 GIC          27 :                     n->comment = $6;
                               6967              27 :                     $$ = (Node *) n;
                               6968                 :                 }
 3022 alvherre                 6969 ECB             :             | COMMENT ON DOMAIN_P Typename IS comment_text
                               6970                 :                 {
 3022 alvherre                 6971 GIC           4 :                     CommentStmt *n = makeNode(CommentStmt);
                               6972                 : 
 3022 alvherre                 6973 CBC           4 :                     n->objtype = OBJECT_DOMAIN;
 2339 peter_e                  6974               4 :                     n->object = (Node *) $4;
 3022 alvherre                 6975 GIC           4 :                     n->comment = $6;
                               6976               4 :                     $$ = (Node *) n;
                               6977                 :                 }
 2397 peter_e                  6978 ECB             :             | COMMENT ON AGGREGATE aggregate_with_argtypes IS comment_text
                               6979                 :                 {
 7601 bruce                    6980 CBC          20 :                     CommentStmt *n = makeNode(CommentStmt);
                               6981                 : 
 7226 peter_e                  6982 GIC          20 :                     n->objtype = OBJECT_AGGREGATE;
 2339                          6983              20 :                     n->object = (Node *) $4;
 2397 peter_e                  6984 CBC          20 :                     n->comment = $6;
 7601 bruce                    6985              20 :                     $$ = (Node *) n;
                               6986                 :                 }
                               6987                 :             | COMMENT ON FUNCTION function_with_argtypes IS comment_text
                               6988                 :                 {
 7601 bruce                    6989 GIC          71 :                     CommentStmt *n = makeNode(CommentStmt);
                               6990                 : 
 7226 peter_e                  6991              71 :                     n->objtype = OBJECT_FUNCTION;
 2339                          6992              71 :                     n->object = (Node *) $4;
 2397                          6993              71 :                     n->comment = $6;
 7601 bruce                    6994              71 :                     $$ = (Node *) n;
                               6995                 :                 }
                               6996                 :             | COMMENT ON OPERATOR operator_with_argtypes IS comment_text
                               6997                 :                 {
 7601 bruce                    6998 CBC           9 :                     CommentStmt *n = makeNode(CommentStmt);
                               6999                 : 
 7226 peter_e                  7000               9 :                     n->objtype = OBJECT_OPERATOR;
 2339                          7001               9 :                     n->object = (Node *) $4;
 2293                          7002               9 :                     n->comment = $6;
 7601 bruce                    7003               9 :                     $$ = (Node *) n;
                               7004                 :                 }
                               7005                 :             | COMMENT ON CONSTRAINT name ON any_name IS comment_text
                               7006                 :                 {
 7601 bruce                    7007 GIC          52 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    7008 ECB             : 
 3029 alvherre                 7009 CBC          52 :                     n->objtype = OBJECT_TABCONSTRAINT;
 2339 peter_e                  7010              52 :                     n->object = (Node *) lappend($6, makeString($4));
 7601 bruce                    7011 GIC          52 :                     n->comment = $8;
                               7012              52 :                     $$ = (Node *) n;
                               7013                 :                 }
                               7014                 :             | COMMENT ON CONSTRAINT name ON DOMAIN_P any_name IS comment_text
                               7015                 :                 {
 3029 alvherre                 7016              19 :                     CommentStmt *n = makeNode(CommentStmt);
                               7017                 : 
                               7018              19 :                     n->objtype = OBJECT_DOMCONSTRAINT;
                               7019                 :                     /*
                               7020                 :                      * should use Typename not any_name in the production, but
                               7021                 :                      * there's a shift/reduce conflict if we do that, so fix it
 3022 alvherre                 7022 ECB             :                      * up here.
                               7023                 :                      */
 2339 peter_e                  7024 CBC          19 :                     n->object = (Node *) list_make2(makeTypeNameFromNameList($7), makeString($4));
 3029 alvherre                 7025              19 :                     n->comment = $9;
                               7026              19 :                     $$ = (Node *) n;
 3029 alvherre                 7027 ECB             :                 }
                               7028                 :             | COMMENT ON object_type_name_on_any_name name ON any_name IS comment_text
                               7029                 :                 {
 3055 sfrost                   7030 GIC          20 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    7031 ECB             : 
 1030 peter                    7032 GIC          20 :                     n->objtype = $3;
 2339 peter_e                  7033 CBC          20 :                     n->object = (Node *) lappend($6, makeString($4));
 3055 sfrost                   7034              20 :                     n->comment = $8;
                               7035              20 :                     $$ = (Node *) n;
 3055 sfrost                   7036 ECB             :                 }
                               7037                 :             | COMMENT ON PROCEDURE function_with_argtypes IS comment_text
                               7038                 :                 {
 1956 peter_e                  7039 UIC           0 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    7040 ECB             : 
 1956 peter_e                  7041 UIC           0 :                     n->objtype = OBJECT_PROCEDURE;
 1956 peter_e                  7042 LBC           0 :                     n->object = (Node *) $4;
                               7043               0 :                     n->comment = $6;
                               7044               0 :                     $$ = (Node *) n;
 1956 peter_e                  7045 ECB             :                 }
                               7046                 :             | COMMENT ON ROUTINE function_with_argtypes IS comment_text
                               7047                 :                 {
 1956 peter_e                  7048 UIC           0 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    7049 ECB             : 
 1956 peter_e                  7050 UIC           0 :                     n->objtype = OBJECT_ROUTINE;
 1956 peter_e                  7051 LBC           0 :                     n->object = (Node *) $4;
                               7052               0 :                     n->comment = $6;
                               7053               0 :                     $$ = (Node *) n;
 1956 peter_e                  7054 ECB             :                 }
                               7055                 :             | COMMENT ON TRANSFORM FOR Typename LANGUAGE name IS comment_text
                               7056                 :                 {
 2905 peter_e                  7057 GIC           7 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    7058 ECB             : 
 2905 peter_e                  7059 GIC           7 :                     n->objtype = OBJECT_TRANSFORM;
 2339 peter_e                  7060 CBC           7 :                     n->object = (Node *) list_make2($5, makeString($7));
 2905                          7061               7 :                     n->comment = $9;
                               7062               7 :                     $$ = (Node *) n;
 2905 peter_e                  7063 ECB             :                 }
                               7064                 :             | COMMENT ON OPERATOR CLASS any_name USING name IS comment_text
                               7065                 :                 {
 7079 tgl                      7066 UIC           0 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    7067 ECB             : 
 7079 tgl                      7068 UIC           0 :                     n->objtype = OBJECT_OPCLASS;
 2339 peter_e                  7069 LBC           0 :                     n->object = (Node *) lcons(makeString($7), $5);
 7079 tgl                      7070               0 :                     n->comment = $9;
                               7071               0 :                     $$ = (Node *) n;
 7079 tgl                      7072 ECB             :                 }
                               7073                 :             | COMMENT ON OPERATOR FAMILY any_name USING name IS comment_text
                               7074                 :                 {
 5920 tgl                      7075 UIC           0 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    7076 ECB             : 
 5920 tgl                      7077 UIC           0 :                     n->objtype = OBJECT_OPFAMILY;
 2339 peter_e                  7078 LBC           0 :                     n->object = (Node *) lcons(makeString($7), $5);
 5920 tgl                      7079               0 :                     n->comment = $9;
                               7080               0 :                     $$ = (Node *) n;
 5920 tgl                      7081 ECB             :                 }
                               7082                 :             | COMMENT ON LARGE_P OBJECT_P NumericOnly IS comment_text
                               7083                 :                 {
 7079 tgl                      7084 GIC          12 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    7085 ECB             : 
 7079 tgl                      7086 GIC          12 :                     n->objtype = OBJECT_LARGEOBJECT;
 2339 peter_e                  7087 CBC          12 :                     n->object = (Node *) $5;
 7079 tgl                      7088              12 :                     n->comment = $7;
                               7089              12 :                     $$ = (Node *) n;
 7079 tgl                      7090 ECB             :                 }
                               7091                 :             | COMMENT ON CAST '(' Typename AS Typename ')' IS comment_text
                               7092                 :                 {
 7079 tgl                      7093 UIC           0 :                     CommentStmt *n = makeNode(CommentStmt);
  331 peter                    7094 ECB             : 
 7079 tgl                      7095 UIC           0 :                     n->objtype = OBJECT_CAST;
 2339 peter_e                  7096 LBC           0 :                     n->object = (Node *) list_make2($5, $7);
 7079 tgl                      7097               0 :                     n->comment = $10;
                               7098               0 :                     $$ = (Node *) n;
 7079 tgl                      7099 ECB             :                 }
                               7100                 :         ;
                               7101                 : 
                               7102                 : comment_text:
 7574 tgl                      7103 CBC       18599 :             Sconst                              { $$ = $1; }
 7574 tgl                      7104 GIC          49 :             | NULL_P                            { $$ = NULL; }
 8566 bruce                    7105 ECB             :         ;
                               7106                 : 
                               7107                 : 
                               7108                 : /*****************************************************************************
                               7109                 :  *
                               7110                 :  *  SECURITY LABEL [FOR <provider>] ON <object> IS <label>
 4577 rhaas                    7111                 :  *
                               7112                 :  *  As with COMMENT ON, <object> can refer to various types of database
                               7113                 :  *  objects (e.g. TABLE, COLUMN, etc.).
                               7114                 :  *
                               7115                 :  *****************************************************************************/
                               7116                 : 
                               7117                 : SecLabelStmt:
                               7118                 :             SECURITY LABEL opt_provider ON object_type_any_name any_name
                               7119                 :             IS security_label
                               7120                 :                 {
 4577 rhaas                    7121 CBC          24 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
  331 peter                    7122 ECB             : 
 4577 rhaas                    7123 GIC          24 :                     n->provider = $3;
                               7124              24 :                     n->objtype = $5;
 2339 peter_e                  7125              24 :                     n->object = (Node *) $6;
 2339 peter_e                  7126 GBC          24 :                     n->label = $8;
 2339 peter_e                  7127 GIC          24 :                     $$ = (Node *) n;
 2339 peter_e                  7128 EUB             :                 }
 1030 peter                    7129                 :             | SECURITY LABEL opt_provider ON COLUMN any_name
                               7130                 :               IS security_label
                               7131                 :                 {
 1030 peter                    7132 GIC           2 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7133                 : 
                               7134               2 :                     n->provider = $3;
 1030 peter                    7135 GBC           2 :                     n->objtype = OBJECT_COLUMN;
 1030 peter                    7136 GIC           2 :                     n->object = (Node *) $6;
 1030 peter                    7137 GBC           2 :                     n->label = $8;
                               7138               2 :                     $$ = (Node *) n;
 1030 peter                    7139 EUB             :                 }
                               7140                 :             | SECURITY LABEL opt_provider ON object_type_name name
                               7141                 :               IS security_label
                               7142                 :                 {
 2339 peter_e                  7143 GIC          22 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
  331 peter                    7144 ECB             : 
 2339 peter_e                  7145 GIC          22 :                     n->provider = $3;
 2339 peter_e                  7146 CBC          22 :                     n->objtype = $5;
                               7147              22 :                     n->object = (Node *) makeString($6);
 4577 rhaas                    7148              22 :                     n->label = $8;
                               7149              22 :                     $$ = (Node *) n;
                               7150                 :                 }
                               7151                 :             | SECURITY LABEL opt_provider ON TYPE_P Typename
                               7152                 :               IS security_label
 3022 alvherre                 7153 EUB             :                 {
 3022 alvherre                 7154 UIC           0 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
  331 peter                    7155 EUB             : 
 3022 alvherre                 7156 UBC           0 :                     n->provider = $3;
                               7157               0 :                     n->objtype = OBJECT_TYPE;
 2339 peter_e                  7158               0 :                     n->object = (Node *) $6;
 3022 alvherre                 7159 UIC           0 :                     n->label = $8;
                               7160               0 :                     $$ = (Node *) n;
                               7161                 :                 }
 3022 alvherre                 7162 EUB             :             | SECURITY LABEL opt_provider ON DOMAIN_P Typename
                               7163                 :               IS security_label
                               7164                 :                 {
 3022 alvherre                 7165 GBC           1 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
  331 peter                    7166 EUB             : 
 3022 alvherre                 7167 GBC           1 :                     n->provider = $3;
 2076 peter_e                  7168 GIC           1 :                     n->objtype = OBJECT_DOMAIN;
 2339                          7169               1 :                     n->object = (Node *) $6;
 3022 alvherre                 7170               1 :                     n->label = $8;
 3022 alvherre                 7171 CBC           1 :                     $$ = (Node *) n;
                               7172                 :                 }
 2397 peter_e                  7173 ECB             :             | SECURITY LABEL opt_provider ON AGGREGATE aggregate_with_argtypes
 4577 rhaas                    7174                 :               IS security_label
                               7175                 :                 {
 4577 rhaas                    7176 LBC           0 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7177                 : 
 4577 rhaas                    7178 UIC           0 :                     n->provider = $3;
                               7179               0 :                     n->objtype = OBJECT_AGGREGATE;
 2339 peter_e                  7180 UBC           0 :                     n->object = (Node *) $6;
 2397 peter_e                  7181 UIC           0 :                     n->label = $8;
 4577 rhaas                    7182 UBC           0 :                     $$ = (Node *) n;
 4577 rhaas                    7183 EUB             :                 }
 2397 peter_e                  7184                 :             | SECURITY LABEL opt_provider ON FUNCTION function_with_argtypes
 4577 rhaas                    7185                 :               IS security_label
                               7186                 :                 {
 4577 rhaas                    7187 GIC           1 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7188                 : 
                               7189               1 :                     n->provider = $3;
 4577 rhaas                    7190 CBC           1 :                     n->objtype = OBJECT_FUNCTION;
 2339 peter_e                  7191               1 :                     n->object = (Node *) $6;
 2397 peter_e                  7192 GIC           1 :                     n->label = $8;
 4577 rhaas                    7193               1 :                     $$ = (Node *) n;
                               7194                 :                 }
                               7195                 :             | SECURITY LABEL opt_provider ON LARGE_P OBJECT_P NumericOnly
                               7196                 :               IS security_label
                               7197                 :                 {
 4577 rhaas                    7198 UIC           0 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
                               7199                 : 
                               7200               0 :                     n->provider = $3;
                               7201               0 :                     n->objtype = OBJECT_LARGEOBJECT;
 2339 peter_e                  7202               0 :                     n->object = (Node *) $7;
 4577 rhaas                    7203               0 :                     n->label = $9;
                               7204               0 :                     $$ = (Node *) n;
                               7205                 :                 }
                               7206                 :             | SECURITY LABEL opt_provider ON PROCEDURE function_with_argtypes
                               7207                 :               IS security_label
 1956 peter_e                  7208 ECB             :                 {
 1956 peter_e                  7209 UIC           0 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
  331 peter                    7210 ECB             : 
 1956 peter_e                  7211 LBC           0 :                     n->provider = $3;
                               7212               0 :                     n->objtype = OBJECT_PROCEDURE;
                               7213               0 :                     n->object = (Node *) $6;
                               7214               0 :                     n->label = $8;
 1956 peter_e                  7215 UIC           0 :                     $$ = (Node *) n;
                               7216                 :                 }
                               7217                 :             | SECURITY LABEL opt_provider ON ROUTINE function_with_argtypes
                               7218                 :               IS security_label
 1956 peter_e                  7219 ECB             :                 {
 1956 peter_e                  7220 UIC           0 :                     SecLabelStmt *n = makeNode(SecLabelStmt);
  331 peter                    7221 ECB             : 
 1956 peter_e                  7222 LBC           0 :                     n->provider = $3;
                               7223               0 :                     n->objtype = OBJECT_ROUTINE;
                               7224               0 :                     n->object = (Node *) $6;
                               7225               0 :                     n->label = $8;
 1956 peter_e                  7226 UIC           0 :                     $$ = (Node *) n;
                               7227                 :                 }
                               7228                 :         ;
                               7229                 : 
 3598 tgl                      7230 CBC          10 : opt_provider:   FOR NonReservedWord_or_Sconst   { $$ = $2; }
  874 peter                    7231 GIC          40 :                 | /* EMPTY */                   { $$ = NULL; }
 4577 rhaas                    7232 ECB             :         ;
                               7233                 : 
 4577 rhaas                    7234 CBC          50 : security_label: Sconst              { $$ = $1; }
 4577 rhaas                    7235 LBC           0 :                 | NULL_P            { $$ = NULL; }
 4577 rhaas                    7236 ECB             :         ;
                               7237                 : 
                               7238                 : /*****************************************************************************
                               7239                 :  *
                               7240                 :  *      QUERY:
 7334 tgl                      7241 EUB             :  *          fetch/move
                               7242                 :  *
 9770 scrappy                  7243                 :  *****************************************************************************/
                               7244                 : 
 4897 alvherre                 7245                 : FetchStmt:  FETCH fetch_args
 9344 bruce                    7246                 :                 {
 7334 tgl                      7247 GBC        2792 :                     FetchStmt *n = (FetchStmt *) $2;
                               7248                 : 
 2062 peter_e                  7249 GIC        2792 :                     n->ismove = false;
  331 peter                    7250            2792 :                     $$ = (Node *) n;
                               7251                 :                 }
 4897 alvherre                 7252 ECB             :             | MOVE fetch_args
                               7253                 :                 {
 7334 tgl                      7254 CBC          47 :                     FetchStmt *n = (FetchStmt *) $2;
  331 peter                    7255 ECB             : 
 2062 peter_e                  7256 CBC          47 :                     n->ismove = true;
  331 peter                    7257              47 :                     $$ = (Node *) n;
 8482 bruce                    7258 ECB             :                 }
                               7259                 :         ;
                               7260                 : 
                               7261                 : fetch_args: cursor_name
                               7262                 :                 {
 8482 bruce                    7263 GBC          80 :                     FetchStmt *n = makeNode(FetchStmt);
                               7264                 : 
 4897 alvherre                 7265              80 :                     n->portalname = $1;
 7363 tgl                      7266              80 :                     n->direction = FETCH_FORWARD;
 8482 bruce                    7267              80 :                     n->howMany = 1;
  331 peter                    7268              80 :                     $$ = (Node *) n;
 8482 bruce                    7269 EUB             :                 }
                               7270                 :             | from_in cursor_name
                               7271                 :                 {
 8482 bruce                    7272 GIC          74 :                     FetchStmt *n = makeNode(FetchStmt);
                               7273                 : 
 4897 alvherre                 7274 CBC          74 :                     n->portalname = $2;
 7363 tgl                      7275 GIC          74 :                     n->direction = FETCH_FORWARD;
 8482 bruce                    7276 CBC          74 :                     n->howMany = 1;
  331 peter                    7277              74 :                     $$ = (Node *) n;
 8482 bruce                    7278 ECB             :                 }
 4897 alvherre                 7279                 :             | NEXT opt_from_in cursor_name
 9323 vadim4o                  7280                 :                 {
 9323 vadim4o                  7281 GIC         127 :                     FetchStmt *n = makeNode(FetchStmt);
                               7282                 : 
 4897 alvherre                 7283             127 :                     n->portalname = $3;
 7334 tgl                      7284             127 :                     n->direction = FETCH_FORWARD;
 7334 tgl                      7285 GBC         127 :                     n->howMany = 1;
  331 peter                    7286 GIC         127 :                     $$ = (Node *) n;
 8482 bruce                    7287 EUB             :                 }
 4897 alvherre                 7288                 :             | PRIOR opt_from_in cursor_name
 8482 bruce                    7289                 :                 {
 8482 bruce                    7290 GBC          15 :                     FetchStmt *n = makeNode(FetchStmt);
  331 peter                    7291 EUB             : 
 4897 alvherre                 7292 GIC          15 :                     n->portalname = $3;
 7334 tgl                      7293              15 :                     n->direction = FETCH_BACKWARD;
                               7294              15 :                     n->howMany = 1;
  331 peter                    7295              15 :                     $$ = (Node *) n;
 9344 bruce                    7296 EUB             :                 }
                               7297                 :             | FIRST_P opt_from_in cursor_name
 8482                          7298                 :                 {
 8482 bruce                    7299 GBC          14 :                     FetchStmt *n = makeNode(FetchStmt);
  331 peter                    7300 EUB             : 
 4897 alvherre                 7301 GBC          14 :                     n->portalname = $3;
 7334 tgl                      7302              14 :                     n->direction = FETCH_ABSOLUTE;
 8482 bruce                    7303 GIC          14 :                     n->howMany = 1;
  331 peter                    7304              14 :                     $$ = (Node *) n;
                               7305                 :                 }
                               7306                 :             | LAST_P opt_from_in cursor_name
 7334 tgl                      7307 EUB             :                 {
 7334 tgl                      7308 GIC           9 :                     FetchStmt *n = makeNode(FetchStmt);
  331 peter                    7309 EUB             : 
 4897 alvherre                 7310 GBC           9 :                     n->portalname = $3;
 7334 tgl                      7311               9 :                     n->direction = FETCH_ABSOLUTE;
                               7312               9 :                     n->howMany = -1;
  331 peter                    7313               9 :                     $$ = (Node *) n;
                               7314                 :                 }
                               7315                 :             | ABSOLUTE_P SignedIconst opt_from_in cursor_name
                               7316                 :                 {
 7334 tgl                      7317 CBC          40 :                     FetchStmt *n = makeNode(FetchStmt);
  331 peter                    7318 ECB             : 
 4897 alvherre                 7319 GIC          40 :                     n->portalname = $4;
 7334 tgl                      7320              40 :                     n->direction = FETCH_ABSOLUTE;
 7334 tgl                      7321 CBC          40 :                     n->howMany = $2;
  331 peter                    7322 GBC          40 :                     $$ = (Node *) n;
                               7323                 :                 }
                               7324                 :             | RELATIVE_P SignedIconst opt_from_in cursor_name
                               7325                 :                 {
 7334 tgl                      7326 GIC          15 :                     FetchStmt *n = makeNode(FetchStmt);
                               7327                 : 
 4897 alvherre                 7328              15 :                     n->portalname = $4;
 7334 tgl                      7329              15 :                     n->direction = FETCH_RELATIVE;
                               7330              15 :                     n->howMany = $2;
  331 peter                    7331              15 :                     $$ = (Node *) n;
                               7332                 :                 }
                               7333                 :             | SignedIconst opt_from_in cursor_name
 7334 tgl                      7334 ECB             :                 {
 7334 tgl                      7335 GIC        2030 :                     FetchStmt *n = makeNode(FetchStmt);
  331 peter                    7336 ECB             : 
 4897 alvherre                 7337 CBC        2030 :                     n->portalname = $3;
 7334 tgl                      7338 GIC        2030 :                     n->direction = FETCH_FORWARD;
                               7339            2030 :                     n->howMany = $1;
  331 peter                    7340            2030 :                     $$ = (Node *) n;
 7334 tgl                      7341 ECB             :                 }
                               7342                 :             | ALL opt_from_in cursor_name
                               7343                 :                 {
 7334 tgl                      7344 CBC         132 :                     FetchStmt *n = makeNode(FetchStmt);
                               7345                 : 
 4897 alvherre                 7346 GIC         132 :                     n->portalname = $3;
 7334 tgl                      7347             132 :                     n->direction = FETCH_FORWARD;
                               7348             132 :                     n->howMany = FETCH_ALL;
  331 peter                    7349             132 :                     $$ = (Node *) n;
 7334 tgl                      7350 ECB             :                 }
                               7351                 :             | FORWARD opt_from_in cursor_name
 8482 bruce                    7352                 :                 {
 8482 bruce                    7353 CBC           9 :                     FetchStmt *n = makeNode(FetchStmt);
  331 peter                    7354 ECB             : 
 4897 alvherre                 7355 CBC           9 :                     n->portalname = $3;
 7363 tgl                      7356 GIC           9 :                     n->direction = FETCH_FORWARD;
 8482 bruce                    7357               9 :                     n->howMany = 1;
  331 peter                    7358               9 :                     $$ = (Node *) n;
 8482 bruce                    7359 ECB             :                 }
                               7360                 :             | FORWARD SignedIconst opt_from_in cursor_name
                               7361                 :                 {
 8482 bruce                    7362 CBC          76 :                     FetchStmt *n = makeNode(FetchStmt);
  331 peter                    7363 ECB             : 
 4897 alvherre                 7364 CBC          76 :                     n->portalname = $4;
 7363 tgl                      7365 GIC          76 :                     n->direction = FETCH_FORWARD;
 7334                          7366              76 :                     n->howMany = $2;
  331 peter                    7367              76 :                     $$ = (Node *) n;
 7334 tgl                      7368 ECB             :                 }
                               7369                 :             | FORWARD ALL opt_from_in cursor_name
                               7370                 :                 {
 7334 tgl                      7371 CBC           7 :                     FetchStmt *n = makeNode(FetchStmt);
  331 peter                    7372 ECB             : 
 4897 alvherre                 7373 CBC           7 :                     n->portalname = $4;
 7334 tgl                      7374 GIC           7 :                     n->direction = FETCH_FORWARD;
                               7375               7 :                     n->howMany = FETCH_ALL;
  331 peter                    7376               7 :                     $$ = (Node *) n;
 7334 tgl                      7377 ECB             :                 }
                               7378                 :             | BACKWARD opt_from_in cursor_name
                               7379                 :                 {
 7334 tgl                      7380 CBC          39 :                     FetchStmt *n = makeNode(FetchStmt);
  331 peter                    7381 ECB             : 
 4897 alvherre                 7382 CBC          39 :                     n->portalname = $3;
 7334 tgl                      7383 GIC          39 :                     n->direction = FETCH_BACKWARD;
 8482 bruce                    7384              39 :                     n->howMany = 1;
  331 peter                    7385              39 :                     $$ = (Node *) n;
 8482 bruce                    7386 ECB             :                 }
                               7387                 :             | BACKWARD SignedIconst opt_from_in cursor_name
 7334 tgl                      7388                 :                 {
 7334 tgl                      7389 CBC         109 :                     FetchStmt *n = makeNode(FetchStmt);
  331 peter                    7390 ECB             : 
 4897 alvherre                 7391 CBC         109 :                     n->portalname = $4;
 7334 tgl                      7392 GIC         109 :                     n->direction = FETCH_BACKWARD;
                               7393             109 :                     n->howMany = $2;
  331 peter                    7394             109 :                     $$ = (Node *) n;
 7334 tgl                      7395 ECB             :                 }
                               7396                 :             | BACKWARD ALL opt_from_in cursor_name
 7601 bruce                    7397                 :                 {
 7334 tgl                      7398 CBC          63 :                     FetchStmt *n = makeNode(FetchStmt);
  331 peter                    7399 ECB             : 
 4897 alvherre                 7400 CBC          63 :                     n->portalname = $4;
 7334 tgl                      7401 GIC          63 :                     n->direction = FETCH_BACKWARD;
                               7402              63 :                     n->howMany = FETCH_ALL;
  331 peter                    7403              63 :                     $$ = (Node *) n;
 7601 bruce                    7404 ECB             :                 }
                               7405                 :         ;
 9770 scrappy                  7406                 : 
  878 peter                    7407                 : from_in:    FROM
                               7408                 :             | IN_P
 7601 bruce                    7409                 :         ;
                               7410                 : 
                               7411                 : opt_from_in:    from_in
                               7412                 :             | /* EMPTY */
 4897 alvherre                 7413                 :         ;
                               7414                 : 
 9297 lockhart                 7415                 : 
 9770 scrappy                  7416                 : /*****************************************************************************
                               7417                 :  *
 7720 peter_e                  7418                 :  * GRANT and REVOKE statements
                               7419                 :  *
                               7420                 :  *****************************************************************************/
                               7421                 : 
 7600 bruce                    7422                 : GrantStmt:  GRANT privileges ON privilege_target TO grantee_list
                               7423                 :             opt_grant_grant_option opt_granted_by
 9344                          7424                 :                 {
 7974 peter_e                  7425 CBC       24692 :                     GrantStmt *n = makeNode(GrantStmt);
  331 peter                    7426 ECB             : 
 7974 peter_e                  7427 CBC       24692 :                     n->is_grant = true;
 7974 peter_e                  7428 GIC       24692 :                     n->privileges = $2;
 4927 tgl                      7429           24692 :                     n->targtype = ($4)->targtype;
 7720 peter_e                  7430           24692 :                     n->objtype = ($4)->objtype;
 7720 peter_e                  7431 CBC       24692 :                     n->objects = ($4)->objs;
 7720 peter_e                  7432 GIC       24692 :                     n->grantees = $6;
 7381 peter_e                  7433 CBC       24692 :                     n->grant_option = $7;
  799 peter                    7434           24692 :                     n->grantor = $8;
  331                          7435           24692 :                     $$ = (Node *) n;
 9344 bruce                    7436 ECB             :                 }
                               7437                 :         ;
                               7438                 : 
                               7439                 : RevokeStmt:
 6494 tgl                      7440                 :             REVOKE privileges ON privilege_target
                               7441                 :             FROM grantee_list opt_granted_by opt_drop_behavior
 9344 bruce                    7442                 :                 {
 7720 peter_e                  7443 CBC       24123 :                     GrantStmt *n = makeNode(GrantStmt);
  331 peter                    7444 ECB             : 
 7720 peter_e                  7445 CBC       24123 :                     n->is_grant = false;
 6494 tgl                      7446 GIC       24123 :                     n->grant_option = false;
                               7447           24123 :                     n->privileges = $2;
 4927                          7448           24123 :                     n->targtype = ($4)->targtype;
 6494 tgl                      7449 CBC       24123 :                     n->objtype = ($4)->objtype;
 6494 tgl                      7450 GIC       24123 :                     n->objects = ($4)->objs;
 6494 tgl                      7451 CBC       24123 :                     n->grantees = $6;
  799 peter                    7452           24123 :                     n->grantor = $7;
                               7453           24123 :                     n->behavior = $8;
  331                          7454           24123 :                     $$ = (Node *) n;
                               7455                 :                 }
                               7456                 :             | REVOKE GRANT OPTION FOR privileges ON privilege_target
                               7457                 :             FROM grantee_list opt_granted_by opt_drop_behavior
 6494 tgl                      7458 ECB             :                 {
 6494 tgl                      7459 GIC           7 :                     GrantStmt *n = makeNode(GrantStmt);
  331 peter                    7460 ECB             : 
 6494 tgl                      7461 CBC           7 :                     n->is_grant = false;
                               7462               7 :                     n->grant_option = true;
                               7463               7 :                     n->privileges = $5;
 4927 tgl                      7464 GIC           7 :                     n->targtype = ($7)->targtype;
 6494                          7465               7 :                     n->objtype = ($7)->objtype;
                               7466               7 :                     n->objects = ($7)->objs;
 6494 tgl                      7467 CBC           7 :                     n->grantees = $9;
  799 peter                    7468 GIC           7 :                     n->grantor = $10;
  799 peter                    7469 CBC           7 :                     n->behavior = $11;
  331                          7470               7 :                     $$ = (Node *) n;
 9344 bruce                    7471 ECB             :                 }
                               7472                 :         ;
                               7473                 : 
                               7474                 : 
                               7475                 : /*
 5190 tgl                      7476                 :  * Privilege names are represented as strings; the validity of the privilege
                               7477                 :  * names gets checked at execution.  This is a bit annoying but we have little
                               7478                 :  * choice because of the syntactic conflict with lists of role names in
                               7479                 :  * GRANT/REVOKE.  What's more, we have to call out in the "privilege"
                               7480                 :  * production any reserved keywords that need to be usable as privilege names.
 6494                          7481                 :  */
                               7482                 : 
                               7483                 : /* either ALL [PRIVILEGES] or a list of individual privileges */
                               7484                 : privileges: privilege_list
 6494 tgl                      7485 CBC       44212 :                 { $$ = $1; }
                               7486                 :             | ALL
                               7487            4628 :                 { $$ = NIL; }
 6494 tgl                      7488 ECB             :             | ALL PRIVILEGES
 6494 tgl                      7489 CBC          59 :                 { $$ = NIL; }
 5190 tgl                      7490 ECB             :             | ALL '(' columnList ')'
                               7491                 :                 {
 5190 tgl                      7492 GIC           9 :                     AccessPriv *n = makeNode(AccessPriv);
                               7493                 : 
                               7494               9 :                     n->priv_name = NULL;
                               7495               9 :                     n->cols = $3;
                               7496               9 :                     $$ = list_make1(n);
                               7497                 :                 }
                               7498                 :             | ALL PRIVILEGES '(' columnList ')'
                               7499                 :                 {
 5190 tgl                      7500 UIC           0 :                     AccessPriv *n = makeNode(AccessPriv);
                               7501                 : 
                               7502               0 :                     n->priv_name = NULL;
                               7503               0 :                     n->cols = $4;
                               7504               0 :                     $$ = list_make1(n);
                               7505                 :                 }
                               7506                 :         ;
                               7507                 : 
 5190 tgl                      7508 GIC       45406 : privilege_list: privilege                           { $$ = list_make1($1); }
                               7509            1015 :             | privilege_list ',' privilege          { $$ = lappend($1, $3); }
                               7510                 :         ;
                               7511                 : 
 5190 tgl                      7512 ECB             : privilege:  SELECT opt_column_list
                               7513                 :             {
 5190 tgl                      7514 CBC       20430 :                 AccessPriv *n = makeNode(AccessPriv);
  331 peter                    7515 ECB             : 
 5190 tgl                      7516 CBC       20430 :                 n->priv_name = pstrdup($1);
                               7517           20430 :                 n->cols = $2;
                               7518           20430 :                 $$ = n;
 5190 tgl                      7519 ECB             :             }
                               7520                 :         | REFERENCES opt_column_list
                               7521                 :             {
 5190 tgl                      7522 CBC           7 :                 AccessPriv *n = makeNode(AccessPriv);
                               7523                 : 
 5190 tgl                      7524 GIC           7 :                 n->priv_name = pstrdup($1);
                               7525               7 :                 n->cols = $2;
                               7526               7 :                 $$ = n;
                               7527                 :             }
                               7528                 :         | CREATE opt_column_list
                               7529                 :             {
 5190 tgl                      7530 CBC         651 :                 AccessPriv *n = makeNode(AccessPriv);
                               7531                 : 
                               7532             651 :                 n->priv_name = pstrdup($1);
                               7533             651 :                 n->cols = $2;
                               7534             651 :                 $$ = n;
 5190 tgl                      7535 ECB             :             }
  368                          7536                 :         | ALTER SYSTEM_P
                               7537                 :             {
  368 tgl                      7538 CBC          12 :                 AccessPriv *n = makeNode(AccessPriv);
                               7539              12 :                 n->priv_name = pstrdup("alter system");
                               7540              12 :                 n->cols = NIL;
                               7541              12 :                 $$ = n;
                               7542                 :             }
                               7543                 :         | ColId opt_column_list
                               7544                 :             {
 5190 tgl                      7545 GIC       25321 :                 AccessPriv *n = makeNode(AccessPriv);
  331 peter                    7546 ECB             : 
 5190 tgl                      7547 GIC       25321 :                 n->priv_name = $1;
 5190 tgl                      7548 CBC       25321 :                 n->cols = $2;
                               7549           25321 :                 $$ = n;
 5190 tgl                      7550 ECB             :             }
 7720 peter_e                  7551                 :         ;
                               7552                 : 
  368 tgl                      7553                 : parameter_name_list:
                               7554                 :         parameter_name
                               7555                 :             {
  368 tgl                      7556 CBC          38 :                 $$ = list_make1(makeString($1));
  368 tgl                      7557 ECB             :             }
                               7558                 :         | parameter_name_list ',' parameter_name
                               7559                 :             {
  368 tgl                      7560 GIC          25 :                 $$ = lappend($1, makeString($3));
                               7561                 :             }
                               7562                 :         ;
                               7563                 : 
                               7564                 : parameter_name:
                               7565                 :         ColId
                               7566                 :             {
                               7567              63 :                 $$ = $1;
                               7568                 :             }
                               7569                 :         | parameter_name '.' ColId
                               7570                 :             {
                               7571              16 :                 $$ = psprintf("%s.%s", $1, $3);
  368 tgl                      7572 ECB             :             }
                               7573                 :         ;
                               7574                 : 
                               7575                 : 
 7720 peter_e                  7576                 : /* Don't bother trying to fold the first two rules into one using
                               7577                 :  * opt_table.  You're going to get conflicts.
                               7578                 :  */
 7601 bruce                    7579                 : privilege_target:
                               7580                 :             qualified_name_list
 9344                          7581                 :                 {
 5190 tgl                      7582 CBC       24380 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7583 ECB             : 
 4927 tgl                      7584 GIC       24380 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7585           24380 :                     n->objtype = OBJECT_TABLE;
 7720                          7586           24380 :                     n->objs = $1;
 7720 peter_e                  7587 GBC       24380 :                     $$ = n;
                               7588                 :                 }
 7689 tgl                      7589 EUB             :             | TABLE qualified_name_list
 9344 bruce                    7590                 :                 {
 5190 tgl                      7591 GBC         687 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7592                 : 
 4927 tgl                      7593 GIC         687 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7594             687 :                     n->objtype = OBJECT_TABLE;
 7720 peter_e                  7595 CBC         687 :                     n->objs = $2;
                               7596             687 :                     $$ = n;
                               7597                 :                 }
                               7598                 :             | SEQUENCE qualified_name_list
                               7599                 :                 {
 5190 tgl                      7600 GIC           6 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7601 ECB             : 
 4927 tgl                      7602 GIC           6 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7603 CBC           6 :                     n->objtype = OBJECT_SEQUENCE;
 6287 bruce                    7604               6 :                     n->objs = $2;
                               7605               6 :                     $$ = n;
                               7606                 :                 }
                               7607                 :             | FOREIGN DATA_P WRAPPER name_list
                               7608                 :                 {
 5190 tgl                      7609              46 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7610                 : 
 4927                          7611              46 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7612              46 :                     n->objtype = OBJECT_FDW;
 5224                          7613              46 :                     n->objs = $4;
 5224 peter_e                  7614 GIC          46 :                     $$ = n;
                               7615                 :                 }
                               7616                 :             | FOREIGN SERVER name_list
 5224 peter_e                  7617 ECB             :                 {
 5190 tgl                      7618 GIC          38 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7619 ECB             : 
 4927 tgl                      7620 CBC          38 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7621              38 :                     n->objtype = OBJECT_FOREIGN_SERVER;
 5224 peter_e                  7622 GIC          38 :                     n->objs = $3;
                               7623              38 :                     $$ = n;
                               7624                 :                 }
 7720 peter_e                  7625 ECB             :             | FUNCTION function_with_argtypes_list
 7987                          7626                 :                 {
 5190 tgl                      7627 CBC       22165 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7628 ECB             : 
 4927 tgl                      7629 GIC       22165 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7630           22165 :                     n->objtype = OBJECT_FUNCTION;
 7658 tgl                      7631           22165 :                     n->objs = $2;
 7658 tgl                      7632 CBC       22165 :                     $$ = n;
                               7633                 :                 }
  668 tgl                      7634 ECB             :             | PROCEDURE function_with_argtypes_list
 1956 peter_e                  7635                 :                 {
 1956 peter_e                  7636 CBC          18 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7637                 : 
 1956 peter_e                  7638 GIC          18 :                     n->targtype = ACL_TARGET_OBJECT;
 2006                          7639              18 :                     n->objtype = OBJECT_PROCEDURE;
 1956                          7640              18 :                     n->objs = $2;
                               7641              18 :                     $$ = n;
                               7642                 :                 }
  668 tgl                      7643 ECB             :             | ROUTINE function_with_argtypes_list
                               7644                 :                 {
 1956 peter_e                  7645 UIC           0 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7646                 : 
 1956 peter_e                  7647 LBC           0 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7648 UIC           0 :                     n->objtype = OBJECT_ROUTINE;
 1956                          7649               0 :                     n->objs = $2;
                               7650               0 :                     $$ = n;
                               7651                 :                 }
                               7652                 :             | DATABASE name_list
                               7653                 :                 {
 5190 tgl                      7654 CBC         655 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7655                 : 
 4927 tgl                      7656 GIC         655 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7657             655 :                     n->objtype = OBJECT_DATABASE;
 7720 peter_e                  7658 CBC         655 :                     n->objs = $2;
 7720 peter_e                  7659 GIC         655 :                     $$ = n;
                               7660                 :                 }
                               7661                 :             | DOMAIN_P any_name_list
                               7662                 :                 {
 4128                          7663              10 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7664                 : 
                               7665              10 :                     n->targtype = ACL_TARGET_OBJECT;
 2006                          7666              10 :                     n->objtype = OBJECT_DOMAIN;
 4128                          7667              10 :                     n->objs = $2;
                               7668              10 :                     $$ = n;
 4128 peter_e                  7669 ECB             :                 }
                               7670                 :             | LANGUAGE name_list
 7987                          7671                 :                 {
 5190 tgl                      7672 CBC          21 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7673 ECB             : 
 4927 tgl                      7674 CBC          21 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7675 GIC          21 :                     n->objtype = OBJECT_LANGUAGE;
 7658 tgl                      7676              21 :                     n->objs = $2;
                               7677              21 :                     $$ = n;
 7658 tgl                      7678 ECB             :                 }
                               7679                 :             | LARGE_P OBJECT_P NumericOnly_list
 4867 itagaki.takahiro         7680                 :                 {
 4867 itagaki.takahiro         7681 CBC          40 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7682 ECB             : 
 4867 itagaki.takahiro         7683 CBC          40 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7684 GIC          40 :                     n->objtype = OBJECT_LARGEOBJECT;
 4867 itagaki.takahiro         7685              40 :                     n->objs = $3;
                               7686              40 :                     $$ = n;
 4867 itagaki.takahiro         7687 ECB             :                 }
                               7688                 :             | PARAMETER parameter_name_list
  368 tgl                      7689                 :                 {
  368 tgl                      7690 CBC          38 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
                               7691              38 :                     n->targtype = ACL_TARGET_OBJECT;
                               7692              38 :                     n->objtype = OBJECT_PARAMETER_ACL;
  368 tgl                      7693 GIC          38 :                     n->objs = $2;
                               7694              38 :                     $$ = n;
                               7695                 :                 }
 7658 tgl                      7696 ECB             :             | SCHEMA name_list
                               7697                 :                 {
 5190 tgl                      7698 CBC         666 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7699 ECB             : 
 4927 tgl                      7700 CBC         666 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7701             666 :                     n->objtype = OBJECT_SCHEMA;
 7720 peter_e                  7702 GIC         666 :                     n->objs = $2;
                               7703             666 :                     $$ = n;
                               7704                 :                 }
 6869 tgl                      7705 ECB             :             | TABLESPACE name_list
                               7706                 :                 {
 5190 tgl                      7707 LBC           0 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7708 ECB             : 
 4927 tgl                      7709 LBC           0 :                     n->targtype = ACL_TARGET_OBJECT;
 2006 peter_e                  7710               0 :                     n->objtype = OBJECT_TABLESPACE;
 6869 tgl                      7711 UIC           0 :                     n->objs = $2;
                               7712               0 :                     $$ = n;
                               7713                 :                 }
 4128 peter_e                  7714 ECB             :             | TYPE_P any_name_list
                               7715                 :                 {
 4128 peter_e                  7716 CBC          43 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7717 ECB             : 
 4128 peter_e                  7718 CBC          43 :                     n->targtype = ACL_TARGET_OBJECT;
 2006                          7719              43 :                     n->objtype = OBJECT_TYPE;
 4128 peter_e                  7720 GIC          43 :                     n->objs = $2;
                               7721              43 :                     $$ = n;
                               7722                 :                 }
 4927 tgl                      7723 ECB             :             | ALL TABLES IN_P SCHEMA name_list
                               7724                 :                 {
 4927 tgl                      7725 CBC           6 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7726 ECB             : 
 4927 tgl                      7727 CBC           6 :                     n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
 2006 peter_e                  7728               6 :                     n->objtype = OBJECT_TABLE;
 4927 tgl                      7729 GIC           6 :                     n->objs = $5;
                               7730               6 :                     $$ = n;
                               7731                 :                 }
 4927 tgl                      7732 EUB             :             | ALL SEQUENCES IN_P SCHEMA name_list
                               7733                 :                 {
 4927 tgl                      7734 UBC           0 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7735 EUB             : 
 4927 tgl                      7736 UBC           0 :                     n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
 2006 peter_e                  7737               0 :                     n->objtype = OBJECT_SEQUENCE;
 4927 tgl                      7738 UIC           0 :                     n->objs = $5;
                               7739               0 :                     $$ = n;
                               7740                 :                 }
 4927 tgl                      7741 ECB             :             | ALL FUNCTIONS IN_P SCHEMA name_list
                               7742                 :                 {
 4927 tgl                      7743 CBC           3 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7744 ECB             : 
 4927 tgl                      7745 CBC           3 :                     n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
 2006 peter_e                  7746               3 :                     n->objtype = OBJECT_FUNCTION;
 4927 tgl                      7747 GIC           3 :                     n->objs = $5;
                               7748               3 :                     $$ = n;
                               7749                 :                 }
 1956 peter_e                  7750 ECB             :             | ALL PROCEDURES IN_P SCHEMA name_list
                               7751                 :                 {
 1956 peter_e                  7752 CBC           3 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7753 ECB             : 
 1956 peter_e                  7754 CBC           3 :                     n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
 2006                          7755               3 :                     n->objtype = OBJECT_PROCEDURE;
 1956 peter_e                  7756 GIC           3 :                     n->objs = $5;
                               7757               3 :                     $$ = n;
                               7758                 :                 }
 1956 peter_e                  7759 ECB             :             | ALL ROUTINES IN_P SCHEMA name_list
                               7760                 :                 {
 1956 peter_e                  7761 CBC           3 :                     PrivTarget *n = (PrivTarget *) palloc(sizeof(PrivTarget));
  331 peter                    7762 ECB             : 
 1956 peter_e                  7763 CBC           3 :                     n->targtype = ACL_TARGET_ALL_IN_SCHEMA;
 2006                          7764               3 :                     n->objtype = OBJECT_ROUTINE;
 1956 peter_e                  7765 GIC           3 :                     n->objs = $5;
                               7766               3 :                     $$ = n;
                               7767                 :                 }
 9344 bruce                    7768 ECB             :         ;
                               7769                 : 
 7720 peter_e                  7770                 : 
 7601 bruce                    7771                 : grantee_list:
 6888 neilc                    7772 CBC       48902 :             grantee                                 { $$ = list_make1($1); }
 7601 bruce                    7773              33 :             | grantee_list ',' grantee              { $$ = lappend($1, $3); }
                               7774                 :         ;
                               7775                 : 
                               7776                 : grantee:
 2953 alvherre                 7777           48923 :             RoleSpec                                { $$ = $1; }
                               7778              12 :             | GROUP_P RoleSpec                      { $$ = $2; }
 9344 bruce                    7779 ECB             :         ;
 9770 scrappy                  7780                 : 
 7974 peter_e                  7781                 : 
                               7782                 : opt_grant_grant_option:
 2062 peter_e                  7783 GIC          43 :             WITH GRANT OPTION { $$ = true; }
                               7784           24699 :             | /*EMPTY*/ { $$ = false; }
 7720 peter_e                  7785 ECB             :         ;
                               7786                 : 
 6494 tgl                      7787                 : /*****************************************************************************
                               7788                 :  *
                               7789                 :  * GRANT and REVOKE ROLE statements
                               7790                 :  *
                               7791                 :  *****************************************************************************/
                               7792                 : 
                               7793                 : GrantRoleStmt:
                               7794                 :             GRANT privilege_list TO role_list opt_granted_by
                               7795                 :                 {
 6494 tgl                      7796 GBC        1058 :                     GrantRoleStmt *n = makeNode(GrantRoleStmt);
  331 peter                    7797 EUB             : 
 6494 tgl                      7798 GBC        1058 :                     n->is_grant = true;
                               7799            1058 :                     n->granted_roles = $2;
 6494 tgl                      7800 GIC        1058 :                     n->grantee_roles = $4;
  227 rhaas                    7801 GNC        1058 :                     n->opt = NIL;
                               7802            1058 :                     n->grantor = $5;
                               7803            1058 :                     $$ = (Node *) n;
                               7804                 :                 }
                               7805                 :           | GRANT privilege_list TO role_list WITH grant_role_opt_list opt_granted_by
                               7806                 :                 {
                               7807              57 :                     GrantRoleStmt *n = makeNode(GrantRoleStmt);
                               7808                 : 
                               7809              57 :                     n->is_grant = true;
                               7810              57 :                     n->granted_roles = $2;
                               7811              57 :                     n->grantee_roles = $4;
                               7812              57 :                     n->opt = $6;
                               7813              57 :                     n->grantor = $7;
  331 peter                    7814 CBC          57 :                     $$ = (Node *) n;
                               7815                 :                 }
 6494 tgl                      7816 ECB             :         ;
                               7817                 : 
                               7818                 : RevokeRoleStmt:
 3365 sfrost                   7819                 :             REVOKE privilege_list FROM role_list opt_granted_by opt_drop_behavior
                               7820                 :                 {
 6494 tgl                      7821 GIC          46 :                     GrantRoleStmt *n = makeNode(GrantRoleStmt);
                               7822                 : 
 6494 tgl                      7823 CBC          46 :                     n->is_grant = false;
  227 rhaas                    7824 GNC          46 :                     n->opt = NIL;
 6494 tgl                      7825 CBC          46 :                     n->granted_roles = $2;
                               7826              46 :                     n->grantee_roles = $4;
  230 rhaas                    7827 GNC          46 :                     n->grantor = $5;
 6494 tgl                      7828 CBC          46 :                     n->behavior = $6;
  331 peter                    7829              46 :                     $$ = (Node *) n;
                               7830                 :                 }
                               7831                 :             | REVOKE ColId OPTION FOR privilege_list FROM role_list opt_granted_by opt_drop_behavior
                               7832                 :                 {
 6494 tgl                      7833 GBC          33 :                     GrantRoleStmt *n = makeNode(GrantRoleStmt);
                               7834                 :                     DefElem *opt;
                               7835                 : 
  227 rhaas                    7836 GNC          33 :                     opt = makeDefElem(pstrdup($2),
                               7837              33 :                                       (Node *) makeBoolean(false), @2);
 6494 tgl                      7838 GBC          33 :                     n->is_grant = false;
  227 rhaas                    7839 GNC          33 :                     n->opt = list_make1(opt);
 6494 tgl                      7840 GBC          33 :                     n->granted_roles = $5;
                               7841              33 :                     n->grantee_roles = $7;
  230 rhaas                    7842 GNC          33 :                     n->grantor = $8;
 6494 tgl                      7843 GIC          33 :                     n->behavior = $9;
  331 peter                    7844              33 :                     $$ = (Node *) n;
                               7845                 :                 }
 6494 tgl                      7846 ECB             :         ;
                               7847                 : 
                               7848                 : grant_role_opt_list:
  227 rhaas                    7849 GNC          16 :             grant_role_opt_list ',' grant_role_opt  { $$ = lappend($1, $3); }
                               7850              57 :             | grant_role_opt                        { $$ = list_make1($1); }
                               7851                 :         ;
                               7852                 : 
                               7853                 : grant_role_opt:
                               7854                 :         ColLabel grant_role_opt_value
                               7855                 :             {
                               7856              73 :                 $$ = makeDefElem(pstrdup($1), $2, @1);
                               7857                 :             }
                               7858                 :         ;
                               7859                 : 
                               7860                 : grant_role_opt_value:
                               7861              36 :         OPTION          { $$ = (Node *) makeBoolean(true); }
                               7862              15 :         | TRUE_P        { $$ = (Node *) makeBoolean(true); }
                               7863              22 :         | FALSE_P       { $$ = (Node *) makeBoolean(false); }
 6494 tgl                      7864 ECB             :         ;
                               7865                 : 
 2953 alvherre                 7866 GIC          48 : opt_granted_by: GRANTED BY RoleSpec                     { $$ = $3; }
 6494 tgl                      7867           49968 :             | /*EMPTY*/                                 { $$ = NULL; }
                               7868                 :         ;
 6494 tgl                      7869 ECB             : 
                               7870                 : /*****************************************************************************
 4934                          7871                 :  *
                               7872                 :  * ALTER DEFAULT PRIVILEGES statement
                               7873                 :  *
                               7874                 :  *****************************************************************************/
                               7875                 : 
                               7876                 : AlterDefaultPrivilegesStmt:
                               7877                 :             ALTER DEFAULT PRIVILEGES DefACLOptionList DefACLAction
                               7878                 :                 {
 4934 tgl                      7879 GIC          80 :                     AlterDefaultPrivilegesStmt *n = makeNode(AlterDefaultPrivilegesStmt);
  331 peter                    7880 ECB             : 
 4934 tgl                      7881 CBC          80 :                     n->options = $4;
                               7882              80 :                     n->action = (GrantStmt *) $5;
  331 peter                    7883              80 :                     $$ = (Node *) n;
                               7884                 :                 }
                               7885                 :         ;
                               7886                 : 
                               7887                 : DefACLOptionList:
 4934 tgl                      7888 GIC          61 :             DefACLOptionList DefACLOption           { $$ = lappend($1, $2); }
 4934 tgl                      7889 CBC          80 :             | /* EMPTY */                           { $$ = NIL; }
 4934 tgl                      7890 ECB             :         ;
                               7891                 : 
                               7892                 : DefACLOption:
                               7893                 :             IN_P SCHEMA name_list
                               7894                 :                 {
  331 peter                    7895 CBC          27 :                     $$ = makeDefElem("schemas", (Node *) $3, @1);
                               7896                 :                 }
                               7897                 :             | FOR ROLE role_list
                               7898                 :                 {
  331 peter                    7899 GIC          34 :                     $$ = makeDefElem("roles", (Node *) $3, @1);
 4934 tgl                      7900 ECB             :                 }
 3365 sfrost                   7901                 :             | FOR USER role_list
                               7902                 :                 {
  331 peter                    7903 UIC           0 :                     $$ = makeDefElem("roles", (Node *) $3, @1);
                               7904                 :                 }
                               7905                 :         ;
                               7906                 : 
                               7907                 : /*
                               7908                 :  * This should match GRANT/REVOKE, except that individual target objects
                               7909                 :  * are not mentioned and we only allow a subset of object types.
                               7910                 :  */
                               7911                 : DefACLAction:
                               7912                 :             GRANT privileges ON defacl_privilege_target TO grantee_list
 4934 tgl                      7913 ECB             :             opt_grant_grant_option
                               7914                 :                 {
 4934 tgl                      7915 CBC          50 :                     GrantStmt *n = makeNode(GrantStmt);
  331 peter                    7916 ECB             : 
 4934 tgl                      7917 CBC          50 :                     n->is_grant = true;
                               7918              50 :                     n->privileges = $2;
 4927                          7919              50 :                     n->targtype = ACL_TARGET_DEFAULTS;
 4934                          7920              50 :                     n->objtype = $4;
 4934 tgl                      7921 GIC          50 :                     n->objects = NIL;
                               7922              50 :                     n->grantees = $6;
                               7923              50 :                     n->grant_option = $7;
  331 peter                    7924 CBC          50 :                     $$ = (Node *) n;
                               7925                 :                 }
 4934 tgl                      7926 ECB             :             | REVOKE privileges ON defacl_privilege_target
                               7927                 :             FROM grantee_list opt_drop_behavior
                               7928                 :                 {
 4934 tgl                      7929 CBC          30 :                     GrantStmt *n = makeNode(GrantStmt);
  331 peter                    7930 ECB             : 
 4934 tgl                      7931 CBC          30 :                     n->is_grant = false;
 4934 tgl                      7932 GIC          30 :                     n->grant_option = false;
                               7933              30 :                     n->privileges = $2;
 4927                          7934              30 :                     n->targtype = ACL_TARGET_DEFAULTS;
 4934                          7935              30 :                     n->objtype = $4;
                               7936              30 :                     n->objects = NIL;
                               7937              30 :                     n->grantees = $6;
 4934 tgl                      7938 CBC          30 :                     n->behavior = $7;
  331 peter                    7939 GIC          30 :                     $$ = (Node *) n;
 4934 tgl                      7940 ECB             :                 }
                               7941                 :             | REVOKE GRANT OPTION FOR privileges ON defacl_privilege_target
                               7942                 :             FROM grantee_list opt_drop_behavior
                               7943                 :                 {
 4934 tgl                      7944 LBC           0 :                     GrantStmt *n = makeNode(GrantStmt);
  331 peter                    7945 ECB             : 
 4934 tgl                      7946 LBC           0 :                     n->is_grant = false;
 4934 tgl                      7947 UIC           0 :                     n->grant_option = true;
                               7948               0 :                     n->privileges = $5;
 4927                          7949               0 :                     n->targtype = ACL_TARGET_DEFAULTS;
 4934 tgl                      7950 LBC           0 :                     n->objtype = $7;
 4934 tgl                      7951 UIC           0 :                     n->objects = NIL;
                               7952               0 :                     n->grantees = $9;
 4934 tgl                      7953 LBC           0 :                     n->behavior = $10;
  331 peter                    7954               0 :                     $$ = (Node *) n;
 4934 tgl                      7955 ECB             :                 }
                               7956                 :         ;
                               7957                 : 
                               7958                 : defacl_privilege_target:
 2006 peter_e                  7959 CBC          39 :             TABLES          { $$ = OBJECT_TABLE; }
                               7960               8 :             | FUNCTIONS     { $$ = OBJECT_FUNCTION; }
                               7961               3 :             | ROUTINES      { $$ = OBJECT_FUNCTION; }
 2006 peter_e                  7962 GIC           3 :             | SEQUENCES     { $$ = OBJECT_SEQUENCE; }
                               7963               9 :             | TYPES_P       { $$ = OBJECT_TYPE; }
                               7964              18 :             | SCHEMAS       { $$ = OBJECT_SCHEMA; }
                               7965                 :         ;
 4934 tgl                      7966 ECB             : 
 9297 lockhart                 7967                 : 
                               7968                 : /*****************************************************************************
                               7969                 :  *
                               7970                 :  *      QUERY: CREATE INDEX
                               7971                 :  *
                               7972                 :  * Note: we cannot put TABLESPACE clause after WHERE clause unless we are
 6869 tgl                      7973                 :  * willing to make TABLESPACE a fully reserved word.
                               7974                 :  *****************************************************************************/
                               7975                 : 
                               7976                 : IndexStmt:  CREATE opt_unique INDEX opt_concurrently opt_single_name
                               7977                 :             ON relation_expr access_method_clause '(' index_params ')'
  430 peter                    7978                 :             opt_include opt_unique_null_treatment opt_reloptions OptTableSpace where_clause
 6071 tgl                      7979                 :                 {
 6071 tgl                      7980 CBC        2820 :                     IndexStmt *n = makeNode(IndexStmt);
                               7981                 : 
 6071 tgl                      7982 GIC        2820 :                     n->unique = $2;
 4855 tgl                      7983 CBC        2820 :                     n->concurrent = $4;
 6071                          7984            2820 :                     n->idxname = $5;
 6071 tgl                      7985 GIC        2820 :                     n->relation = $7;
                               7986            2820 :                     n->accessMethod = $8;
                               7987            2820 :                     n->indexParams = $10;
 1828 teodor                   7988            2820 :                     n->indexIncludingParams = $12;
  430 peter                    7989            2820 :                     n->nulls_not_distinct = !$13;
                               7990            2820 :                     n->options = $14;
                               7991            2820 :                     n->tableSpace = $15;
                               7992            2820 :                     n->whereClause = $16;
 3919 tgl                      7993            2820 :                     n->excludeOpNames = NIL;
                               7994            2820 :                     n->idxcomment = NULL;
 4457                          7995            2820 :                     n->indexOid = InvalidOid;
  277 rhaas                    7996 GNC        2820 :                     n->oldNumber = InvalidRelFileNumber;
 1100 noah                     7997 GIC        2820 :                     n->oldCreateSubid = InvalidSubTransactionId;
  277 rhaas                    7998 GNC        2820 :                     n->oldFirstRelfilelocatorSubid = InvalidSubTransactionId;
 3919 tgl                      7999 CBC        2820 :                     n->primary = false;
                               8000            2820 :                     n->isconstraint = false;
 3919 tgl                      8001 GIC        2820 :                     n->deferrable = false;
                               8002            2820 :                     n->initdeferred = false;
 2968                          8003            2820 :                     n->transformed = false;
 3076 fujii                    8004            2820 :                     n->if_not_exists = false;
 1445 alvherre                 8005 CBC        2820 :                     n->reset_default_tblspc = false;
  331 peter                    8006            2820 :                     $$ = (Node *) n;
                               8007                 :                 }
                               8008                 :             | CREATE opt_unique INDEX opt_concurrently IF_P NOT EXISTS name
                               8009                 :             ON relation_expr access_method_clause '(' index_params ')'
                               8010                 :             opt_include opt_unique_null_treatment opt_reloptions OptTableSpace where_clause
                               8011                 :                 {
 3076 fujii                    8012               9 :                     IndexStmt *n = makeNode(IndexStmt);
                               8013                 : 
 3076 fujii                    8014 GIC           9 :                     n->unique = $2;
                               8015               9 :                     n->concurrent = $4;
 3076 fujii                    8016 CBC           9 :                     n->idxname = $8;
 3076 fujii                    8017 GIC           9 :                     n->relation = $10;
                               8018               9 :                     n->accessMethod = $11;
                               8019               9 :                     n->indexParams = $13;
 1828 teodor                   8020 GBC           9 :                     n->indexIncludingParams = $15;
  430 peter                    8021 GIC           9 :                     n->nulls_not_distinct = !$16;
                               8022               9 :                     n->options = $17;
                               8023               9 :                     n->tableSpace = $18;
                               8024               9 :                     n->whereClause = $19;
 3076 fujii                    8025               9 :                     n->excludeOpNames = NIL;
                               8026               9 :                     n->idxcomment = NULL;
                               8027               9 :                     n->indexOid = InvalidOid;
  277 rhaas                    8028 GNC           9 :                     n->oldNumber = InvalidRelFileNumber;
 1100 noah                     8029 GIC           9 :                     n->oldCreateSubid = InvalidSubTransactionId;
  277 rhaas                    8030 GNC           9 :                     n->oldFirstRelfilelocatorSubid = InvalidSubTransactionId;
 3076 fujii                    8031 GIC           9 :                     n->primary = false;
 3076 fujii                    8032 CBC           9 :                     n->isconstraint = false;
 3076 fujii                    8033 GIC           9 :                     n->deferrable = false;
 3076 fujii                    8034 CBC           9 :                     n->initdeferred = false;
 2968 tgl                      8035               9 :                     n->transformed = false;
 3076 fujii                    8036               9 :                     n->if_not_exists = true;
 1445 alvherre                 8037               9 :                     n->reset_default_tblspc = false;
  331 peter                    8038               9 :                     $$ = (Node *) n;
 6071 tgl                      8039 ECB             :                 }
 9344 bruce                    8040                 :         ;
                               8041                 : 
                               8042                 : opt_unique:
 2062 peter_e                  8043 GIC         528 :             UNIQUE                                  { $$ = true; }
                               8044            2304 :             | /*EMPTY*/                             { $$ = false; }
                               8045                 :         ;
 9344 bruce                    8046 ECB             : 
                               8047                 : access_method_clause:
 1033 peter                    8048 GIC        1273 :             USING name                              { $$ = $2; }
 7600 bruce                    8049            1632 :             | /*EMPTY*/                             { $$ = DEFAULT_INDEX_TYPE; }
                               8050                 :         ;
 9733 scrappy                  8051 EUB             : 
 6888 neilc                    8052 GIC        3457 : index_params:   index_elem                          { $$ = list_make1($1); }
 7256 tgl                      8053 GBC         918 :             | index_params ',' index_elem           { $$ = lappend($1, $3); }
 9297 lockhart                 8054 EUB             :         ;
                               8055                 : 
 1105 akorotkov                8056                 : 
                               8057                 : index_elem_options:
                               8058                 :     opt_collate opt_qualified_name opt_asc_desc opt_nulls_order
                               8059                 :         {
 1105 akorotkov                8060 GBC        4587 :             $$ = makeNode(IndexElem);
                               8061            4587 :             $$->name = NULL;
 1105 akorotkov                8062 GIC        4587 :             $$->expr = NULL;
                               8063            4587 :             $$->indexcolname = NULL;
                               8064            4587 :             $$->collation = $1;
                               8065            4587 :             $$->opclass = $2;
 1105 akorotkov                8066 CBC        4587 :             $$->opclassopts = NIL;
                               8067            4587 :             $$->ordering = $3;
                               8068            4587 :             $$->nulls_ordering = $4;
 1105 akorotkov                8069 ECB             :         }
                               8070                 :     | opt_collate any_name reloptions opt_asc_desc opt_nulls_order
                               8071                 :         {
 1105 akorotkov                8072 GIC          66 :             $$ = makeNode(IndexElem);
                               8073              66 :             $$->name = NULL;
                               8074              66 :             $$->expr = NULL;
                               8075              66 :             $$->indexcolname = NULL;
                               8076              66 :             $$->collation = $1;
                               8077              66 :             $$->opclass = $2;
                               8078              66 :             $$->opclassopts = $3;
                               8079              66 :             $$->ordering = $4;
                               8080              66 :             $$->nulls_ordering = $5;
                               8081                 :         }
                               8082                 :     ;
                               8083                 : 
                               8084                 : /*
                               8085                 :  * Index attributes can be either simple column references, or arbitrary
                               8086                 :  * expressions in parens.  For backwards-compatibility reasons, we allow
 7256 tgl                      8087 ECB             :  * an expression that's just a function call to be written without parens.
                               8088                 :  */
 1105 akorotkov                8089                 : index_elem: ColId index_elem_options
 7256 tgl                      8090                 :                 {
 1105 akorotkov                8091 CBC        4266 :                     $$ = $2;
 7256 tgl                      8092            4266 :                     $$->name = $1;
 7256 tgl                      8093 ECB             :                 }
 1105 akorotkov                8094                 :             | func_expr_windowless index_elem_options
 9297 lockhart                 8095                 :                 {
 1105 akorotkov                8096 CBC         164 :                     $$ = $2;
 6766 tgl                      8097             164 :                     $$->expr = $1;
 9297 lockhart                 8098 ECB             :                 }
 1105 akorotkov                8099                 :             | '(' a_expr ')' index_elem_options
 9297 lockhart                 8100                 :                 {
 1105 akorotkov                8101 CBC         223 :                     $$ = $4;
 7256 tgl                      8102             223 :                     $$->expr = $2;
 9297 lockhart                 8103 ECB             :                 }
                               8104                 :         ;
                               8105                 : 
 1828 teodor                   8106 CBC         105 : opt_include:        INCLUDE '(' index_including_params ')'          { $$ = $3; }
                               8107            2724 :              |      /* EMPTY */                     { $$ = NIL; }
 1828 teodor                   8108 ECB             :         ;
                               8109                 : 
 1828 teodor                   8110 CBC         105 : index_including_params: index_elem                      { $$ = list_make1($1); }
                               8111              82 :             | index_including_params ',' index_elem     { $$ = lappend($1, $3); }
 1828 teodor                   8112 ECB             :         ;
                               8113                 : 
 4443 peter_e                  8114 GIC          92 : opt_collate: COLLATE any_name                       { $$ = $2; }
                               8115            6946 :             | /*EMPTY*/                             { $$ = NIL; }
                               8116                 :         ;
                               8117                 : 
 9297 lockhart                 8118 ECB             : 
 5934 tgl                      8119 CBC         955 : opt_asc_desc: ASC                           { $$ = SORTBY_ASC; }
 5333                          8120            1462 :             | DESC                          { $$ = SORTBY_DESC; }
                               8121           43811 :             | /*EMPTY*/                     { $$ = SORTBY_DEFAULT; }
 5934 tgl                      8122 ECB             :         ;
                               8123                 : 
 2966 tgl                      8124 CBC         135 : opt_nulls_order: NULLS_LA FIRST_P           { $$ = SORTBY_NULLS_FIRST; }
                               8125             658 :             | NULLS_LA LAST_P               { $$ = SORTBY_NULLS_LAST; }
 5934                          8126           45545 :             | /*EMPTY*/                     { $$ = SORTBY_NULLS_DEFAULT; }
 5934 tgl                      8127 ECB             :         ;
                               8128                 : 
                               8129                 : 
 9770 scrappy                  8130                 : /*****************************************************************************
                               8131                 :  *
 9344 bruce                    8132                 :  *      QUERY:
 7859 tgl                      8133                 :  *              create [or replace] function <fname>
 8413 lockhart                 8134                 :  *                      [(<type-1> { , <type-n>})]
                               8135                 :  *                      returns <type-r>
                               8136                 :  *                      as <filename or code in language as appropriate>
 7859 tgl                      8137                 :  *                      language <lang> [with parameters]
 9770 scrappy                  8138                 :  *
                               8139                 :  *****************************************************************************/
                               8140                 : 
 7601 bruce                    8141                 : CreateFunctionStmt:
 5239 peter_e                  8142                 :             CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
                               8143                 :             RETURNS func_return opt_createfunc_opt_list opt_routine_body
                               8144                 :                 {
 7632 peter_e                  8145 GIC       34962 :                     CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
                               8146                 : 
 1899 tgl                      8147 CBC       34962 :                     n->is_procedure = false;
 7859                          8148           34962 :                     n->replace = $2;
 7670 tgl                      8149 GIC       34962 :                     n->funcname = $4;
 7033                          8150           34962 :                     n->parameters = $5;
 7681                          8151           34962 :                     n->returnType = $7;
 7632 peter_e                  8152 CBC       34962 :                     n->options = $8;
  732 peter                    8153           34962 :                     n->sql_body = $9;
  331 peter                    8154 GIC       34962 :                     $$ = (Node *) n;
                               8155                 :                 }
 5239 peter_e                  8156 ECB             :             | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
  732 peter                    8157                 :               RETURNS TABLE '(' table_func_column_list ')' opt_createfunc_opt_list opt_routine_body
                               8158                 :                 {
 5378 tgl                      8159 GIC          88 :                     CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
                               8160                 : 
 1899                          8161              88 :                     n->is_procedure = false;
 5378                          8162              88 :                     n->replace = $2;
                               8163              88 :                     n->funcname = $4;
 5378 tgl                      8164 CBC          88 :                     n->parameters = mergeTableFuncParameters($5, $9);
                               8165              88 :                     n->returnType = TableFuncTypeName($9);
                               8166              88 :                     n->returnType->location = @7;
                               8167              88 :                     n->options = $11;
  732 peter                    8168              88 :                     n->sql_body = $12;
  331                          8169              88 :                     $$ = (Node *) n;
 5378 tgl                      8170 ECB             :                 }
 5239 peter_e                  8171                 :             | CREATE opt_or_replace FUNCTION func_name func_args_with_defaults
  732 peter                    8172                 :               opt_createfunc_opt_list opt_routine_body
                               8173                 :                 {
 6583 tgl                      8174 GIC         229 :                     CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
                               8175                 : 
 1899 tgl                      8176 CBC         229 :                     n->is_procedure = false;
 6583                          8177             229 :                     n->replace = $2;
                               8178             229 :                     n->funcname = $4;
                               8179             229 :                     n->parameters = $5;
                               8180             229 :                     n->returnType = NULL;
                               8181             229 :                     n->options = $6;
  732 peter                    8182             229 :                     n->sql_body = $7;
  331                          8183             229 :                     $$ = (Node *) n;
 6583 tgl                      8184 ECB             :                 }
                               8185                 :             | CREATE opt_or_replace PROCEDURE func_name func_args_with_defaults
                               8186                 :               opt_createfunc_opt_list opt_routine_body
                               8187                 :                 {
 1956 peter_e                  8188 GIC         151 :                     CreateFunctionStmt *n = makeNode(CreateFunctionStmt);
                               8189                 : 
 1899 tgl                      8190             151 :                     n->is_procedure = true;
 1956 peter_e                  8191             151 :                     n->replace = $2;
                               8192             151 :                     n->funcname = $4;
                               8193             151 :                     n->parameters = $5;
                               8194             151 :                     n->returnType = NULL;
 1956 peter_e                  8195 CBC         151 :                     n->options = $6;
  732 peter                    8196             151 :                     n->sql_body = $7;
  331 peter                    8197 GIC         151 :                     $$ = (Node *) n;
                               8198                 :                 }
                               8199                 :         ;
 9344 bruce                    8200 ECB             : 
 7601                          8201                 : opt_or_replace:
 2062 peter_e                  8202 GIC       25152 :             OR REPLACE                              { $$ = true; }
                               8203           13633 :             | /*EMPTY*/                             { $$ = false; }
                               8204                 :         ;
 7859 tgl                      8205 ECB             : 
 7601 bruce                    8206 CBC       14758 : func_args:  '(' func_args_list ')'                  { $$ = $2; }
 7601 bruce                    8207 GIC       10588 :             | '(' ')'                               { $$ = NIL; }
                               8208                 :         ;
                               8209                 : 
 7601 bruce                    8210 ECB             : func_args_list:
 6888 neilc                    8211 CBC       14758 :             func_arg                                { $$ = list_make1($1); }
 7601 bruce                    8212 GIC        9924 :             | func_args_list ',' func_arg           { $$ = lappend($1, $3); }
                               8213                 :         ;
 8413 lockhart                 8214 ECB             : 
 2397 peter_e                  8215                 : function_with_argtypes_list:
 2397 peter_e                  8216 GIC       23869 :             function_with_argtypes                  { $$ = list_make1($1); }
                               8217                 :             | function_with_argtypes_list ',' function_with_argtypes
 2397 peter_e                  8218 CBC          33 :                                                     { $$ = lappend($1, $3); }
 2397 peter_e                  8219 ECB             :         ;
                               8220                 : 
                               8221                 : function_with_argtypes:
                               8222                 :             func_name func_args
                               8223                 :                 {
 2293 peter_e                  8224 CBC       25346 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
  331 peter                    8225 ECB             : 
 2293 peter_e                  8226 GIC       25346 :                     n->objname = $1;
  668 tgl                      8227           25346 :                     n->objargs = extractArgTypes($2);
  668 tgl                      8228 CBC       25346 :                     n->objfuncargs = $2;
 2397 peter_e                  8229           25346 :                     $$ = n;
 2397 peter_e                  8230 ECB             :                 }
                               8231                 :             /*
                               8232                 :              * Because of reduce/reduce conflicts, we can't use func_name
                               8233                 :              * below, but we can write it out the long way, which actually
                               8234                 :              * allows more cases.
                               8235                 :              */
                               8236                 :             | type_func_name_keyword
                               8237                 :                 {
 2222 peter_e                  8238 UIC           0 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
                               8239                 : 
                               8240               0 :                     n->objname = list_make1(makeString(pstrdup($1)));
                               8241               0 :                     n->args_unspecified = true;
                               8242               0 :                     $$ = n;
                               8243                 :                 }
                               8244                 :             | ColId
                               8245                 :                 {
 2222 peter_e                  8246 GIC         136 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
                               8247                 : 
                               8248             136 :                     n->objname = list_make1(makeString($1));
 2222 peter_e                  8249 CBC         136 :                     n->args_unspecified = true;
 2222 peter_e                  8250 GIC         136 :                     $$ = n;
 2222 peter_e                  8251 ECB             :                 }
                               8252                 :             | ColId indirection
                               8253                 :                 {
 2222 peter_e                  8254 CBC          14 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
  331 peter                    8255 ECB             : 
 2222 peter_e                  8256 CBC          14 :                     n->objname = check_func_name(lcons(makeString($1), $2),
 2222 peter_e                  8257 ECB             :                                                   yyscanner);
 2222 peter_e                  8258 CBC          14 :                     n->args_unspecified = true;
 2222 peter_e                  8259 GIC          14 :                     $$ = n;
                               8260                 :                 }
                               8261                 :         ;
                               8262                 : 
 5239 peter_e                  8263 ECB             : /*
                               8264                 :  * func_args_with_defaults is separate because we only want to accept
                               8265                 :  * defaults in CREATE FUNCTION, not in ALTER etc.
                               8266                 :  */
                               8267                 : func_args_with_defaults:
 5239 peter_e                  8268 CBC       33230 :         '(' func_args_with_defaults_list ')'        { $$ = $2; }
 5225 tgl                      8269            2200 :         | '(' ')'                                   { $$ = NIL; }
 5239 peter_e                  8270 ECB             :         ;
                               8271                 : 
                               8272                 : func_args_with_defaults_list:
 5225 tgl                      8273 CBC       33230 :         func_arg_with_default                       { $$ = list_make1($1); }
                               8274                 :         | func_args_with_defaults_list ',' func_arg_with_default
 5225 tgl                      8275 GIC       57608 :                                                     { $$ = lappend($1, $3); }
                               8276                 :         ;
                               8277                 : 
 6585 tgl                      8278 ECB             : /*
                               8279                 :  * The style with arg_class first is SQL99 standard, but Oracle puts
                               8280                 :  * param_name first; accept both since it's likely people will try both
                               8281                 :  * anyway.  Don't bother trying to save productions by letting arg_class
                               8282                 :  * have an empty alternative ... you'll get shift/reduce conflicts.
                               8283                 :  *
                               8284                 :  * We can catch over-specified arguments here if we want to,
 7033                          8285                 :  * but for now better to silently swallow typmod, etc.
                               8286                 :  * - thomas 2000-03-22
                               8287                 :  */
                               8288                 : func_arg:
                               8289                 :             arg_class param_name func_type
                               8290                 :                 {
 7033 tgl                      8291 GIC       20414 :                     FunctionParameter *n = makeNode(FunctionParameter);
  331 peter                    8292 ECB             : 
 7033 tgl                      8293 GIC       20414 :                     n->name = $2;
 7033 tgl                      8294 CBC       20414 :                     n->argType = $3;
 6585                          8295           20414 :                     n->mode = $1;
 5239 peter_e                  8296           20414 :                     n->defexpr = NULL;
 7033 tgl                      8297           20414 :                     $$ = n;
 7033 tgl                      8298 ECB             :                 }
 6585                          8299                 :             | param_name arg_class func_type
 7033                          8300                 :                 {
 7033 tgl                      8301 CBC         162 :                     FunctionParameter *n = makeNode(FunctionParameter);
                               8302                 : 
 6585 tgl                      8303 GIC         162 :                     n->name = $1;
                               8304             162 :                     n->argType = $3;
                               8305             162 :                     n->mode = $2;
 5239 peter_e                  8306 CBC         162 :                     n->defexpr = NULL;
 6585 tgl                      8307             162 :                     $$ = n;
                               8308                 :                 }
                               8309                 :             | param_name func_type
 6585 tgl                      8310 ECB             :                 {
 6585 tgl                      8311 CBC       30544 :                     FunctionParameter *n = makeNode(FunctionParameter);
                               8312                 : 
 6585 tgl                      8313 GIC       30544 :                     n->name = $1;
 7033                          8314           30544 :                     n->argType = $2;
  668 tgl                      8315 CBC       30544 :                     n->mode = FUNC_PARAM_DEFAULT;
 5239 peter_e                  8316           30544 :                     n->defexpr = NULL;
 7033 tgl                      8317 GIC       30544 :                     $$ = n;
                               8318                 :                 }
                               8319                 :             | arg_class func_type
 8304 lockhart                 8320 ECB             :                 {
 6585 tgl                      8321 GIC         416 :                     FunctionParameter *n = makeNode(FunctionParameter);
  331 peter                    8322 ECB             : 
 6585 tgl                      8323 GIC         416 :                     n->name = NULL;
                               8324             416 :                     n->argType = $2;
                               8325             416 :                     n->mode = $1;
 5239 peter_e                  8326             416 :                     n->defexpr = NULL;
 6585 tgl                      8327             416 :                     $$ = n;
 8304 lockhart                 8328 ECB             :                 }
                               8329                 :             | func_type
                               8330                 :                 {
 6585 tgl                      8331 CBC       64430 :                     FunctionParameter *n = makeNode(FunctionParameter);
  331 peter                    8332 ECB             : 
 6585 tgl                      8333 CBC       64430 :                     n->name = NULL;
 6585 tgl                      8334 GIC       64430 :                     n->argType = $1;
  668                          8335           64430 :                     n->mode = FUNC_PARAM_DEFAULT;
 5239 peter_e                  8336           64430 :                     n->defexpr = NULL;
 6585 tgl                      8337           64430 :                     $$ = n;
                               8338                 :                 }
                               8339                 :         ;
                               8340                 : 
                               8341                 : /* INOUT is SQL99 standard, IN OUT is for Oracle compatibility */
 5380 tgl                      8342 GBC        6618 : arg_class:  IN_P                                { $$ = FUNC_PARAM_IN; }
 5380 tgl                      8343 GIC       12992 :             | OUT_P                             { $$ = FUNC_PARAM_OUT; }
 5380 tgl                      8344 GBC          79 :             | INOUT                             { $$ = FUNC_PARAM_INOUT; }
 5380 tgl                      8345 UBC           0 :             | IN_P OUT_P                        { $$ = FUNC_PARAM_INOUT; }
 5380 tgl                      8346 GBC        1303 :             | VARIADIC                          { $$ = FUNC_PARAM_VARIADIC; }
                               8347                 :         ;
                               8348                 : 
                               8349                 : /*
 7033 tgl                      8350 ECB             :  * Ideally param_name should be ColId, but that causes too many conflicts.
                               8351                 :  */
 5944                          8352                 : param_name: type_function_name
 8304 lockhart                 8353                 :         ;
                               8354                 : 
                               8355                 : func_return:
                               8356                 :             func_type
                               8357                 :                 {
 6583 tgl                      8358                 :                     /* We can catch over-specified results here if we want to,
                               8359                 :                      * but for now better to silently swallow typmod, etc.
 8413 lockhart                 8360                 :                      * - thomas 2000-03-22
                               8361                 :                      */
 8413 lockhart                 8362 CBC       34962 :                     $$ = $1;
 8413 lockhart                 8363 ECB             :                 }
                               8364                 :         ;
                               8365                 : 
                               8366                 : /*
                               8367                 :  * We would like to make the %TYPE productions here be ColId attrs etc,
                               8368                 :  * but that causes reduce/reduce conflicts.  type_function_name
                               8369                 :  * is next best choice.
                               8370                 :  */
 7601 bruce                    8371 GIC      179535 : func_type:  Typename                                { $$ = $1; }
 5944 tgl                      8372 ECB             :             | type_function_name attrs '%' TYPE_P
 7979 bruce                    8373                 :                 {
 5944 tgl                      8374 GIC           9 :                     $$ = makeTypeNameFromNameList(lcons(makeString($1), $2));
 7681                          8375               9 :                     $$->pct_type = true;
 6235                          8376               9 :                     $$->location = @1;
 7979 bruce                    8377 ECB             :                 }
                               8378                 :             | SETOF type_function_name attrs '%' TYPE_P
 6277 tgl                      8379                 :                 {
 5944 tgl                      8380 GIC           3 :                     $$ = makeTypeNameFromNameList(lcons(makeString($2), $3));
 6277                          8381               3 :                     $$->pct_type = true;
 2062 peter_e                  8382               3 :                     $$->setof = true;
 6235 tgl                      8383               3 :                     $$->location = @2;
                               8384                 :                 }
                               8385                 :         ;
                               8386                 : 
                               8387                 : func_arg_with_default:
                               8388                 :         func_arg
                               8389                 :                 {
 4177 peter_e                  8390           73908 :                     $$ = $1;
                               8391                 :                 }
                               8392                 :         | func_arg DEFAULT a_expr
                               8393                 :                 {
                               8394           16832 :                     $$ = $1;
 4177 peter_e                  8395 CBC       16832 :                     $$->defexpr = $3;
                               8396                 :                 }
 5239 peter_e                  8397 ECB             :         | func_arg '=' a_expr
 4177                          8398                 :                 {
 4177 peter_e                  8399 CBC          98 :                     $$ = $1;
                               8400              98 :                     $$->defexpr = $3;
 4177 peter_e                  8401 ECB             :                 }
                               8402                 :         ;
                               8403                 : 
                               8404                 : /* Aggregate args can be most things that function args can be */
 3505 tgl                      8405                 : aggr_arg:   func_arg
                               8406                 :                 {
  668 tgl                      8407 CBC         446 :                     if (!($1->mode == FUNC_PARAM_DEFAULT ||
                               8408              30 :                           $1->mode == FUNC_PARAM_IN ||
 3505                          8409              30 :                           $1->mode == FUNC_PARAM_VARIADIC))
 3505 tgl                      8410 LBC           0 :                         ereport(ERROR,
 3505 tgl                      8411 ECB             :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                               8412                 :                                  errmsg("aggregates cannot have output arguments"),
                               8413                 :                                  parser_errposition(@1)));
 3505 tgl                      8414 GIC         446 :                     $$ = $1;
 3505 tgl                      8415 ECB             :                 }
                               8416                 :         ;
                               8417                 : 
 3394                          8418                 : /*
                               8419                 :  * The SQL standard offers no guidance on how to declare aggregate argument
                               8420                 :  * lists, since it doesn't have CREATE AGGREGATE etc.  We accept these cases:
                               8421                 :  *
                               8422                 :  * (*)                                  - normal agg with no args
                               8423                 :  * (aggr_arg,...)                       - normal agg with args
                               8424                 :  * (ORDER BY aggr_arg,...)              - ordered-set agg with no direct args
                               8425                 :  * (aggr_arg,... ORDER BY aggr_arg,...) - ordered-set agg with direct args
                               8426                 :  *
                               8427                 :  * The zero-argument case is spelled with '*' for consistency with COUNT(*).
                               8428                 :  *
                               8429                 :  * An additional restriction is that if the direct-args list ends in a
                               8430                 :  * VARIADIC item, the ordered-args list must contain exactly one item that
                               8431                 :  * is also VARIADIC with the same type.  This allows us to collapse the two
                               8432                 :  * VARIADIC items into one, which is necessary to represent the aggregate in
                               8433                 :  * pg_proc.  We check this at the grammar stage so that we can return a list
                               8434                 :  * in which the second VARIADIC item is already discarded, avoiding extra work
                               8435                 :  * in cases such as DROP AGGREGATE.
                               8436                 :  *
                               8437                 :  * The return value of this production is a two-element list, in which the
                               8438                 :  * first item is a sublist of FunctionParameter nodes (with any duplicate
  577 peter                    8439                 :  * VARIADIC item already dropped, as per above) and the second is an Integer
                               8440                 :  * node, containing -1 if there was no ORDER BY and otherwise the number
 3394 tgl                      8441                 :  * of argument declarations before the ORDER BY.  (If this number is equal
                               8442                 :  * to the first sublist's length, then we dropped a duplicate VARIADIC item.)
                               8443                 :  * This representation is passed as-is to CREATE AGGREGATE; for operations
                               8444                 :  * on existing aggregates, we can just apply extractArgTypes to the first
                               8445                 :  * sublist.
                               8446                 :  */
                               8447                 : aggr_args:  '(' '*' ')'
                               8448                 :                 {
 3394 tgl                      8449 GBC          68 :                     $$ = list_make2(NIL, makeInteger(-1));
 3394 tgl                      8450 ECB             :                 }
                               8451                 :             | '(' aggr_args_list ')'
                               8452                 :                 {
 3394 tgl                      8453 GIC         362 :                     $$ = list_make2($2, makeInteger(-1));
                               8454                 :                 }
                               8455                 :             | '(' ORDER BY aggr_args_list ')'
                               8456                 :                 {
                               8457               3 :                     $$ = list_make2($4, makeInteger(0));
                               8458                 :                 }
                               8459                 :             | '(' aggr_args_list ORDER BY aggr_args_list ')'
                               8460                 :                 {
                               8461                 :                     /* this is the only case requiring consistency checking */
                               8462              16 :                     $$ = makeOrderedSetArgs($2, $5, yyscanner);
                               8463                 :                 }
                               8464                 :         ;
                               8465                 : 
 3505 tgl                      8466 ECB             : aggr_args_list:
 3505 tgl                      8467 GIC         397 :             aggr_arg                                { $$ = list_make1($1); }
                               8468              49 :             | aggr_args_list ',' aggr_arg           { $$ = lappend($1, $3); }
                               8469                 :         ;
                               8470                 : 
                               8471                 : aggregate_with_argtypes:
                               8472                 :             func_name aggr_args
                               8473                 :                 {
 2293 peter_e                  8474             181 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
  331 peter                    8475 ECB             : 
 2293 peter_e                  8476 GIC         181 :                     n->objname = $1;
                               8477             181 :                     n->objargs = extractAggrArgTypes($2);
  668 tgl                      8478 CBC         181 :                     n->objfuncargs = (List *) linitial($2);
 2397 peter_e                  8479             181 :                     $$ = n;
 2397 peter_e                  8480 ECB             :                 }
                               8481                 :         ;
                               8482                 : 
                               8483                 : aggregate_with_argtypes_list:
 2293 peter_e                  8484 CBC          52 :             aggregate_with_argtypes                 { $$ = list_make1($1); }
 2293 peter_e                  8485 ECB             :             | aggregate_with_argtypes_list ',' aggregate_with_argtypes
 2293 peter_e                  8486 LBC           0 :                                                     { $$ = lappend($1, $3); }
 2293 peter_e                  8487 ECB             :         ;
                               8488                 : 
                               8489                 : opt_createfunc_opt_list:
                               8490                 :             createfunc_opt_list
  732 peter                    8491 GIC          19 :             | /*EMPTY*/ { $$ = NIL; }
                               8492                 :     ;
                               8493                 : 
 7601 bruce                    8494 ECB             : createfunc_opt_list:
                               8495                 :             /* Must be at least one to prevent conflict */
 4177 peter_e                  8496 GIC       35411 :             createfunc_opt_item                     { $$ = list_make1($1); }
 7600 bruce                    8497          115146 :             | createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); }
 7600 bruce                    8498 ECB             :     ;
 7632 peter_e                  8499                 : 
                               8500                 : /*
                               8501                 :  * Options common to both CREATE FUNCTION and ALTER FUNCTION
                               8502                 :  */
 6600 neilc                    8503                 : common_func_opt_item:
                               8504                 :             CALLED ON NULL_P INPUT_P
                               8505                 :                 {
  331 peter                    8506 GIC         318 :                     $$ = makeDefElem("strict", (Node *) makeBoolean(false), @1);
                               8507                 :                 }
                               8508                 :             | RETURNS NULL_P ON NULL_P INPUT_P
                               8509                 :                 {
                               8510            2736 :                     $$ = makeDefElem("strict", (Node *) makeBoolean(true), @1);
 6600 neilc                    8511 ECB             :                 }
                               8512                 :             | STRICT_P
                               8513                 :                 {
  331 peter                    8514 GBC       22354 :                     $$ = makeDefElem("strict", (Node *) makeBoolean(true), @1);
                               8515                 :                 }
                               8516                 :             | IMMUTABLE
                               8517                 :                 {
  331 peter                    8518 CBC       17682 :                     $$ = makeDefElem("volatility", (Node *) makeString("immutable"), @1);
                               8519                 :                 }
                               8520                 :             | STABLE
                               8521                 :                 {
  331 peter                    8522 GIC        7704 :                     $$ = makeDefElem("volatility", (Node *) makeString("stable"), @1);
                               8523                 :                 }
                               8524                 :             | VOLATILE
                               8525                 :                 {
                               8526            3427 :                     $$ = makeDefElem("volatility", (Node *) makeString("volatile"), @1);
                               8527                 :                 }
                               8528                 :             | EXTERNAL SECURITY DEFINER
                               8529                 :                 {
  331 peter                    8530 UIC           0 :                     $$ = makeDefElem("security", (Node *) makeBoolean(true), @1);
                               8531                 :                 }
                               8532                 :             | EXTERNAL SECURITY INVOKER
                               8533                 :                 {
                               8534               0 :                     $$ = makeDefElem("security", (Node *) makeBoolean(false), @1);
                               8535                 :                 }
                               8536                 :             | SECURITY DEFINER
                               8537                 :                 {
  331 peter                    8538 GIC          19 :                     $$ = makeDefElem("security", (Node *) makeBoolean(true), @1);
                               8539                 :                 }
                               8540                 :             | SECURITY INVOKER
                               8541                 :                 {
                               8542               6 :                     $$ = makeDefElem("security", (Node *) makeBoolean(false), @1);
                               8543                 :                 }
                               8544                 :             | LEAKPROOF
                               8545                 :                 {
                               8546              23 :                     $$ = makeDefElem("leakproof", (Node *) makeBoolean(true), @1);
                               8547                 :                 }
                               8548                 :             | NOT LEAKPROOF
                               8549                 :                 {
                               8550               6 :                     $$ = makeDefElem("leakproof", (Node *) makeBoolean(false), @1);
                               8551                 :                 }
                               8552                 :             | COST NumericOnly
 5921 tgl                      8553 ECB             :                 {
  331 peter                    8554 GIC       13654 :                     $$ = makeDefElem("cost", (Node *) $2, @1);
                               8555                 :                 }
                               8556                 :             | ROWS NumericOnly
 5921 tgl                      8557 ECB             :                 {
  331 peter                    8558 GIC        1519 :                     $$ = makeDefElem("rows", (Node *) $2, @1);
                               8559                 :                 }
                               8560                 :             | SUPPORT any_name
 1520 tgl                      8561 ECB             :                 {
  331 peter                    8562 GIC           9 :                     $$ = makeDefElem("support", (Node *) $2, @1);
                               8563                 :                 }
                               8564                 :             | FunctionSetResetClause
                               8565                 :                 {
 5697 tgl                      8566 ECB             :                     /* we abuse the normal content of a DefElem here */
  331 peter                    8567 GIC          53 :                     $$ = makeDefElem("set", (Node *) $1, @1);
                               8568                 :                 }
                               8569                 :             | PARALLEL ColId
                               8570                 :                 {
  331 peter                    8571 CBC       27504 :                     $$ = makeDefElem("parallel", (Node *) makeString($2), @1);
 2762 rhaas                    8572 ECB             :                 }
                               8573                 :         ;
                               8574                 : 
                               8575                 : createfunc_opt_item:
                               8576                 :             AS func_as
                               8577                 :                 {
  331 peter                    8578 CBC       18389 :                     $$ = makeDefElem("as", (Node *) $2, @1);
                               8579                 :                 }
 3598 tgl                      8580 ECB             :             | LANGUAGE NonReservedWord_or_Sconst
 6600 neilc                    8581                 :                 {
  331 peter                    8582 CBC       35402 :                     $$ = makeDefElem("language", (Node *) makeString($2), @1);
 6600 neilc                    8583 ECB             :                 }
                               8584                 :             | TRANSFORM transform_type_list
                               8585                 :                 {
  331 peter                    8586 GIC          58 :                     $$ = makeDefElem("transform", (Node *) $2, @1);
                               8587                 :                 }
 5212 tgl                      8588 ECB             :             | WINDOW
                               8589                 :                 {
  331 peter                    8590 GBC          10 :                     $$ = makeDefElem("window", (Node *) makeBoolean(true), @1);
                               8591                 :                 }
                               8592                 :             | common_func_opt_item
                               8593                 :                 {
 6600 neilc                    8594 GIC       96698 :                     $$ = $1;
 6600 neilc                    8595 ECB             :                 }
                               8596                 :         ;
                               8597                 : 
 6888 neilc                    8598 GIC       16780 : func_as:    Sconst                      { $$ = list_make1(makeString($1)); }
                               8599                 :             | Sconst ',' Sconst
 7600 bruce                    8600 ECB             :                 {
 6888 neilc                    8601 CBC        1609 :                     $$ = list_make2(makeString($1), makeString($3));
                               8602                 :                 }
                               8603                 :         ;
                               8604                 : 
                               8605                 : ReturnStmt: RETURN a_expr
                               8606                 :                 {
  732 peter                    8607 GIC       14888 :                     ReturnStmt *r = makeNode(ReturnStmt);
                               8608                 : 
                               8609           14888 :                     r->returnval = (Node *) $2;
  732 peter                    8610 CBC       14888 :                     $$ = (Node *) r;
                               8611                 :                 }
                               8612                 :         ;
                               8613                 : 
  732 peter                    8614 ECB             : opt_routine_body:
                               8615                 :             ReturnStmt
                               8616                 :                 {
  732 peter                    8617 GIC       14885 :                     $$ = $1;
  732 peter                    8618 ECB             :                 }
                               8619                 :             | BEGIN_P ATOMIC routine_body_stmt_list END_P
                               8620                 :                 {
                               8621                 :                     /*
                               8622                 :                      * A compound statement is stored as a single-item list
                               8623                 :                      * containing the list of statements as its member.  That
                               8624                 :                      * way, the parse analysis code can tell apart an empty
                               8625                 :                      * body from no body at all.
                               8626                 :                      */
  732 peter                    8627 GIC        2159 :                     $$ = (Node *) list_make1($3);
                               8628                 :                 }
                               8629                 :             | /*EMPTY*/
  732 peter                    8630 ECB             :                 {
  732 peter                    8631 GIC       18386 :                     $$ = NULL;
                               8632                 :                 }
                               8633                 :         ;
  732 peter                    8634 EUB             : 
                               8635                 : routine_body_stmt_list:
                               8636                 :             routine_body_stmt_list routine_body_stmt ';'
                               8637                 :                 {
  670 tgl                      8638                 :                     /* As in stmtmulti, discard empty statements */
  670 tgl                      8639 GIC        2167 :                     if ($2 != NULL)
                               8640            2158 :                         $$ = lappend($1, $2);
                               8641                 :                     else
  670 tgl                      8642 CBC           9 :                         $$ = $1;
                               8643                 :                 }
                               8644                 :             | /*EMPTY*/
                               8645                 :                 {
  732 peter                    8646            2159 :                     $$ = NIL;
                               8647                 :                 }
                               8648                 :         ;
                               8649                 : 
  732 peter                    8650 ECB             : routine_body_stmt:
                               8651                 :             stmt
                               8652                 :             | ReturnStmt
                               8653                 :         ;
                               8654                 : 
                               8655                 : transform_type_list:
 2905 peter_e                  8656 GIC          58 :             FOR TYPE_P Typename { $$ = list_make1($3); }
                               8657               2 :             | transform_type_list ',' FOR TYPE_P Typename { $$ = lappend($1, $5); }
 2905 peter_e                  8658 ECB             :         ;
                               8659                 : 
                               8660                 : opt_definition:
 7601 bruce                    8661 GIC         248 :             WITH definition                         { $$ = $2; }
 7601 bruce                    8662 CBC        4151 :             | /*EMPTY*/                             { $$ = NIL; }
                               8663                 :         ;
                               8664                 : 
                               8665                 : table_func_column:  param_name func_type
 5378 tgl                      8666 ECB             :                 {
 5378 tgl                      8667 GIC         176 :                     FunctionParameter *n = makeNode(FunctionParameter);
                               8668                 : 
                               8669             176 :                     n->name = $1;
                               8670             176 :                     n->argType = $2;
 5378 tgl                      8671 CBC         176 :                     n->mode = FUNC_PARAM_TABLE;
 5225 tgl                      8672 GIC         176 :                     n->defexpr = NULL;
 5378                          8673             176 :                     $$ = n;
                               8674                 :                 }
 5378 tgl                      8675 ECB             :         ;
                               8676                 : 
                               8677                 : table_func_column_list:
                               8678                 :             table_func_column
                               8679                 :                 {
 5378 tgl                      8680 GIC          88 :                     $$ = list_make1($1);
                               8681                 :                 }
 5378 tgl                      8682 ECB             :             | table_func_column_list ',' table_func_column
                               8683                 :                 {
 5378 tgl                      8684 GIC          88 :                     $$ = lappend($1, $3);
                               8685                 :                 }
 5378 tgl                      8686 ECB             :         ;
                               8687                 : 
                               8688                 : /*****************************************************************************
                               8689                 :  * ALTER FUNCTION / ALTER PROCEDURE / ALTER ROUTINE
 6600 neilc                    8690                 :  *
                               8691                 :  * RENAME and OWNER subcommands are already provided by the generic
                               8692                 :  * ALTER infrastructure, here we just specify alterations that can
                               8693                 :  * only be applied to functions.
                               8694                 :  *
                               8695                 :  *****************************************************************************/
                               8696                 : AlterFunctionStmt:
                               8697                 :             ALTER FUNCTION function_with_argtypes alterfunc_opt_list opt_restrict
                               8698                 :                 {
 6600 neilc                    8699 GIC         307 :                     AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
                               8700                 : 
 1956 peter_e                  8701             307 :                     n->objtype = OBJECT_FUNCTION;
 1956 peter_e                  8702 CBC         307 :                     n->func = $3;
 1956 peter_e                  8703 GIC         307 :                     n->actions = $4;
                               8704             307 :                     $$ = (Node *) n;
 1956 peter_e                  8705 ECB             :                 }
                               8706                 :             | ALTER PROCEDURE function_with_argtypes alterfunc_opt_list opt_restrict
                               8707                 :                 {
 1956 peter_e                  8708 GIC           9 :                     AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
                               8709                 : 
                               8710               9 :                     n->objtype = OBJECT_PROCEDURE;
 1956 peter_e                  8711 CBC           9 :                     n->func = $3;
 1956 peter_e                  8712 GIC           9 :                     n->actions = $4;
 1956 peter_e                  8713 CBC           9 :                     $$ = (Node *) n;
 1956 peter_e                  8714 ECB             :                 }
                               8715                 :             | ALTER ROUTINE function_with_argtypes alterfunc_opt_list opt_restrict
                               8716                 :                 {
 1956 peter_e                  8717 UIC           0 :                     AlterFunctionStmt *n = makeNode(AlterFunctionStmt);
                               8718                 : 
                               8719               0 :                     n->objtype = OBJECT_ROUTINE;
 6585 tgl                      8720               0 :                     n->func = $3;
 6600 neilc                    8721 LBC           0 :                     n->actions = $4;
 6600 neilc                    8722 UIC           0 :                     $$ = (Node *) n;
                               8723                 :                 }
                               8724                 :         ;
                               8725                 : 
                               8726                 : alterfunc_opt_list:
                               8727                 :             /* At least one option must be specified */
 6600 neilc                    8728 GIC         316 :             common_func_opt_item                    { $$ = list_make1($1); }
 6600 neilc                    8729 UIC           0 :             | alterfunc_opt_list common_func_opt_item { $$ = lappend($1, $2); }
                               8730                 :         ;
 6600 neilc                    8731 ECB             : 
                               8732                 : /* Ignored, merely for SQL compliance */
                               8733                 : opt_restrict:
                               8734                 :             RESTRICT
                               8735                 :             | /* EMPTY */
                               8736                 :         ;
                               8737                 : 
                               8738                 : 
                               8739                 : /*****************************************************************************
                               8740                 :  *
                               8741                 :  *      QUERY:
                               8742                 :  *
 7587 tgl                      8743                 :  *      DROP FUNCTION funcname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
 1956 peter_e                  8744                 :  *      DROP PROCEDURE procname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
                               8745                 :  *      DROP ROUTINE routname (arg1, arg2, ...) [ RESTRICT | CASCADE ]
 6203 tgl                      8746                 :  *      DROP AGGREGATE aggname (arg1, ...) [ RESTRICT | CASCADE ]
                               8747                 :  *      DROP OPERATOR opname (leftoperand_typ, rightoperand_typ) [ RESTRICT | CASCADE ]
                               8748                 :  *
                               8749                 :  *****************************************************************************/
 9770 scrappy                  8750                 : 
                               8751                 : RemoveFuncStmt:
                               8752                 :             DROP FUNCTION function_with_argtypes_list opt_drop_behavior
                               8753                 :                 {
 4161 rhaas                    8754 GIC        1475 :                     DropStmt *n = makeNode(DropStmt);
                               8755                 : 
                               8756            1475 :                     n->removeType = OBJECT_FUNCTION;
 2293 peter_e                  8757            1475 :                     n->objects = $3;
 2397                          8758            1475 :                     n->behavior = $4;
 6141 andrew                   8759            1475 :                     n->missing_ok = false;
 4020 simon                    8760 CBC        1475 :                     n->concurrent = false;
  331 peter                    8761            1475 :                     $$ = (Node *) n;
                               8762                 :                 }
                               8763                 :             | DROP FUNCTION IF_P EXISTS function_with_argtypes_list opt_drop_behavior
                               8764                 :                 {
 4161 rhaas                    8765             130 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    8766 ECB             : 
 4161 rhaas                    8767 GIC         130 :                     n->removeType = OBJECT_FUNCTION;
 2293 peter_e                  8768             130 :                     n->objects = $5;
 2397                          8769             130 :                     n->behavior = $6;
 6141 andrew                   8770             130 :                     n->missing_ok = true;
 4020 simon                    8771 CBC         130 :                     n->concurrent = false;
  331 peter                    8772 GIC         130 :                     $$ = (Node *) n;
 7596 lockhart                 8773 ECB             :                 }
  668 tgl                      8774                 :             | DROP PROCEDURE function_with_argtypes_list opt_drop_behavior
 1956 peter_e                  8775                 :                 {
 1956 peter_e                  8776 CBC          69 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    8777 ECB             : 
 1956 peter_e                  8778 GIC          69 :                     n->removeType = OBJECT_PROCEDURE;
                               8779              69 :                     n->objects = $3;
                               8780              69 :                     n->behavior = $4;
                               8781              69 :                     n->missing_ok = false;
                               8782              69 :                     n->concurrent = false;
  331 peter                    8783              69 :                     $$ = (Node *) n;
 1956 peter_e                  8784 ECB             :                 }
                               8785                 :             | DROP PROCEDURE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
                               8786                 :                 {
 1956 peter_e                  8787 GIC           3 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    8788 ECB             : 
 1956 peter_e                  8789 GIC           3 :                     n->removeType = OBJECT_PROCEDURE;
                               8790               3 :                     n->objects = $5;
                               8791               3 :                     n->behavior = $6;
                               8792               3 :                     n->missing_ok = true;
                               8793               3 :                     n->concurrent = false;
  331 peter                    8794               3 :                     $$ = (Node *) n;
                               8795                 :                 }
                               8796                 :             | DROP ROUTINE function_with_argtypes_list opt_drop_behavior
                               8797                 :                 {
 1956 peter_e                  8798               6 :                     DropStmt *n = makeNode(DropStmt);
                               8799                 : 
                               8800               6 :                     n->removeType = OBJECT_ROUTINE;
                               8801               6 :                     n->objects = $3;
                               8802               6 :                     n->behavior = $4;
 1956 peter_e                  8803 CBC           6 :                     n->missing_ok = false;
 1956 peter_e                  8804 GIC           6 :                     n->concurrent = false;
  331 peter                    8805 CBC           6 :                     $$ = (Node *) n;
 1956 peter_e                  8806 ECB             :                 }
  668 tgl                      8807                 :             | DROP ROUTINE IF_P EXISTS function_with_argtypes_list opt_drop_behavior
 1956 peter_e                  8808                 :                 {
 1956 peter_e                  8809 GIC           3 :                     DropStmt *n = makeNode(DropStmt);
                               8810                 : 
                               8811               3 :                     n->removeType = OBJECT_ROUTINE;
 1956 peter_e                  8812 CBC           3 :                     n->objects = $5;
 1956 peter_e                  8813 GIC           3 :                     n->behavior = $6;
 1956 peter_e                  8814 CBC           3 :                     n->missing_ok = true;
                               8815               3 :                     n->concurrent = false;
  331 peter                    8816               3 :                     $$ = (Node *) n;
 1956 peter_e                  8817 ECB             :                 }
                               8818                 :         ;
                               8819                 : 
                               8820                 : RemoveAggrStmt:
 2293 peter_e                  8821 EUB             :             DROP AGGREGATE aggregate_with_argtypes_list opt_drop_behavior
                               8822                 :                 {
 4161 rhaas                    8823 GBC          37 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    8824 EUB             : 
 4161 rhaas                    8825 GBC          37 :                     n->removeType = OBJECT_AGGREGATE;
 2293 peter_e                  8826              37 :                     n->objects = $3;
 2397 peter_e                  8827 GIC          37 :                     n->behavior = $4;
 6141 andrew                   8828              37 :                     n->missing_ok = false;
 4020 simon                    8829              37 :                     n->concurrent = false;
  331 peter                    8830              37 :                     $$ = (Node *) n;
                               8831                 :                 }
 2293 peter_e                  8832 ECB             :             | DROP AGGREGATE IF_P EXISTS aggregate_with_argtypes_list opt_drop_behavior
 6141 andrew                   8833 EUB             :                 {
 4161 rhaas                    8834 GIC          15 :                     DropStmt *n = makeNode(DropStmt);
                               8835                 : 
                               8836              15 :                     n->removeType = OBJECT_AGGREGATE;
 2293 peter_e                  8837              15 :                     n->objects = $5;
 2397                          8838              15 :                     n->behavior = $6;
 6141 andrew                   8839              15 :                     n->missing_ok = true;
 4020 simon                    8840              15 :                     n->concurrent = false;
  331 peter                    8841              15 :                     $$ = (Node *) n;
                               8842                 :                 }
                               8843                 :         ;
                               8844                 : 
                               8845                 : RemoveOperStmt:
                               8846                 :             DROP OPERATOR operator_with_argtypes_list opt_drop_behavior
                               8847                 :                 {
 4161 rhaas                    8848              82 :                     DropStmt *n = makeNode(DropStmt);
                               8849                 : 
                               8850              82 :                     n->removeType = OBJECT_OPERATOR;
 2293 peter_e                  8851              82 :                     n->objects = $3;
                               8852              82 :                     n->behavior = $4;
 6141 andrew                   8853              82 :                     n->missing_ok = false;
 4020 simon                    8854              82 :                     n->concurrent = false;
  331 peter                    8855              82 :                     $$ = (Node *) n;
                               8856                 :                 }
                               8857                 :             | DROP OPERATOR IF_P EXISTS operator_with_argtypes_list opt_drop_behavior
 6141 andrew                   8858 ECB             :                 {
 4161 rhaas                    8859 GIC          15 :                     DropStmt *n = makeNode(DropStmt);
  331 peter                    8860 ECB             : 
 4161 rhaas                    8861 CBC          15 :                     n->removeType = OBJECT_OPERATOR;
 2293 peter_e                  8862              15 :                     n->objects = $5;
                               8863              15 :                     n->behavior = $6;
 6141 andrew                   8864              15 :                     n->missing_ok = true;
 4020 simon                    8865              15 :                     n->concurrent = false;
  331 peter                    8866 GIC          15 :                     $$ = (Node *) n;
                               8867                 :                 }
                               8868                 :         ;
 9770 scrappy                  8869 ECB             : 
                               8870                 : oper_argtypes:
 5333 tgl                      8871                 :             '(' Typename ')'
 9344 bruce                    8872                 :                 {
 7204 tgl                      8873 CBC           6 :                    ereport(ERROR,
 7204 tgl                      8874 ECB             :                            (errcode(ERRCODE_SYNTAX_ERROR),
 7146                          8875                 :                             errmsg("missing argument"),
 5333                          8876                 :                             errhint("Use NONE to denote the missing argument of a unary operator."),
                               8877                 :                             parser_errposition(@3)));
                               8878                 :                 }
                               8879                 :             | '(' Typename ',' Typename ')'
 5333 tgl                      8880 CBC         876 :                     { $$ = list_make2($2, $4); }
                               8881                 :             | '(' NONE ',' Typename ')'                 /* left unary */
                               8882              16 :                     { $$ = list_make2(NULL, $4); }
 5333 tgl                      8883 ECB             :             | '(' Typename ',' NONE ')'                 /* right unary */
 5333 tgl                      8884 CBC           6 :                     { $$ = list_make2($2, NULL); }
 9344 bruce                    8885 ECB             :         ;
 9770 scrappy                  8886                 : 
 7601 bruce                    8887                 : any_operator:
                               8888                 :             all_Op
 6888 neilc                    8889 GIC        8920 :                     { $$ = list_make1(makeString($1)); }
                               8890                 :             | ColId '.' any_operator
 7600 bruce                    8891 CBC        6709 :                     { $$ = lcons(makeString($1), $3); }
                               8892                 :         ;
 7663 tgl                      8893 ECB             : 
 2293 peter_e                  8894                 : operator_with_argtypes_list:
 2293 peter_e                  8895 CBC          97 :             operator_with_argtypes                  { $$ = list_make1($1); }
 2293 peter_e                  8896 ECB             :             | operator_with_argtypes_list ',' operator_with_argtypes
 2293 peter_e                  8897 LBC           0 :                                                     { $$ = lappend($1, $3); }
 2293 peter_e                  8898 ECB             :         ;
                               8899                 : 
                               8900                 : operator_with_argtypes:
                               8901                 :             any_operator oper_argtypes
                               8902                 :                 {
 2293 peter_e                  8903 GIC         898 :                     ObjectWithArgs *n = makeNode(ObjectWithArgs);
  331 peter                    8904 ECB             : 
 2293 peter_e                  8905 CBC         898 :                     n->objname = $1;
                               8906             898 :                     n->objargs = $2;
                               8907             898 :                     $$ = n;
 2293 peter_e                  8908 ECB             :                 }
                               8909                 :         ;
                               8910                 : 
                               8911                 : /*****************************************************************************
                               8912                 :  *
 4947 tgl                      8913                 :  *      DO <anonymous code block> [ LANGUAGE language ]
                               8914                 :  *
                               8915                 :  * We use a DefElem list for future extensibility, and to allow flexibility
                               8916                 :  * in the clause order.
                               8917                 :  *
                               8918                 :  *****************************************************************************/
                               8919                 : 
                               8920                 : DoStmt: DO dostmt_opt_list
                               8921                 :                 {
 4947 tgl                      8922 GIC         507 :                     DoStmt *n = makeNode(DoStmt);
                               8923                 : 
                               8924             507 :                     n->args = $2;
  331 peter                    8925             507 :                     $$ = (Node *) n;
                               8926                 :                 }
 4947 tgl                      8927 ECB             :         ;
                               8928                 : 
                               8929                 : dostmt_opt_list:
 4947 tgl                      8930 CBC         507 :             dostmt_opt_item                     { $$ = list_make1($1); }
                               8931              95 :             | dostmt_opt_list dostmt_opt_item   { $$ = lappend($1, $2); }
 4947 tgl                      8932 ECB             :         ;
                               8933                 : 
                               8934                 : dostmt_opt_item:
                               8935                 :             Sconst
                               8936                 :                 {
  331 peter                    8937 GIC         507 :                     $$ = makeDefElem("as", (Node *) makeString($1), @1);
 4947 tgl                      8938 ECB             :                 }
                               8939                 :             | LANGUAGE NonReservedWord_or_Sconst
                               8940                 :                 {
  331 peter                    8941 CBC          95 :                     $$ = makeDefElem("language", (Node *) makeString($2), @1);
 4947 tgl                      8942 ECB             :                 }
                               8943                 :         ;
 9297 lockhart                 8944                 : 
 7570 peter_e                  8945                 : /*****************************************************************************
                               8946                 :  *
                               8947                 :  *      CREATE CAST / DROP CAST
                               8948                 :  *
                               8949                 :  *****************************************************************************/
                               8950                 : 
                               8951                 : CreateCastStmt: CREATE CAST '(' Typename AS Typename ')'
 7508 tgl                      8952                 :                     WITH FUNCTION function_with_argtypes cast_context
                               8953                 :                 {
 7570 peter_e                  8954 CBC          51 :                     CreateCastStmt *n = makeNode(CreateCastStmt);
  331 peter                    8955 ECB             : 
 7570 peter_e                  8956 CBC          51 :                     n->sourcetype = $4;
                               8957              51 :                     n->targettype = $6;
 6585 tgl                      8958              51 :                     n->func = $10;
 7508                          8959              51 :                     n->context = (CoercionContext) $11;
 5273 heikki.linnakangas       8960 GIC          51 :                     n->inout = false;
  331 peter                    8961              51 :                     $$ = (Node *) n;
                               8962                 :                 }
 7368 tgl                      8963 ECB             :             | CREATE CAST '(' Typename AS Typename ')'
                               8964                 :                     WITHOUT FUNCTION cast_context
 7570 peter_e                  8965                 :                 {
 7570 peter_e                  8966 CBC          81 :                     CreateCastStmt *n = makeNode(CreateCastStmt);
  331 peter                    8967 ECB             : 
 7570 peter_e                  8968 CBC          81 :                     n->sourcetype = $4;
                               8969              81 :                     n->targettype = $6;
                               8970              81 :                     n->func = NULL;
 7508 tgl                      8971 GIC          81 :                     n->context = (CoercionContext) $10;
 5273 heikki.linnakangas       8972              81 :                     n->inout = false;
  331 peter                    8973              81 :                     $$ = (Node *) n;
                               8974                 :                 }
                               8975                 :             | CREATE CAST '(' Typename AS Typename ')'
                               8976                 :                     WITH INOUT cast_context
 5273 heikki.linnakangas       8977 ECB             :                 {
 5273 heikki.linnakangas       8978 GIC           3 :                     CreateCastStmt *n = makeNode(CreateCastStmt);
                               8979                 : 
                               8980               3 :                     n->sourcetype = $4;
                               8981               3 :                     n->targettype = $6;
                               8982               3 :                     n->func = NULL;
                               8983               3 :                     n->context = (CoercionContext) $10;
 5273 heikki.linnakangas       8984 CBC           3 :                     n->inout = true;
  331 peter                    8985 GIC           3 :                     $$ = (Node *) n;
 7570 peter_e                  8986 ECB             :                 }
                               8987                 :         ;
                               8988                 : 
 7508 tgl                      8989 GIC          15 : cast_context:  AS IMPLICIT_P                    { $$ = COERCION_IMPLICIT; }
                               8990              29 :         | AS ASSIGNMENT                         { $$ = COERCION_ASSIGNMENT; }
                               8991              91 :         | /*EMPTY*/                             { $$ = COERCION_EXPLICIT; }
                               8992                 :         ;
 7570 peter_e                  8993 ECB             : 
                               8994                 : 
 6141 andrew                   8995                 : DropCastStmt: DROP CAST opt_if_exists '(' Typename AS Typename ')' opt_drop_behavior
                               8996                 :                 {
 4161 rhaas                    8997 GIC          27 :                     DropStmt *n = makeNode(DropStmt);
                               8998                 : 
 4161 rhaas                    8999 CBC          27 :                     n->removeType = OBJECT_CAST;
 2339 peter_e                  9000 GIC          27 :                     n->objects = list_make1(list_make2($5, $7));
 6141 andrew                   9001 GBC          27 :                     n->behavior = $9;
 6141 tgl                      9002 GIC          27 :                     n->missing_ok = $3;
 4020 simon                    9003              27 :                     n->concurrent = false;
  331 peter                    9004              27 :                     $$ = (Node *) n;
                               9005                 :                 }
                               9006                 :         ;
 7570 peter_e                  9007 ECB             : 
 2062 peter_e                  9008 GIC          18 : opt_if_exists: IF_P EXISTS                      { $$ = true; }
 2062 peter_e                  9009 CBC          16 :         | /*EMPTY*/                             { $$ = false; }
 6141 tgl                      9010 ECB             :         ;
 7570 peter_e                  9011                 : 
                               9012                 : 
                               9013                 : /*****************************************************************************
                               9014                 :  *
                               9015                 :  *      CREATE TRANSFORM / DROP TRANSFORM
                               9016                 :  *
                               9017                 :  *****************************************************************************/
                               9018                 : 
                               9019                 : CreateTransformStmt: CREATE opt_or_replace TRANSFORM FOR Typename LANGUAGE name '(' transform_element_list ')'
                               9020                 :                 {
 2905 peter_e                  9021 GIC          25 :                     CreateTransformStmt *n = makeNode(CreateTransformStmt);
                               9022                 : 
                               9023              25 :                     n->replace = $2;
                               9024              25 :                     n->type_name = $5;
                               9025              25 :                     n->lang = $7;
 2905 peter_e                  9026 CBC          25 :                     n->fromsql = linitial($9);
 2905 peter_e                  9027 GIC          25 :                     n->tosql = lsecond($9);
  331 peter                    9028 CBC          25 :                     $$ = (Node *) n;
 2905 peter_e                  9029 ECB             :                 }
                               9030                 :         ;
                               9031                 : 
                               9032                 : transform_element_list: FROM SQL_P WITH FUNCTION function_with_argtypes ',' TO SQL_P WITH FUNCTION function_with_argtypes
                               9033                 :                 {
 2905 peter_e                  9034 CBC          22 :                     $$ = list_make2($5, $11);
 2905 peter_e                  9035 ECB             :                 }
                               9036                 :                 | TO SQL_P WITH FUNCTION function_with_argtypes ',' FROM SQL_P WITH FUNCTION function_with_argtypes
                               9037                 :                 {
 2905 peter_e                  9038 UIC           0 :                     $$ = list_make2($11, $5);
                               9039                 :                 }
                               9040                 :                 | FROM SQL_P WITH FUNCTION function_with_argtypes
 2905 peter_e                  9041 ECB             :                 {
 2905 peter_e                  9042 GIC           2 :                     $$ = list_make2($5, NULL);
                               9043                 :                 }
                               9044                 :                 | TO SQL_P WITH FUNCTION function_with_argtypes
 2905 peter_e                  9045 ECB             :                 {
 2905 peter_e                  9046 GIC           1 :                     $$ = list_make2(NULL, $5);
                               9047                 :                 }
                               9048                 :         ;
                               9049                 : 
                               9050                 : 
                               9051                 : DropTransformStmt: DROP TRANSFORM opt_if_exists FOR Typename LANGUAGE name opt_drop_behavior
                               9052                 :                 {
                               9053               7 :                     DropStmt *n = makeNode(DropStmt);
                               9054                 : 
                               9055               7 :                     n->removeType = OBJECT_TRANSFORM;
 2339                          9056               7 :                     n->objects = list_make1(list_make2($5, makeString($7)));
 2905                          9057               7 :                     n->behavior = $8;
 2905 peter_e                  9058 CBC           7 :                     n->missing_ok = $3;
  331 peter                    9059 GIC           7 :                     $$ = (Node *) n;
 2905 peter_e                  9060 ECB             :                 }
                               9061                 :         ;
                               9062                 : 
                               9063                 : 
 8451 inoue                    9064                 : /*****************************************************************************
                               9065                 :  *
                               9066                 :  *      QUERY:
                               9067                 :  *
                               9068                 :  *      REINDEX [ (options) ] {INDEX | TABLE | SCHEMA} [CONCURRENTLY] <name>
                               9069                 :  *      REINDEX [ (options) ] {DATABASE | SYSTEM} [CONCURRENTLY] [<name>]
                               9070                 :  *****************************************************************************/
                               9071                 : 
                               9072                 : ReindexStmt:
                               9073                 :             REINDEX opt_reindex_option_list reindex_target_relation opt_concurrently qualified_name
                               9074                 :                 {
 8451 inoue                    9075 CBC         373 :                     ReindexStmt *n = makeNode(ReindexStmt);
  331 peter                    9076 ECB             : 
  261 alvherre                 9077 GNC         373 :                     n->kind = $3;
                               9078             373 :                     n->relation = $5;
 7689 tgl                      9079 GIC         373 :                     n->name = NULL;
  261 alvherre                 9080 GNC         373 :                     n->params = $2;
                               9081             373 :                     if ($4)
  857 michael                  9082 GIC         218 :                         n->params = lappend(n->params,
  261 alvherre                 9083 GNC         218 :                                             makeDefElem("concurrently", NULL, @4));
  331 peter                    9084 GIC         373 :                     $$ = (Node *) n;
 6500 tgl                      9085 ECB             :                 }
                               9086                 :             | REINDEX opt_reindex_option_list SCHEMA opt_concurrently name
 3043 simon                    9087                 :                 {
 3043 simon                    9088 CBC          37 :                     ReindexStmt *n = makeNode(ReindexStmt);
  331 peter                    9089 ECB             : 
  261 alvherre                 9090 GNC          37 :                     n->kind = REINDEX_OBJECT_SCHEMA;
 3043 simon                    9091 GIC          37 :                     n->relation = NULL;
  257 michael                  9092 GNC          37 :                     n->name = $5;
  261 alvherre                 9093              37 :                     n->params = $2;
                               9094              37 :                     if ($4)
  857 michael                  9095 CBC          11 :                         n->params = lappend(n->params,
  261 alvherre                 9096 GNC          11 :                                             makeDefElem("concurrently", NULL, @4));
  331 peter                    9097 GIC          37 :                     $$ = (Node *) n;
                               9098                 :                 }
                               9099                 :             | REINDEX opt_reindex_option_list reindex_target_all opt_concurrently opt_single_name
                               9100                 :                 {
 7689 tgl                      9101              27 :                     ReindexStmt *n = makeNode(ReindexStmt);
  257 michael                  9102 ECB             : 
  257 michael                  9103 GNC          27 :                     n->kind = $3;
 7689 tgl                      9104 GIC          27 :                     n->relation = NULL;
  257 michael                  9105 GNC          27 :                     n->name = $5;
  261 alvherre                 9106              27 :                     n->params = $2;
  257 michael                  9107              27 :                     if ($4)
  257 michael                  9108 GIC           5 :                         n->params = lappend(n->params,
  257 michael                  9109 GNC           5 :                                             makeDefElem("concurrently", NULL, @4));
  331 peter                    9110 GIC          27 :                     $$ = (Node *) n;
                               9111                 :                 }
                               9112                 :         ;
                               9113                 : reindex_target_relation:
 2886 fujii                    9114             160 :             INDEX                   { $$ = REINDEX_OBJECT_INDEX; }
 2886 fujii                    9115 CBC         213 :             | TABLE                 { $$ = REINDEX_OBJECT_TABLE; }
 2886 fujii                    9116 ECB             :         ;
                               9117                 : reindex_target_all:
  257 michael                  9118 GNC          12 :             SYSTEM_P                { $$ = REINDEX_OBJECT_SYSTEM; }
  257 michael                  9119 CBC          15 :             | DATABASE              { $$ = REINDEX_OBJECT_DATABASE; }
                               9120                 :         ;
                               9121                 : opt_reindex_option_list:
  261 alvherre                 9122 GNC          78 :             '(' utility_option_list ')'             { $$ = $2; }
                               9123             359 :             | /* EMPTY */                           { $$ = NULL; }
                               9124                 :         ;
                               9125                 : 
                               9126                 : /*****************************************************************************
                               9127                 :  *
                               9128                 :  * ALTER TABLESPACE
 3283 sfrost                   9129 ECB             :  *
                               9130                 :  *****************************************************************************/
                               9131                 : 
                               9132                 : AlterTblSpcStmt:
 3153 sfrost                   9133 EUB             :             ALTER TABLESPACE name SET reloptions
                               9134                 :                 {
 3283 sfrost                   9135 GIC           6 :                     AlterTableSpaceOptionsStmt *n =
                               9136               6 :                         makeNode(AlterTableSpaceOptionsStmt);
  331 peter                    9137 ECB             : 
 3283 sfrost                   9138 GIC           6 :                     n->tablespacename = $3;
                               9139               6 :                     n->options = $5;
 2062 peter_e                  9140               6 :                     n->isReset = false;
  331 peter                    9141 CBC           6 :                     $$ = (Node *) n;
                               9142                 :                 }
                               9143                 :             | ALTER TABLESPACE name RESET reloptions
                               9144                 :                 {
 3283 sfrost                   9145 GIC           6 :                     AlterTableSpaceOptionsStmt *n =
                               9146               6 :                         makeNode(AlterTableSpaceOptionsStmt);
                               9147                 : 
 3283 sfrost                   9148 CBC           6 :                     n->tablespacename = $3;
 3283 sfrost                   9149 GIC           6 :                     n->options = $5;
 2062 peter_e                  9150 CBC           6 :                     n->isReset = true;
  331 peter                    9151               6 :                     $$ = (Node *) n;
 3283 sfrost                   9152 ECB             :                 }
                               9153                 :         ;
                               9154                 : 
                               9155                 : /*****************************************************************************
                               9156                 :  *
                               9157                 :  * ALTER THING name RENAME TO newname
                               9158                 :  *
                               9159                 :  *****************************************************************************/
                               9160                 : 
                               9161                 : RenameStmt: ALTER AGGREGATE aggregate_with_argtypes RENAME TO name
                               9162                 :                 {
 7226 peter_e                  9163 GIC          21 :                     RenameStmt *n = makeNode(RenameStmt);
                               9164                 : 
                               9165              21 :                     n->renameType = OBJECT_AGGREGATE;
 2339                          9166              21 :                     n->object = (Node *) $3;
 2397                          9167              21 :                     n->newname = $6;
 4094 simon                    9168              21 :                     n->missing_ok = false;
  331 peter                    9169              21 :                     $$ = (Node *) n;
 7226 peter_e                  9170 ECB             :                 }
                               9171                 :             | ALTER COLLATION any_name RENAME TO name
 4439                          9172                 :                 {
 4439 peter_e                  9173 CBC          18 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9174 ECB             : 
 4439 peter_e                  9175 CBC          18 :                     n->renameType = OBJECT_COLLATION;
 2339                          9176              18 :                     n->object = (Node *) $3;
 4439                          9177              18 :                     n->newname = $6;
 4094 simon                    9178              18 :                     n->missing_ok = false;
  331 peter                    9179              18 :                     $$ = (Node *) n;
                               9180                 :                 }
                               9181                 :             | ALTER CONVERSION_P any_name RENAME TO name
                               9182                 :                 {
 7226 peter_e                  9183              12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9184                 : 
                               9185              12 :                     n->renameType = OBJECT_CONVERSION;
 2339                          9186              12 :                     n->object = (Node *) $3;
 7226                          9187              12 :                     n->newname = $6;
 4094 simon                    9188              12 :                     n->missing_ok = false;
  331 peter                    9189              12 :                     $$ = (Node *) n;
 7226 peter_e                  9190 ECB             :                 }
 1033 peter                    9191                 :             | ALTER DATABASE name RENAME TO name
 7226 peter_e                  9192                 :                 {
 7226 peter_e                  9193 UIC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9194                 : 
                               9195               0 :                     n->renameType = OBJECT_DATABASE;
 7226 peter_e                  9196 LBC           0 :                     n->subname = $3;
 7226 peter_e                  9197 UIC           0 :                     n->newname = $6;
 4094 simon                    9198 LBC           0 :                     n->missing_ok = false;
  331 peter                    9199               0 :                     $$ = (Node *) n;
 7226 peter_e                  9200 ECB             :                 }
 4126                          9201                 :             | ALTER DOMAIN_P any_name RENAME TO name
                               9202                 :                 {
 4126 peter_e                  9203 CBC           3 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9204 ECB             : 
 4126 peter_e                  9205 CBC           3 :                     n->renameType = OBJECT_DOMAIN;
 2339 peter_e                  9206 GIC           3 :                     n->object = (Node *) $3;
 4126                          9207               3 :                     n->newname = $6;
 4094 simon                    9208               3 :                     n->missing_ok = false;
  331 peter                    9209 CBC           3 :                     $$ = (Node *) n;
 4126 peter_e                  9210 ECB             :                 }
                               9211                 :             | ALTER DOMAIN_P any_name RENAME CONSTRAINT name TO name
                               9212                 :                 {
 4023 peter_e                  9213 CBC           3 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9214 ECB             : 
 3029 alvherre                 9215 GIC           3 :                     n->renameType = OBJECT_DOMCONSTRAINT;
 2339 peter_e                  9216               3 :                     n->object = (Node *) $3;
 4023 peter_e                  9217 CBC           3 :                     n->subname = $6;
                               9218               3 :                     n->newname = $8;
  331 peter                    9219 GIC           3 :                     $$ = (Node *) n;
                               9220                 :                 }
                               9221                 :             | ALTER FOREIGN DATA_P WRAPPER name RENAME TO name
                               9222                 :                 {
 4139 peter_e                  9223              12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9224                 : 
                               9225              12 :                     n->renameType = OBJECT_FDW;
 2339                          9226              12 :                     n->object = (Node *) makeString($5);
 4139                          9227              12 :                     n->newname = $8;
 4094 simon                    9228              12 :                     n->missing_ok = false;
  331 peter                    9229              12 :                     $$ = (Node *) n;
 4139 peter_e                  9230 ECB             :                 }
 5697 tgl                      9231                 :             | ALTER FUNCTION function_with_argtypes RENAME TO name
                               9232                 :                 {
 7226 peter_e                  9233 CBC          12 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9234 ECB             : 
 7226 peter_e                  9235 CBC          12 :                     n->renameType = OBJECT_FUNCTION;
 2339                          9236              12 :                     n->object = (Node *) $3;
 5697 tgl                      9237 GIC          12 :                     n->newname = $6;
 4094 simon                    9238              12 :                     n->missing_ok = false;
  331 peter                    9239              12 :                     $$ = (Node *) n;
 7226 peter_e                  9240 ECB             :                 }
 6494 tgl                      9241                 :             | ALTER GROUP_P RoleId RENAME TO RoleId
                               9242                 :                 {
 7226 peter_e                  9243 LBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9244 ECB             : 
 6494 tgl                      9245 LBC           0 :                     n->renameType = OBJECT_ROLE;
 7226 peter_e                  9246               0 :                     n->subname = $3;
 7226 peter_e                  9247 UIC           0 :                     n->newname = $6;
 4094 simon                    9248               0 :                     n->missing_ok = false;
  331 peter                    9249               0 :                     $$ = (Node *) n;
                               9250                 :                 }
                               9251                 :             | ALTER opt_procedural LANGUAGE name RENAME TO name
                               9252                 :                 {
 7226 peter_e                  9253 GIC           9 :                     RenameStmt *n = makeNode(RenameStmt);
                               9254                 : 
                               9255               9 :                     n->renameType = OBJECT_LANGUAGE;
 2339                          9256               9 :                     n->object = (Node *) makeString($4);
 5858 tgl                      9257               9 :                     n->newname = $7;
 4094 simon                    9258 CBC           9 :                     n->missing_ok = false;
  331 peter                    9259 GIC           9 :                     $$ = (Node *) n;
 7226 peter_e                  9260 ECB             :                 }
 1033 peter                    9261                 :             | ALTER OPERATOR CLASS any_name USING name RENAME TO name
 7226 peter_e                  9262                 :                 {
 7226 peter_e                  9263 CBC          12 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9264 ECB             : 
 7226 peter_e                  9265 GIC          12 :                     n->renameType = OBJECT_OPCLASS;
 2339                          9266              12 :                     n->object = (Node *) lcons(makeString($6), $4);
 7226                          9267              12 :                     n->newname = $9;
 4094 simon                    9268 CBC          12 :                     n->missing_ok = false;
  331 peter                    9269 GIC          12 :                     $$ = (Node *) n;
 7226 peter_e                  9270 ECB             :                 }
 1033 peter                    9271                 :             | ALTER OPERATOR FAMILY any_name USING name RENAME TO name
 5920 tgl                      9272                 :                 {
 5920 tgl                      9273 CBC          12 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9274 ECB             : 
 5920 tgl                      9275 GIC          12 :                     n->renameType = OBJECT_OPFAMILY;
 2339 peter_e                  9276              12 :                     n->object = (Node *) lcons(makeString($6), $4);
 5920 tgl                      9277              12 :                     n->newname = $9;
 4094 simon                    9278 CBC          12 :                     n->missing_ok = false;
  331 peter                    9279 GIC          12 :                     $$ = (Node *) n;
 5920 tgl                      9280 ECB             :                 }
 3124 sfrost                   9281                 :             | ALTER POLICY name ON qualified_name RENAME TO name
                               9282                 :                 {
 3124 sfrost                   9283 CBC           9 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9284 ECB             : 
 3124 sfrost                   9285 GIC           9 :                     n->renameType = OBJECT_POLICY;
                               9286               9 :                     n->relation = $5;
                               9287               9 :                     n->subname = $3;
 3124 sfrost                   9288 GBC           9 :                     n->newname = $8;
 3124 sfrost                   9289 GIC           9 :                     n->missing_ok = false;
  331 peter                    9290 GBC           9 :                     $$ = (Node *) n;
 3124 sfrost                   9291 EUB             :                 }
                               9292                 :             | ALTER POLICY IF_P EXISTS name ON qualified_name RENAME TO name
                               9293                 :                 {
 3124 sfrost                   9294 UBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9295                 : 
 3124 sfrost                   9296 UIC           0 :                     n->renameType = OBJECT_POLICY;
                               9297               0 :                     n->relation = $7;
 3124 sfrost                   9298 LBC           0 :                     n->subname = $5;
 3124 sfrost                   9299 UIC           0 :                     n->newname = $10;
 3124 sfrost                   9300 LBC           0 :                     n->missing_ok = true;
  331 peter                    9301               0 :                     $$ = (Node *) n;
 3124 sfrost                   9302 ECB             :                 }
  668 tgl                      9303                 :             | ALTER PROCEDURE function_with_argtypes RENAME TO name
 1956 peter_e                  9304                 :                 {
 1956 peter_e                  9305 UIC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9306                 : 
                               9307               0 :                     n->renameType = OBJECT_PROCEDURE;
 1956 peter_e                  9308 LBC           0 :                     n->object = (Node *) $3;
 1956 peter_e                  9309 UIC           0 :                     n->newname = $6;
 1956 peter_e                  9310 LBC           0 :                     n->missing_ok = false;
  331 peter                    9311               0 :                     $$ = (Node *) n;
 1956 peter_e                  9312 ECB             :                 }
 2228                          9313                 :             | ALTER PUBLICATION name RENAME TO name
                               9314                 :                 {
 2228 peter_e                  9315 GIC           9 :                     RenameStmt *n = makeNode(RenameStmt);
                               9316                 : 
                               9317               9 :                     n->renameType = OBJECT_PUBLICATION;
 2339 peter_e                  9318 CBC           9 :                     n->object = (Node *) makeString($3);
 2228 peter_e                  9319 GIC           9 :                     n->newname = $6;
 2228 peter_e                  9320 CBC           9 :                     n->missing_ok = false;
  331 peter                    9321               9 :                     $$ = (Node *) n;
 2228 peter_e                  9322 ECB             :                 }
  668 tgl                      9323                 :             | ALTER ROUTINE function_with_argtypes RENAME TO name
 1956 peter_e                  9324                 :                 {
 1956 peter_e                  9325 GIC          12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9326                 : 
                               9327              12 :                     n->renameType = OBJECT_ROUTINE;
 1956 peter_e                  9328 CBC          12 :                     n->object = (Node *) $3;
 1956 peter_e                  9329 GIC          12 :                     n->newname = $6;
 1956 peter_e                  9330 CBC          12 :                     n->missing_ok = false;
  331 peter                    9331              12 :                     $$ = (Node *) n;
 1956 peter_e                  9332 ECB             :                 }
 7226                          9333                 :             | ALTER SCHEMA name RENAME TO name
                               9334                 :                 {
 7226 peter_e                  9335 GIC          10 :                     RenameStmt *n = makeNode(RenameStmt);
                               9336                 : 
                               9337              10 :                     n->renameType = OBJECT_SCHEMA;
 7226 peter_e                  9338 GBC          10 :                     n->subname = $3;
 7226 peter_e                  9339 GIC          10 :                     n->newname = $6;
 4094 simon                    9340 GBC          10 :                     n->missing_ok = false;
  331 peter                    9341              10 :                     $$ = (Node *) n;
 7226 peter_e                  9342 EUB             :                 }
 4139                          9343                 :             | ALTER SERVER name RENAME TO name
                               9344                 :                 {
 4139 peter_e                  9345 GIC          12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9346                 : 
                               9347              12 :                     n->renameType = OBJECT_FOREIGN_SERVER;
 2339 peter_e                  9348 CBC          12 :                     n->object = (Node *) makeString($3);
 4139 peter_e                  9349 GIC          12 :                     n->newname = $6;
 4094 simon                    9350 CBC          12 :                     n->missing_ok = false;
  331 peter                    9351              12 :                     $$ = (Node *) n;
 4139 peter_e                  9352 ECB             :                 }
 2228                          9353                 :             | ALTER SUBSCRIPTION name RENAME TO name
                               9354                 :                 {
 2228 peter_e                  9355 GIC          19 :                     RenameStmt *n = makeNode(RenameStmt);
                               9356                 : 
                               9357              19 :                     n->renameType = OBJECT_SUBSCRIPTION;
 2339 peter_e                  9358 CBC          19 :                     n->object = (Node *) makeString($3);
 2228 peter_e                  9359 GIC          19 :                     n->newname = $6;
 2228 peter_e                  9360 CBC          19 :                     n->missing_ok = false;
  331 peter                    9361              19 :                     $$ = (Node *) n;
 2228 peter_e                  9362 ECB             :                 }
 6913 tgl                      9363                 :             | ALTER TABLE relation_expr RENAME TO name
 9344 bruce                    9364                 :                 {
 9344 bruce                    9365 GIC         143 :                     RenameStmt *n = makeNode(RenameStmt);
                               9366                 : 
 6913 tgl                      9367             143 :                     n->renameType = OBJECT_TABLE;
 6913 tgl                      9368 CBC         143 :                     n->relation = $3;
 6913 tgl                      9369 GIC         143 :                     n->subname = NULL;
 6913 tgl                      9370 CBC         143 :                     n->newname = $6;
 4094 simon                    9371             143 :                     n->missing_ok = false;
  331 peter                    9372             143 :                     $$ = (Node *) n;
 4094 simon                    9373 ECB             :                 }
                               9374                 :             | ALTER TABLE IF_P EXISTS relation_expr RENAME TO name
                               9375                 :                 {
 4094 simon                    9376 UIC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9377                 : 
 4094 simon                    9378 LBC           0 :                     n->renameType = OBJECT_TABLE;
 4094 simon                    9379 UIC           0 :                     n->relation = $5;
 4094 simon                    9380 LBC           0 :                     n->subname = NULL;
                               9381               0 :                     n->newname = $8;
                               9382               0 :                     n->missing_ok = true;
  331 peter                    9383               0 :                     $$ = (Node *) n;
 6806 bruce                    9384 ECB             :                 }
 5200 peter_e                  9385                 :             | ALTER SEQUENCE qualified_name RENAME TO name
                               9386                 :                 {
 5759 neilc                    9387 GIC           1 :                     RenameStmt *n = makeNode(RenameStmt);
                               9388                 : 
 5759 neilc                    9389 GBC           1 :                     n->renameType = OBJECT_SEQUENCE;
 5759 neilc                    9390 GIC           1 :                     n->relation = $3;
 5759 neilc                    9391 GBC           1 :                     n->subname = NULL;
                               9392               1 :                     n->newname = $6;
 4094 simon                    9393               1 :                     n->missing_ok = false;
  331 peter                    9394               1 :                     $$ = (Node *) n;
 4094 simon                    9395 EUB             :                 }
                               9396                 :             | ALTER SEQUENCE IF_P EXISTS qualified_name RENAME TO name
                               9397                 :                 {
 4094 simon                    9398 UIC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9399                 : 
 4094 simon                    9400 UBC           0 :                     n->renameType = OBJECT_SEQUENCE;
 4094 simon                    9401 UIC           0 :                     n->relation = $5;
 4094 simon                    9402 UBC           0 :                     n->subname = NULL;
                               9403               0 :                     n->newname = $8;
                               9404               0 :                     n->missing_ok = true;
  331 peter                    9405               0 :                     $$ = (Node *) n;
 5759 neilc                    9406 EUB             :                 }
                               9407                 :             | ALTER VIEW qualified_name RENAME TO name
                               9408                 :                 {
 5759 neilc                    9409 GIC           3 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9410 ECB             : 
 5759 neilc                    9411 GIC           3 :                     n->renameType = OBJECT_VIEW;
 5759 neilc                    9412 CBC           3 :                     n->relation = $3;
                               9413               3 :                     n->subname = NULL;
                               9414               3 :                     n->newname = $6;
 4094 simon                    9415               3 :                     n->missing_ok = false;
  331 peter                    9416               3 :                     $$ = (Node *) n;
                               9417                 :                 }
                               9418                 :             | ALTER VIEW IF_P EXISTS qualified_name RENAME TO name
                               9419                 :                 {
 4094 simon                    9420 LBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9421                 : 
                               9422               0 :                     n->renameType = OBJECT_VIEW;
                               9423               0 :                     n->relation = $5;
                               9424               0 :                     n->subname = NULL;
                               9425               0 :                     n->newname = $8;
                               9426               0 :                     n->missing_ok = true;
  331 peter                    9427 UIC           0 :                     $$ = (Node *) n;
                               9428                 :                 }
                               9429                 :             | ALTER MATERIALIZED VIEW qualified_name RENAME TO name
 3689 kgrittn                  9430 ECB             :                 {
 3689 kgrittn                  9431 UIC           0 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9432 ECB             : 
 3689 kgrittn                  9433 LBC           0 :                     n->renameType = OBJECT_MATVIEW;
                               9434               0 :                     n->relation = $4;
                               9435               0 :                     n->subname = NULL;
                               9436               0 :                     n->newname = $7;
 3689 kgrittn                  9437 UIC           0 :                     n->missing_ok = false;
  331 peter                    9438               0 :                     $$ = (Node *) n;
                               9439                 :                 }
 3689 kgrittn                  9440 ECB             :             | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME TO name
                               9441                 :                 {
 3689 kgrittn                  9442 LBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9443 ECB             : 
 3689 kgrittn                  9444 LBC           0 :                     n->renameType = OBJECT_MATVIEW;
                               9445               0 :                     n->relation = $6;
                               9446               0 :                     n->subname = NULL;
 3689 kgrittn                  9447 UIC           0 :                     n->newname = $9;
                               9448               0 :                     n->missing_ok = true;
  331 peter                    9449               0 :                     $$ = (Node *) n;
 3689 kgrittn                  9450 ECB             :                 }
                               9451                 :             | ALTER INDEX qualified_name RENAME TO name
 6806 bruce                    9452                 :                 {
 6806 bruce                    9453 CBC          96 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9454 ECB             : 
 6806 bruce                    9455 CBC          96 :                     n->renameType = OBJECT_INDEX;
                               9456              96 :                     n->relation = $3;
 6806 bruce                    9457 GIC          96 :                     n->subname = NULL;
                               9458              96 :                     n->newname = $6;
 4094 simon                    9459              96 :                     n->missing_ok = false;
  331 peter                    9460 CBC          96 :                     $$ = (Node *) n;
                               9461                 :                 }
 4094 simon                    9462 ECB             :             | ALTER INDEX IF_P EXISTS qualified_name RENAME TO name
                               9463                 :                 {
 4094 simon                    9464 CBC           6 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9465 ECB             : 
 4094 simon                    9466 CBC           6 :                     n->renameType = OBJECT_INDEX;
                               9467               6 :                     n->relation = $5;
 4094 simon                    9468 GIC           6 :                     n->subname = NULL;
                               9469               6 :                     n->newname = $8;
                               9470               6 :                     n->missing_ok = true;
  331 peter                    9471 GBC           6 :                     $$ = (Node *) n;
                               9472                 :                 }
 4481 rhaas                    9473 EUB             :             | ALTER FOREIGN TABLE relation_expr RENAME TO name
                               9474                 :                 {
 4481 rhaas                    9475 GBC           3 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9476 EUB             : 
 4481 rhaas                    9477 GBC           3 :                     n->renameType = OBJECT_FOREIGN_TABLE;
                               9478               3 :                     n->relation = $4;
 4481 rhaas                    9479 GIC           3 :                     n->subname = NULL;
                               9480               3 :                     n->newname = $7;
 4094 simon                    9481               3 :                     n->missing_ok = false;
  331 peter                    9482 CBC           3 :                     $$ = (Node *) n;
                               9483                 :                 }
 4094 simon                    9484 ECB             :             | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME TO name
                               9485                 :                 {
 4094 simon                    9486 CBC           3 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9487 ECB             : 
 4094 simon                    9488 CBC           3 :                     n->renameType = OBJECT_FOREIGN_TABLE;
                               9489               3 :                     n->relation = $6;
 4094 simon                    9490 GIC           3 :                     n->subname = NULL;
                               9491               3 :                     n->newname = $9;
                               9492               3 :                     n->missing_ok = true;
  331 peter                    9493 GBC           3 :                     $$ = (Node *) n;
                               9494                 :                 }
 6913 tgl                      9495 EUB             :             | ALTER TABLE relation_expr RENAME opt_column name TO name
                               9496                 :                 {
 6913 tgl                      9497 GBC         116 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9498 EUB             : 
 6913 tgl                      9499 GBC         116 :                     n->renameType = OBJECT_COLUMN;
 4481 rhaas                    9500             116 :                     n->relationType = OBJECT_TABLE;
 7689 tgl                      9501 GIC         116 :                     n->relation = $3;
 7226 peter_e                  9502             116 :                     n->subname = $6;
 8007 tgl                      9503             116 :                     n->newname = $8;
 4094 simon                    9504 CBC         116 :                     n->missing_ok = false;
  331 peter                    9505 GIC         116 :                     $$ = (Node *) n;
 4094 simon                    9506 ECB             :                 }
                               9507                 :             | ALTER TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
                               9508                 :                 {
 4094 simon                    9509 CBC          12 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9510 ECB             : 
 4094 simon                    9511 CBC          12 :                     n->renameType = OBJECT_COLUMN;
 4094 simon                    9512 GIC          12 :                     n->relationType = OBJECT_TABLE;
                               9513              12 :                     n->relation = $5;
                               9514              12 :                     n->subname = $8;
 4094 simon                    9515 GBC          12 :                     n->newname = $10;
 4094 simon                    9516 GIC          12 :                     n->missing_ok = true;
  331 peter                    9517 GBC          12 :                     $$ = (Node *) n;
 7655 bruce                    9518 EUB             :                 }
 1235 fujii                    9519                 :             | ALTER VIEW qualified_name RENAME opt_column name TO name
                               9520                 :                 {
 1235 fujii                    9521 GBC           3 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9522 EUB             : 
 1235 fujii                    9523 GIC           3 :                     n->renameType = OBJECT_COLUMN;
                               9524               3 :                     n->relationType = OBJECT_VIEW;
                               9525               3 :                     n->relation = $3;
 1235 fujii                    9526 GBC           3 :                     n->subname = $6;
 1235 fujii                    9527 GIC           3 :                     n->newname = $8;
 1235 fujii                    9528 GBC           3 :                     n->missing_ok = false;
  331 peter                    9529               3 :                     $$ = (Node *) n;
 1235 fujii                    9530 EUB             :                 }
                               9531                 :             | ALTER VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
                               9532                 :                 {
 1235 fujii                    9533 UBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9534                 : 
 1235 fujii                    9535 UIC           0 :                     n->renameType = OBJECT_COLUMN;
                               9536               0 :                     n->relationType = OBJECT_VIEW;
 1235 fujii                    9537 UBC           0 :                     n->relation = $5;
 1235 fujii                    9538 UIC           0 :                     n->subname = $8;
 1235 fujii                    9539 UBC           0 :                     n->newname = $10;
                               9540               0 :                     n->missing_ok = true;
  331 peter                    9541               0 :                     $$ = (Node *) n;
 1235 fujii                    9542 EUB             :                 }
 3689 kgrittn                  9543                 :             | ALTER MATERIALIZED VIEW qualified_name RENAME opt_column name TO name
                               9544                 :                 {
 3689 kgrittn                  9545 UIC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9546                 : 
                               9547               0 :                     n->renameType = OBJECT_COLUMN;
 3689 kgrittn                  9548 LBC           0 :                     n->relationType = OBJECT_MATVIEW;
 3689 kgrittn                  9549 UIC           0 :                     n->relation = $4;
 3689 kgrittn                  9550 LBC           0 :                     n->subname = $7;
                               9551               0 :                     n->newname = $9;
                               9552               0 :                     n->missing_ok = false;
  331 peter                    9553               0 :                     $$ = (Node *) n;
 3689 kgrittn                  9554 ECB             :                 }
                               9555                 :             | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name RENAME opt_column name TO name
                               9556                 :                 {
 3689 kgrittn                  9557 UIC           0 :                     RenameStmt *n = makeNode(RenameStmt);
                               9558                 : 
 3689 kgrittn                  9559 LBC           0 :                     n->renameType = OBJECT_COLUMN;
 3689 kgrittn                  9560 UIC           0 :                     n->relationType = OBJECT_MATVIEW;
 3689 kgrittn                  9561 LBC           0 :                     n->relation = $6;
                               9562               0 :                     n->subname = $9;
                               9563               0 :                     n->newname = $11;
                               9564               0 :                     n->missing_ok = true;
  331 peter                    9565               0 :                     $$ = (Node *) n;
 3689 kgrittn                  9566 ECB             :                 }
                               9567                 :             | ALTER TABLE relation_expr RENAME CONSTRAINT name TO name
                               9568                 :                 {
 4047 peter_e                  9569 GIC          33 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9570 ECB             : 
 3029 alvherre                 9571 GIC          33 :                     n->renameType = OBJECT_TABCONSTRAINT;
 4047 peter_e                  9572 CBC          33 :                     n->relation = $3;
                               9573              33 :                     n->subname = $6;
                               9574              33 :                     n->newname = $8;
 2938 bruce                    9575              33 :                     n->missing_ok = false;
  331 peter                    9576              33 :                     $$ = (Node *) n;
 2938 bruce                    9577 ECB             :                 }
                               9578                 :             | ALTER TABLE IF_P EXISTS relation_expr RENAME CONSTRAINT name TO name
                               9579                 :                 {
 2938 bruce                    9580 GIC           3 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9581 ECB             : 
 2938 bruce                    9582 GIC           3 :                     n->renameType = OBJECT_TABCONSTRAINT;
 2938 bruce                    9583 CBC           3 :                     n->relation = $5;
                               9584               3 :                     n->subname = $8;
                               9585               3 :                     n->newname = $10;
                               9586               3 :                     n->missing_ok = true;
  331 peter                    9587               3 :                     $$ = (Node *) n;
 4047 peter_e                  9588 ECB             :                 }
                               9589                 :             | ALTER FOREIGN TABLE relation_expr RENAME opt_column name TO name
                               9590                 :                 {
 4481 rhaas                    9591 GIC           3 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9592 ECB             : 
 4481 rhaas                    9593 GIC           3 :                     n->renameType = OBJECT_COLUMN;
 4481 rhaas                    9594 CBC           3 :                     n->relationType = OBJECT_FOREIGN_TABLE;
                               9595               3 :                     n->relation = $4;
                               9596               3 :                     n->subname = $7;
                               9597               3 :                     n->newname = $9;
 4094 simon                    9598               3 :                     n->missing_ok = false;
  331 peter                    9599               3 :                     $$ = (Node *) n;
 4094 simon                    9600 ECB             :                 }
                               9601                 :             | ALTER FOREIGN TABLE IF_P EXISTS relation_expr RENAME opt_column name TO name
                               9602                 :                 {
 4094 simon                    9603 GIC           3 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9604 ECB             : 
 4094 simon                    9605 GIC           3 :                     n->renameType = OBJECT_COLUMN;
 4094 simon                    9606 CBC           3 :                     n->relationType = OBJECT_FOREIGN_TABLE;
                               9607               3 :                     n->relation = $6;
                               9608               3 :                     n->subname = $9;
                               9609               3 :                     n->newname = $11;
                               9610               3 :                     n->missing_ok = true;
  331 peter                    9611               3 :                     $$ = (Node *) n;
 4481 rhaas                    9612 ECB             :                 }
                               9613                 :             | ALTER RULE name ON qualified_name RENAME TO name
                               9614                 :                 {
 3712 tgl                      9615 GIC          17 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9616 ECB             : 
 3712 tgl                      9617 GIC          17 :                     n->renameType = OBJECT_RULE;
 3712 tgl                      9618 CBC          17 :                     n->relation = $5;
                               9619              17 :                     n->subname = $3;
                               9620              17 :                     n->newname = $8;
                               9621              17 :                     n->missing_ok = false;
  331 peter                    9622              17 :                     $$ = (Node *) n;
 3712 tgl                      9623 ECB             :                 }
 5200 peter_e                  9624                 :             | ALTER TRIGGER name ON qualified_name RENAME TO name
                               9625                 :                 {
 7655 bruce                    9626 GIC          20 :                     RenameStmt *n = makeNode(RenameStmt);
                               9627                 : 
 6460 tgl                      9628 GBC          20 :                     n->renameType = OBJECT_TRIGGER;
 7655 bruce                    9629 GIC          20 :                     n->relation = $5;
 7226 peter_e                  9630 GBC          20 :                     n->subname = $3;
 7655 bruce                    9631              20 :                     n->newname = $8;
 4094 simon                    9632              20 :                     n->missing_ok = false;
  331 peter                    9633              20 :                     $$ = (Node *) n;
 7226 peter_e                  9634 EUB             :                 }
 3917 rhaas                    9635                 :             | ALTER EVENT TRIGGER name RENAME TO name
                               9636                 :                 {
 3917 rhaas                    9637 GIC           6 :                     RenameStmt *n = makeNode(RenameStmt);
                               9638                 : 
                               9639               6 :                     n->renameType = OBJECT_EVENT_TRIGGER;
 2339 peter_e                  9640 GBC           6 :                     n->object = (Node *) makeString($4);
 3917 rhaas                    9641 GIC           6 :                     n->newname = $7;
  331 peter                    9642 GBC           6 :                     $$ = (Node *) n;
 3917 rhaas                    9643 EUB             :                 }
 6494 tgl                      9644                 :             | ALTER ROLE RoleId RENAME TO RoleId
 7226 peter_e                  9645                 :                 {
 7226 peter_e                  9646 GBC          15 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9647 EUB             : 
 6494 tgl                      9648 GBC          15 :                     n->renameType = OBJECT_ROLE;
 6494 tgl                      9649 GIC          15 :                     n->subname = $3;
                               9650              15 :                     n->newname = $6;
 4094 simon                    9651              15 :                     n->missing_ok = false;
  331 peter                    9652 GBC          15 :                     $$ = (Node *) n;
                               9653                 :                 }
 6494 tgl                      9654 EUB             :             | ALTER USER RoleId RENAME TO RoleId
                               9655                 :                 {
 6494 tgl                      9656 UBC           0 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9657 EUB             : 
 6494 tgl                      9658 UBC           0 :                     n->renameType = OBJECT_ROLE;
 7226 peter_e                  9659               0 :                     n->subname = $3;
                               9660               0 :                     n->newname = $6;
 4094 simon                    9661 UIC           0 :                     n->missing_ok = false;
  331 peter                    9662               0 :                     $$ = (Node *) n;
                               9663                 :                 }
 6862 tgl                      9664 ECB             :             | ALTER TABLESPACE name RENAME TO name
                               9665                 :                 {
 6862 tgl                      9666 CBC           3 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9667 ECB             : 
 6862 tgl                      9668 CBC           3 :                     n->renameType = OBJECT_TABLESPACE;
                               9669               3 :                     n->subname = $3;
                               9670               3 :                     n->newname = $6;
 4094 simon                    9671               3 :                     n->missing_ok = false;
  331 peter                    9672 GIC           3 :                     $$ = (Node *) n;
                               9673                 :                 }
                               9674                 :             | ALTER STATISTICS any_name RENAME TO name
 2207 alvherre                 9675 ECB             :                 {
 2207 alvherre                 9676 GIC          15 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9677 ECB             : 
 2207 alvherre                 9678 CBC          15 :                     n->renameType = OBJECT_STATISTIC_EXT;
                               9679              15 :                     n->object = (Node *) $3;
                               9680              15 :                     n->newname = $6;
                               9681              15 :                     n->missing_ok = false;
  331 peter                    9682              15 :                     $$ = (Node *) n;
                               9683                 :                 }
                               9684                 :             | ALTER TEXT_P SEARCH PARSER any_name RENAME TO name
                               9685                 :                 {
 5710 tgl                      9686               6 :                     RenameStmt *n = makeNode(RenameStmt);
                               9687                 : 
                               9688               6 :                     n->renameType = OBJECT_TSPARSER;
 2339 peter_e                  9689               6 :                     n->object = (Node *) $5;
 5710 tgl                      9690               6 :                     n->newname = $8;
 4094 simon                    9691               6 :                     n->missing_ok = false;
  331 peter                    9692               6 :                     $$ = (Node *) n;
 5710 tgl                      9693 ECB             :                 }
                               9694                 :             | ALTER TEXT_P SEARCH DICTIONARY any_name RENAME TO name
                               9695                 :                 {
 5710 tgl                      9696 GIC          12 :                     RenameStmt *n = makeNode(RenameStmt);
                               9697                 : 
 5710 tgl                      9698 CBC          12 :                     n->renameType = OBJECT_TSDICTIONARY;
 2339 peter_e                  9699 GIC          12 :                     n->object = (Node *) $5;
 5710 tgl                      9700 CBC          12 :                     n->newname = $8;
 4094 simon                    9701              12 :                     n->missing_ok = false;
  331 peter                    9702              12 :                     $$ = (Node *) n;
 5710 tgl                      9703 ECB             :                 }
                               9704                 :             | ALTER TEXT_P SEARCH TEMPLATE any_name RENAME TO name
                               9705                 :                 {
 5710 tgl                      9706 CBC           6 :                     RenameStmt *n = makeNode(RenameStmt);
                               9707                 : 
 5710 tgl                      9708 GIC           6 :                     n->renameType = OBJECT_TSTEMPLATE;
 2339 peter_e                  9709               6 :                     n->object = (Node *) $5;
 5710 tgl                      9710 CBC           6 :                     n->newname = $8;
 4094 simon                    9711 GIC           6 :                     n->missing_ok = false;
  331 peter                    9712 CBC           6 :                     $$ = (Node *) n;
 5710 tgl                      9713 ECB             :                 }
                               9714                 :             | ALTER TEXT_P SEARCH CONFIGURATION any_name RENAME TO name
                               9715                 :                 {
 5710 tgl                      9716 CBC          12 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9717 ECB             : 
 5710 tgl                      9718 GIC          12 :                     n->renameType = OBJECT_TSCONFIGURATION;
 2339 peter_e                  9719              12 :                     n->object = (Node *) $5;
 5710 tgl                      9720              12 :                     n->newname = $8;
 4094 simon                    9721 CBC          12 :                     n->missing_ok = false;
  331 peter                    9722 GIC          12 :                     $$ = (Node *) n;
 5710 tgl                      9723 ECB             :                 }
 5499                          9724                 :             | ALTER TYPE_P any_name RENAME TO name
                               9725                 :                 {
 5499 tgl                      9726 CBC          13 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9727 ECB             : 
 5499 tgl                      9728 CBC          13 :                     n->renameType = OBJECT_TYPE;
 2339 peter_e                  9729 GIC          13 :                     n->object = (Node *) $3;
 5499 tgl                      9730              13 :                     n->newname = $6;
 4094 simon                    9731              13 :                     n->missing_ok = false;
  331 peter                    9732 CBC          13 :                     $$ = (Node *) n;
                               9733                 :                 }
 4520 peter_e                  9734 ECB             :             | ALTER TYPE_P any_name RENAME ATTRIBUTE name TO name opt_drop_behavior
 4578                          9735                 :                 {
 4578 peter_e                  9736 CBC          12 :                     RenameStmt *n = makeNode(RenameStmt);
  331 peter                    9737 ECB             : 
 4578 peter_e                  9738 GIC          12 :                     n->renameType = OBJECT_ATTRIBUTE;
 4481 rhaas                    9739              12 :                     n->relationType = OBJECT_TYPE;
 4578 peter_e                  9740              12 :                     n->relation = makeRangeVarFromAnyName($3, @3, yyscanner);
 4578 peter_e                  9741 CBC          12 :                     n->subname = $6;
 4578 peter_e                  9742 GIC          12 :                     n->newname = $8;
 4520 peter_e                  9743 CBC          12 :                     n->behavior = $9;
 4094 simon                    9744              12 :                     n->missing_ok = false;
  331 peter                    9745              12 :                     $$ = (Node *) n;
 4578 peter_e                  9746 ECB             :                 }
 9344 bruce                    9747                 :         ;
                               9748                 : 
                               9749                 : opt_column: COLUMN
                               9750                 :             | /*EMPTY*/
 9344 bruce                    9751 EUB             :         ;
                               9752                 : 
 4414 tgl                      9753 GBC          73 : opt_set_data: SET DATA_P                            { $$ = 1; }
 5283 peter_e                  9754             376 :             | /*EMPTY*/                             { $$ = 0; }
 5283 peter_e                  9755 EUB             :         ;
                               9756                 : 
 2560 alvherre                 9757                 : /*****************************************************************************
                               9758                 :  *
                               9759                 :  * ALTER THING name DEPENDS ON EXTENSION name
                               9760                 :  *
 2560 alvherre                 9761 ECB             :  *****************************************************************************/
                               9762                 : 
                               9763                 : AlterObjectDependsStmt:
 1084                          9764                 :             ALTER FUNCTION function_with_argtypes opt_no DEPENDS ON EXTENSION name
 2560                          9765                 :                 {
 2560 alvherre                 9766 CBC           6 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
  331 peter                    9767 ECB             : 
 2560 alvherre                 9768 GIC           6 :                     n->objectType = OBJECT_FUNCTION;
 2339 peter_e                  9769               6 :                     n->object = (Node *) $3;
 1084 alvherre                 9770               6 :                     n->extname = makeString($8);
 1084 alvherre                 9771 CBC           6 :                     n->remove = $4;
  331 peter                    9772 GIC           6 :                     $$ = (Node *) n;
 2560 alvherre                 9773 ECB             :                 }
  668 tgl                      9774                 :             | ALTER PROCEDURE function_with_argtypes opt_no DEPENDS ON EXTENSION name
 1956 peter_e                  9775                 :                 {
 1956 peter_e                  9776 LBC           0 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
  331 peter                    9777 ECB             : 
 1956 peter_e                  9778 UIC           0 :                     n->objectType = OBJECT_PROCEDURE;
                               9779               0 :                     n->object = (Node *) $3;
 1084 alvherre                 9780               0 :                     n->extname = makeString($8);
 1084 alvherre                 9781 LBC           0 :                     n->remove = $4;
  331 peter                    9782 UIC           0 :                     $$ = (Node *) n;
 1956 peter_e                  9783 ECB             :                 }
  668 tgl                      9784                 :             | ALTER ROUTINE function_with_argtypes opt_no DEPENDS ON EXTENSION name
 1956 peter_e                  9785                 :                 {
 1956 peter_e                  9786 LBC           0 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
  331 peter                    9787 ECB             : 
 1956 peter_e                  9788 UIC           0 :                     n->objectType = OBJECT_ROUTINE;
                               9789               0 :                     n->object = (Node *) $3;
 1084 alvherre                 9790               0 :                     n->extname = makeString($8);
 1084 alvherre                 9791 LBC           0 :                     n->remove = $4;
  331 peter                    9792 UIC           0 :                     $$ = (Node *) n;
 1956 peter_e                  9793 ECB             :                 }
 1084 alvherre                 9794                 :             | ALTER TRIGGER name ON qualified_name opt_no DEPENDS ON EXTENSION name
 2560                          9795                 :                 {
 2560 alvherre                 9796 CBC           5 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
  331 peter                    9797 ECB             : 
 2560 alvherre                 9798 GIC           5 :                     n->objectType = OBJECT_TRIGGER;
                               9799               5 :                     n->relation = $5;
 2339 peter_e                  9800               5 :                     n->object = (Node *) list_make1(makeString($3));
 1084 alvherre                 9801 CBC           5 :                     n->extname = makeString($10);
 1084 alvherre                 9802 GIC           5 :                     n->remove = $6;
  331 peter                    9803 CBC           5 :                     $$ = (Node *) n;
 2560 alvherre                 9804 ECB             :                 }
 1084                          9805                 :             | ALTER MATERIALIZED VIEW qualified_name opt_no DEPENDS ON EXTENSION name
 2560                          9806                 :                 {
 2560 alvherre                 9807 CBC           5 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
                               9808                 : 
 2560 alvherre                 9809 GIC           5 :                     n->objectType = OBJECT_MATVIEW;
                               9810               5 :                     n->relation = $4;
 1084 alvherre                 9811 CBC           5 :                     n->extname = makeString($9);
 1084 alvherre                 9812 GIC           5 :                     n->remove = $5;
  331 peter                    9813 CBC           5 :                     $$ = (Node *) n;
 2560 alvherre                 9814 ECB             :                 }
 1084                          9815                 :             | ALTER INDEX qualified_name opt_no DEPENDS ON EXTENSION name
 2560                          9816                 :                 {
 2560 alvherre                 9817 CBC           7 :                     AlterObjectDependsStmt *n = makeNode(AlterObjectDependsStmt);
                               9818                 : 
 2560 alvherre                 9819 GIC           7 :                     n->objectType = OBJECT_INDEX;
                               9820               7 :                     n->relation = $3;
 1084 alvherre                 9821 CBC           7 :                     n->extname = makeString($8);
 1084 alvherre                 9822 GIC           7 :                     n->remove = $4;
  331 peter                    9823 CBC           7 :                     $$ = (Node *) n;
 2560 alvherre                 9824 ECB             :                 }
                               9825                 :         ;
                               9826                 : 
 1084 alvherre                 9827 CBC           4 : opt_no:     NO              { $$ = true; }
 1084 alvherre                 9828 GIC          19 :             | /* EMPTY */   { $$ = false;   }
                               9829                 :         ;
                               9830                 : 
 6460 tgl                      9831 ECB             : /*****************************************************************************
                               9832                 :  *
                               9833                 :  * ALTER THING name SET SCHEMA name
                               9834                 :  *
                               9835                 :  *****************************************************************************/
                               9836                 : 
                               9837                 : AlterObjectSchemaStmt:
 2397 peter_e                  9838                 :             ALTER AGGREGATE aggregate_with_argtypes SET SCHEMA name
 6460 tgl                      9839                 :                 {
 6460 tgl                      9840 CBC          12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                               9841                 : 
 6460 tgl                      9842 GIC          12 :                     n->objectType = OBJECT_AGGREGATE;
 2339 peter_e                  9843              12 :                     n->object = (Node *) $3;
 2397                          9844              12 :                     n->newschema = $6;
 4094 simon                    9845              12 :                     n->missing_ok = false;
  331 peter                    9846              12 :                     $$ = (Node *) n;
                               9847                 :                 }
 4439 peter_e                  9848 ECB             :             | ALTER COLLATION any_name SET SCHEMA name
                               9849                 :                 {
 4439 peter_e                  9850 GIC           6 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                               9851                 : 
                               9852               6 :                     n->objectType = OBJECT_COLLATION;
 2339                          9853               6 :                     n->object = (Node *) $3;
 4439                          9854               6 :                     n->newschema = $6;
 4094 simon                    9855               6 :                     n->missing_ok = false;
  331 peter                    9856               6 :                     $$ = (Node *) n;
                               9857                 :                 }
                               9858                 :             | ALTER CONVERSION_P any_name SET SCHEMA name
                               9859                 :                 {
 4517 rhaas                    9860              12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                    9861 ECB             : 
 4517 rhaas                    9862 GIC          12 :                     n->objectType = OBJECT_CONVERSION;
 2339 peter_e                  9863 CBC          12 :                     n->object = (Node *) $3;
 4517 rhaas                    9864              12 :                     n->newschema = $6;
 4094 simon                    9865              12 :                     n->missing_ok = false;
  331 peter                    9866              12 :                     $$ = (Node *) n;
 4517 rhaas                    9867 ECB             :                 }
                               9868                 :             | ALTER DOMAIN_P any_name SET SCHEMA name
                               9869                 :                 {
 6460 tgl                      9870 GIC           3 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                    9871 EUB             : 
 6460 tgl                      9872 GIC           3 :                     n->objectType = OBJECT_DOMAIN;
 2339 peter_e                  9873 GBC           3 :                     n->object = (Node *) $3;
 6460 tgl                      9874               3 :                     n->newschema = $6;
 4094 simon                    9875               3 :                     n->missing_ok = false;
  331 peter                    9876               3 :                     $$ = (Node *) n;
 6460 tgl                      9877 EUB             :                 }
                               9878                 :             | ALTER EXTENSION name SET SCHEMA name
                               9879                 :                 {
 4443 tgl                      9880 GIC           3 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                    9881 EUB             : 
 4443 tgl                      9882 GIC           3 :                     n->objectType = OBJECT_EXTENSION;
 2339 peter_e                  9883 GBC           3 :                     n->object = (Node *) makeString($3);
 4443 tgl                      9884               3 :                     n->newschema = $6;
 4094 simon                    9885               3 :                     n->missing_ok = false;
  331 peter                    9886               3 :                     $$ = (Node *) n;
 4443 tgl                      9887 EUB             :                 }
                               9888                 :             | ALTER FUNCTION function_with_argtypes SET SCHEMA name
                               9889                 :                 {
 6460 tgl                      9890 GIC          19 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                    9891 ECB             : 
 6460 tgl                      9892 GIC          19 :                     n->objectType = OBJECT_FUNCTION;
 2339 peter_e                  9893 CBC          19 :                     n->object = (Node *) $3;
 5697 tgl                      9894              19 :                     n->newschema = $6;
 4094 simon                    9895              19 :                     n->missing_ok = false;
  331 peter                    9896              19 :                     $$ = (Node *) n;
 6460 tgl                      9897 ECB             :                 }
 2293 peter_e                  9898                 :             | ALTER OPERATOR operator_with_argtypes SET SCHEMA name
                               9899                 :                 {
 4517 rhaas                    9900 GIC           9 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                               9901                 : 
 4517 rhaas                    9902 CBC           9 :                     n->objectType = OBJECT_OPERATOR;
 2339 peter_e                  9903 GIC           9 :                     n->object = (Node *) $3;
 2293 peter_e                  9904 CBC           9 :                     n->newschema = $6;
 4094 simon                    9905               9 :                     n->missing_ok = false;
  331 peter                    9906               9 :                     $$ = (Node *) n;
 4517 rhaas                    9907 ECB             :                 }
 1033 peter                    9908                 :             | ALTER OPERATOR CLASS any_name USING name SET SCHEMA name
                               9909                 :                 {
 4517 rhaas                    9910 GIC          12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                               9911                 : 
 4517 rhaas                    9912 CBC          12 :                     n->objectType = OBJECT_OPCLASS;
 2339 peter_e                  9913 GIC          12 :                     n->object = (Node *) lcons(makeString($6), $4);
 4517 rhaas                    9914 CBC          12 :                     n->newschema = $9;
 4094 simon                    9915              12 :                     n->missing_ok = false;
  331 peter                    9916              12 :                     $$ = (Node *) n;
 4517 rhaas                    9917 ECB             :                 }
 1033 peter                    9918                 :             | ALTER OPERATOR FAMILY any_name USING name SET SCHEMA name
                               9919                 :                 {
 4517 rhaas                    9920 GIC          12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                               9921                 : 
 4517 rhaas                    9922 CBC          12 :                     n->objectType = OBJECT_OPFAMILY;
 2339 peter_e                  9923              12 :                     n->object = (Node *) lcons(makeString($6), $4);
 4517 rhaas                    9924 GIC          12 :                     n->newschema = $9;
 4094 simon                    9925              12 :                     n->missing_ok = false;
  331 peter                    9926              12 :                     $$ = (Node *) n;
                               9927                 :                 }
                               9928                 :             | ALTER PROCEDURE function_with_argtypes SET SCHEMA name
                               9929                 :                 {
 1956 peter_e                  9930 UIC           0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
                               9931                 : 
                               9932               0 :                     n->objectType = OBJECT_PROCEDURE;
                               9933               0 :                     n->object = (Node *) $3;
                               9934               0 :                     n->newschema = $6;
 1956 peter_e                  9935 LBC           0 :                     n->missing_ok = false;
  331 peter                    9936 UIC           0 :                     $$ = (Node *) n;
 1956 peter_e                  9937 ECB             :                 }
  668 tgl                      9938                 :             | ALTER ROUTINE function_with_argtypes SET SCHEMA name
 1956 peter_e                  9939                 :                 {
 1956 peter_e                  9940 LBC           0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                    9941 ECB             : 
 1956 peter_e                  9942 UIC           0 :                     n->objectType = OBJECT_ROUTINE;
                               9943               0 :                     n->object = (Node *) $3;
                               9944               0 :                     n->newschema = $6;
 1956 peter_e                  9945 LBC           0 :                     n->missing_ok = false;
  331 peter                    9946 UIC           0 :                     $$ = (Node *) n;
 1956 peter_e                  9947 ECB             :                 }
 5411 tgl                      9948                 :             | ALTER TABLE relation_expr SET SCHEMA name
                               9949                 :                 {
 5411 tgl                      9950 CBC          33 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                    9951 ECB             : 
 5411 tgl                      9952 GIC          33 :                     n->objectType = OBJECT_TABLE;
                               9953              33 :                     n->relation = $3;
                               9954              33 :                     n->newschema = $6;
 4094 simon                    9955 CBC          33 :                     n->missing_ok = false;
  331 peter                    9956 GIC          33 :                     $$ = (Node *) n;
 4094 simon                    9957 ECB             :                 }
                               9958                 :             | ALTER TABLE IF_P EXISTS relation_expr SET SCHEMA name
                               9959                 :                 {
 4094 simon                    9960 CBC           6 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                    9961 ECB             : 
 4094 simon                    9962 GIC           6 :                     n->objectType = OBJECT_TABLE;
                               9963               6 :                     n->relation = $5;
                               9964               6 :                     n->newschema = $8;
 4094 simon                    9965 CBC           6 :                     n->missing_ok = true;
  331 peter                    9966 GIC           6 :                     $$ = (Node *) n;
 5411 tgl                      9967 ECB             :                 }
 2207 alvherre                 9968                 :             | ALTER STATISTICS any_name SET SCHEMA name
                               9969                 :                 {
 2207 alvherre                 9970 CBC           9 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                    9971 ECB             : 
 2207 alvherre                 9972 GIC           9 :                     n->objectType = OBJECT_STATISTIC_EXT;
                               9973               9 :                     n->object = (Node *) $3;
                               9974               9 :                     n->newschema = $6;
 2207 alvherre                 9975 CBC           9 :                     n->missing_ok = false;
  331 peter                    9976 GIC           9 :                     $$ = (Node *) n;
 2207 alvherre                 9977 ECB             :                 }
 4517 rhaas                    9978                 :             | ALTER TEXT_P SEARCH PARSER any_name SET SCHEMA name
                               9979                 :                 {
 4517 rhaas                    9980 CBC           9 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                    9981 ECB             : 
 4517 rhaas                    9982 GIC           9 :                     n->objectType = OBJECT_TSPARSER;
 2339 peter_e                  9983               9 :                     n->object = (Node *) $5;
 4517 rhaas                    9984               9 :                     n->newschema = $8;
 4094 simon                    9985 CBC           9 :                     n->missing_ok = false;
  331 peter                    9986 GIC           9 :                     $$ = (Node *) n;
 4517 rhaas                    9987 ECB             :                 }
                               9988                 :             | ALTER TEXT_P SEARCH DICTIONARY any_name SET SCHEMA name
                               9989                 :                 {
 4517 rhaas                    9990 CBC          12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                    9991 ECB             : 
 4517 rhaas                    9992 GIC          12 :                     n->objectType = OBJECT_TSDICTIONARY;
 2339 peter_e                  9993              12 :                     n->object = (Node *) $5;
 4517 rhaas                    9994              12 :                     n->newschema = $8;
 4094 simon                    9995 CBC          12 :                     n->missing_ok = false;
  331 peter                    9996 GIC          12 :                     $$ = (Node *) n;
 4517 rhaas                    9997 ECB             :                 }
                               9998                 :             | ALTER TEXT_P SEARCH TEMPLATE any_name SET SCHEMA name
                               9999                 :                 {
 4517 rhaas                   10000 CBC           9 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                   10001 ECB             : 
 4517 rhaas                   10002 GIC           9 :                     n->objectType = OBJECT_TSTEMPLATE;
 2339 peter_e                 10003               9 :                     n->object = (Node *) $5;
 4517 rhaas                   10004               9 :                     n->newschema = $8;
 4094 simon                   10005 CBC           9 :                     n->missing_ok = false;
  331 peter                   10006 GIC           9 :                     $$ = (Node *) n;
 4517 rhaas                   10007 ECB             :                 }
                              10008                 :             | ALTER TEXT_P SEARCH CONFIGURATION any_name SET SCHEMA name
                              10009                 :                 {
 4517 rhaas                   10010 CBC          12 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                   10011 ECB             : 
 4517 rhaas                   10012 GIC          12 :                     n->objectType = OBJECT_TSCONFIGURATION;
 2339 peter_e                 10013              12 :                     n->object = (Node *) $5;
 4517 rhaas                   10014              12 :                     n->newschema = $8;
 4094 simon                   10015 CBC          12 :                     n->missing_ok = false;
  331 peter                   10016 GIC          12 :                     $$ = (Node *) n;
 4517 rhaas                   10017 ECB             :                 }
 5200 peter_e                 10018                 :             | ALTER SEQUENCE qualified_name SET SCHEMA name
 6460 tgl                     10019                 :                 {
 6460 tgl                     10020 CBC           1 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                   10021 ECB             : 
 6460 tgl                     10022 GIC           1 :                     n->objectType = OBJECT_SEQUENCE;
                              10023               1 :                     n->relation = $3;
                              10024               1 :                     n->newschema = $6;
 4094 simon                   10025 GBC           1 :                     n->missing_ok = false;
  331 peter                   10026 GIC           1 :                     $$ = (Node *) n;
 4094 simon                   10027 EUB             :                 }
                              10028                 :             | ALTER SEQUENCE IF_P EXISTS qualified_name SET SCHEMA name
                              10029                 :                 {
 4094 simon                   10030 UBC           0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                   10031 EUB             : 
 4094 simon                   10032 UIC           0 :                     n->objectType = OBJECT_SEQUENCE;
                              10033               0 :                     n->relation = $5;
                              10034               0 :                     n->newschema = $8;
 4094 simon                   10035 UBC           0 :                     n->missing_ok = true;
  331 peter                   10036 UIC           0 :                     $$ = (Node *) n;
 6460 tgl                     10037 EUB             :                 }
 5200 peter_e                 10038                 :             | ALTER VIEW qualified_name SET SCHEMA name
 6460 tgl                     10039                 :                 {
 6460 tgl                     10040 UBC           0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                   10041 EUB             : 
 5411 tgl                     10042 UIC           0 :                     n->objectType = OBJECT_VIEW;
 6460                         10043               0 :                     n->relation = $3;
                              10044               0 :                     n->newschema = $6;
 4094 simon                   10045 LBC           0 :                     n->missing_ok = false;
  331 peter                   10046 UIC           0 :                     $$ = (Node *) n;
 4094 simon                   10047 ECB             :                 }
                              10048                 :             | ALTER VIEW IF_P EXISTS qualified_name SET SCHEMA name
                              10049                 :                 {
 4094 simon                   10050 LBC           0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                   10051 ECB             : 
 4094 simon                   10052 UIC           0 :                     n->objectType = OBJECT_VIEW;
                              10053               0 :                     n->relation = $5;
                              10054               0 :                     n->newschema = $8;
 4094 simon                   10055 LBC           0 :                     n->missing_ok = true;
  331 peter                   10056 UIC           0 :                     $$ = (Node *) n;
 6460 tgl                     10057 ECB             :                 }
 3689 kgrittn                 10058                 :             | ALTER MATERIALIZED VIEW qualified_name SET SCHEMA name
                              10059                 :                 {
 3689 kgrittn                 10060 CBC           3 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                   10061 ECB             : 
 3689 kgrittn                 10062 GIC           3 :                     n->objectType = OBJECT_MATVIEW;
                              10063               3 :                     n->relation = $4;
                              10064               3 :                     n->newschema = $7;
 3689 kgrittn                 10065 CBC           3 :                     n->missing_ok = false;
  331 peter                   10066 GIC           3 :                     $$ = (Node *) n;
 3689 kgrittn                 10067 ECB             :                 }
                              10068                 :             | ALTER MATERIALIZED VIEW IF_P EXISTS qualified_name SET SCHEMA name
                              10069                 :                 {
 3689 kgrittn                 10070 LBC           0 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                   10071 ECB             : 
 3689 kgrittn                 10072 UIC           0 :                     n->objectType = OBJECT_MATVIEW;
                              10073               0 :                     n->relation = $6;
                              10074               0 :                     n->newschema = $9;
 3689 kgrittn                 10075 LBC           0 :                     n->missing_ok = true;
  331 peter                   10076 UIC           0 :                     $$ = (Node *) n;
 3689 kgrittn                 10077 ECB             :                 }
 4481 rhaas                   10078                 :             | ALTER FOREIGN TABLE relation_expr SET SCHEMA name
                              10079                 :                 {
 4481 rhaas                   10080 CBC           3 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                   10081 ECB             : 
 4481 rhaas                   10082 GIC           3 :                     n->objectType = OBJECT_FOREIGN_TABLE;
                              10083               3 :                     n->relation = $4;
                              10084               3 :                     n->newschema = $7;
 4094 simon                   10085 CBC           3 :                     n->missing_ok = false;
  331 peter                   10086 GIC           3 :                     $$ = (Node *) n;
 4094 simon                   10087 ECB             :                 }
                              10088                 :             | ALTER FOREIGN TABLE IF_P EXISTS relation_expr SET SCHEMA name
                              10089                 :                 {
 4094 simon                   10090 CBC           3 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                   10091 ECB             : 
 4094 simon                   10092 GIC           3 :                     n->objectType = OBJECT_FOREIGN_TABLE;
                              10093               3 :                     n->relation = $6;
                              10094               3 :                     n->newschema = $9;
 4094 simon                   10095 CBC           3 :                     n->missing_ok = true;
  331 peter                   10096 GIC           3 :                     $$ = (Node *) n;
 4481 rhaas                   10097 ECB             :                 }
 6460 tgl                     10098                 :             | ALTER TYPE_P any_name SET SCHEMA name
                              10099                 :                 {
 6460 tgl                     10100 CBC           6 :                     AlterObjectSchemaStmt *n = makeNode(AlterObjectSchemaStmt);
  331 peter                   10101 ECB             : 
 6460 tgl                     10102 GIC           6 :                     n->objectType = OBJECT_TYPE;
 2339 peter_e                 10103               6 :                     n->object = (Node *) $3;
 6460 tgl                     10104               6 :                     n->newschema = $6;
 4094 simon                   10105 CBC           6 :                     n->missing_ok = false;
  331 peter                   10106 GIC           6 :                     $$ = (Node *) n;
 6460 tgl                     10107 ECB             :                 }
                              10108                 :         ;
 9770 scrappy                 10109                 : 
 2826 heikki.linnakangas      10110                 : /*****************************************************************************
                              10111                 :  *
                              10112                 :  * ALTER OPERATOR name SET define
                              10113                 :  *
                              10114                 :  *****************************************************************************/
                              10115                 : 
                              10116                 : AlterOperatorStmt:
 2293 peter_e                 10117                 :             ALTER OPERATOR operator_with_argtypes SET '(' operator_def_list ')'
 2826 heikki.linnakangas      10118                 :                 {
 2826 heikki.linnakangas      10119 CBC         258 :                     AlterOperatorStmt *n = makeNode(AlterOperatorStmt);
  331 peter                   10120 ECB             : 
 2293 peter_e                 10121 CBC         258 :                     n->opername = $3;
 2293 peter_e                 10122 GIC         258 :                     n->options = $6;
  331 peter                   10123             258 :                     $$ = (Node *) n;
                              10124                 :                 }
 2826 heikki.linnakangas      10125 EUB             :         ;
                              10126                 : 
 2826 heikki.linnakangas      10127 GBC         288 : operator_def_list:  operator_def_elem                               { $$ = list_make1($1); }
                              10128             251 :             | operator_def_list ',' operator_def_elem               { $$ = lappend($1, $3); }
 2826 heikki.linnakangas      10129 EUB             :         ;
                              10130                 : 
                              10131                 : operator_def_elem: ColLabel '=' NONE
 2406 peter_e                 10132 GIC          15 :                         { $$ = makeDefElem($1, NULL, @1); }
                              10133                 :                    | ColLabel '=' operator_def_arg
 2161                         10134             524 :                         { $$ = makeDefElem($1, (Node *) $3, @1); }
 2161 peter_e                 10135 EUB             :         ;
                              10136                 : 
                              10137                 : /* must be similar enough to def_arg to avoid reduce/reduce conflicts */
                              10138                 : operator_def_arg:
  331 peter                   10139 GBC         512 :             func_type                       { $$ = (Node *) $1; }
  331 peter                   10140 UBC           0 :             | reserved_keyword              { $$ = (Node *) makeString(pstrdup($1)); }
  331 peter                   10141 GBC          12 :             | qual_all_Op                   { $$ = (Node *) $1; }
  331 peter                   10142 UIC           0 :             | NumericOnly                   { $$ = (Node *) $1; }
                              10143               0 :             | Sconst                        { $$ = (Node *) makeString($1); }
                              10144                 :         ;
 2826 heikki.linnakangas      10145 EUB             : 
                              10146                 : /*****************************************************************************
 1129 tgl                     10147                 :  *
                              10148                 :  * ALTER TYPE name SET define
                              10149                 :  *
                              10150                 :  * We repurpose ALTER OPERATOR's version of "definition" here
                              10151                 :  *
                              10152                 :  *****************************************************************************/
                              10153                 : 
                              10154                 : AlterTypeStmt:
 1129 tgl                     10155 ECB             :             ALTER TYPE_P any_name SET '(' operator_def_list ')'
                              10156                 :                 {
 1129 tgl                     10157 CBC          30 :                     AlterTypeStmt *n = makeNode(AlterTypeStmt);
  331 peter                   10158 ECB             : 
 1129 tgl                     10159 CBC          30 :                     n->typeName = $3;
                              10160              30 :                     n->options = $6;
  331 peter                   10161              30 :                     $$ = (Node *) n;
                              10162                 :                 }
                              10163                 :         ;
                              10164                 : 
 6862 tgl                     10165 EUB             : /*****************************************************************************
                              10166                 :  *
 6460                         10167                 :  * ALTER THING name OWNER TO newname
 6862                         10168                 :  *
                              10169                 :  *****************************************************************************/
                              10170                 : 
 2397 peter_e                 10171                 : AlterOwnerStmt: ALTER AGGREGATE aggregate_with_argtypes OWNER TO RoleSpec
                              10172                 :                 {
 6862 tgl                     10173 GIC          71 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10174                 : 
 6862 tgl                     10175 CBC          71 :                     n->objectType = OBJECT_AGGREGATE;
 2339 peter_e                 10176 GIC          71 :                     n->object = (Node *) $3;
 2397 peter_e                 10177 CBC          71 :                     n->newowner = $6;
  331 peter                   10178              71 :                     $$ = (Node *) n;
 6862 tgl                     10179 ECB             :                 }
 2953 alvherre                10180                 :             | ALTER COLLATION any_name OWNER TO RoleSpec
 4439 peter_e                 10181                 :                 {
 4439 peter_e                 10182 GIC          13 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10183                 : 
                              10184              13 :                     n->objectType = OBJECT_COLLATION;
 2339 peter_e                 10185 CBC          13 :                     n->object = (Node *) $3;
 4439 peter_e                 10186 GIC          13 :                     n->newowner = $6;
  331 peter                   10187 CBC          13 :                     $$ = (Node *) n;
 4439 peter_e                 10188 ECB             :                 }
 2953 alvherre                10189                 :             | ALTER CONVERSION_P any_name OWNER TO RoleSpec
 6862 tgl                     10190                 :                 {
 6862 tgl                     10191 CBC          12 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10192                 : 
 6862 tgl                     10193 GIC          12 :                     n->objectType = OBJECT_CONVERSION;
 2339 peter_e                 10194              12 :                     n->object = (Node *) $3;
 6862 tgl                     10195 CBC          12 :                     n->newowner = $6;
  331 peter                   10196 GIC          12 :                     $$ = (Node *) n;
 6862 tgl                     10197 ECB             :                 }
 1033 peter                   10198                 :             | ALTER DATABASE name OWNER TO RoleSpec
 6862 tgl                     10199                 :                 {
 6862 tgl                     10200 CBC          18 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10201 ECB             : 
 6862 tgl                     10202 GIC          18 :                     n->objectType = OBJECT_DATABASE;
 2339 peter_e                 10203              18 :                     n->object = (Node *) makeString($3);
 6862 tgl                     10204              18 :                     n->newowner = $6;
  331 peter                   10205              18 :                     $$ = (Node *) n;
                              10206                 :                 }
                              10207                 :             | ALTER DOMAIN_P any_name OWNER TO RoleSpec
                              10208                 :                 {
 6862 tgl                     10209              17 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10210                 : 
                              10211              17 :                     n->objectType = OBJECT_DOMAIN;
 2339 peter_e                 10212              17 :                     n->object = (Node *) $3;
 6862 tgl                     10213              17 :                     n->newowner = $6;
  331 peter                   10214 CBC          17 :                     $$ = (Node *) n;
                              10215                 :                 }
 2953 alvherre                10216 ECB             :             | ALTER FUNCTION function_with_argtypes OWNER TO RoleSpec
 6862 tgl                     10217                 :                 {
 6862 tgl                     10218 CBC         280 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10219                 : 
 6862 tgl                     10220 GIC         280 :                     n->objectType = OBJECT_FUNCTION;
 2339 peter_e                 10221             280 :                     n->object = (Node *) $3;
 5697 tgl                     10222 CBC         280 :                     n->newowner = $6;
  331 peter                   10223             280 :                     $$ = (Node *) n;
                              10224                 :                 }
                              10225                 :             | ALTER opt_procedural LANGUAGE name OWNER TO RoleSpec
                              10226                 :                 {
 5858 tgl                     10227             326 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10228                 : 
                              10229             326 :                     n->objectType = OBJECT_LANGUAGE;
 2339 peter_e                 10230 GIC         326 :                     n->object = (Node *) makeString($4);
 5858 tgl                     10231             326 :                     n->newowner = $7;
  331 peter                   10232             326 :                     $$ = (Node *) n;
                              10233                 :                 }
 2953 alvherre                10234 ECB             :             | ALTER LARGE_P OBJECT_P NumericOnly OWNER TO RoleSpec
 4867 itagaki.takahiro        10235 EUB             :                 {
 4867 itagaki.takahiro        10236 CBC           6 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10237 EUB             : 
 4867 itagaki.takahiro        10238 GBC           6 :                     n->objectType = OBJECT_LARGEOBJECT;
 2339 peter_e                 10239 GIC           6 :                     n->object = (Node *) $4;
 4867 itagaki.takahiro        10240               6 :                     n->newowner = $7;
  331 peter                   10241               6 :                     $$ = (Node *) n;
                              10242                 :                 }
                              10243                 :             | ALTER OPERATOR operator_with_argtypes OWNER TO RoleSpec
                              10244                 :                 {
 6862 tgl                     10245              23 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10246                 : 
                              10247              23 :                     n->objectType = OBJECT_OPERATOR;
 2339 peter_e                 10248              23 :                     n->object = (Node *) $3;
 2293                         10249              23 :                     n->newowner = $6;
  331 peter                   10250              23 :                     $$ = (Node *) n;
                              10251                 :                 }
 1033 peter                   10252 ECB             :             | ALTER OPERATOR CLASS any_name USING name OWNER TO RoleSpec
                              10253                 :                 {
 6862 tgl                     10254 CBC          27 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10255 ECB             : 
 6862 tgl                     10256 CBC          27 :                     n->objectType = OBJECT_OPCLASS;
 2339 peter_e                 10257 GIC          27 :                     n->object = (Node *) lcons(makeString($6), $4);
 6862 tgl                     10258              27 :                     n->newowner = $9;
  331 peter                   10259              27 :                     $$ = (Node *) n;
                              10260                 :                 }
                              10261                 :             | ALTER OPERATOR FAMILY any_name USING name OWNER TO RoleSpec
                              10262                 :                 {
 5920 tgl                     10263              31 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
                              10264                 : 
                              10265              31 :                     n->objectType = OBJECT_OPFAMILY;
 2339 peter_e                 10266              31 :                     n->object = (Node *) lcons(makeString($6), $4);
 5920 tgl                     10267              31 :                     n->newowner = $9;
  331 peter                   10268 CBC          31 :                     $$ = (Node *) n;
                              10269                 :                 }
  668 tgl                     10270 ECB             :             | ALTER PROCEDURE function_with_argtypes OWNER TO RoleSpec
 1956 peter_e                 10271                 :                 {
 1956 peter_e                 10272 CBC           9 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10273 ECB             : 
 1956 peter_e                 10274 GIC           9 :                     n->objectType = OBJECT_PROCEDURE;
                              10275               9 :                     n->object = (Node *) $3;
                              10276               9 :                     n->newowner = $6;
  331 peter                   10277 CBC           9 :                     $$ = (Node *) n;
                              10278                 :                 }
  668 tgl                     10279 ECB             :             | ALTER ROUTINE function_with_argtypes OWNER TO RoleSpec
 1956 peter_e                 10280                 :                 {
 1956 peter_e                 10281 LBC           0 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10282 ECB             : 
 1956 peter_e                 10283 UIC           0 :                     n->objectType = OBJECT_ROUTINE;
                              10284               0 :                     n->object = (Node *) $3;
                              10285               0 :                     n->newowner = $6;
  331 peter                   10286 LBC           0 :                     $$ = (Node *) n;
                              10287                 :                 }
 2953 alvherre                10288 ECB             :             | ALTER SCHEMA name OWNER TO RoleSpec
 6862 tgl                     10289                 :                 {
 6862 tgl                     10290 CBC          26 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10291 ECB             : 
 6862 tgl                     10292 GIC          26 :                     n->objectType = OBJECT_SCHEMA;
 2339 peter_e                 10293              26 :                     n->object = (Node *) makeString($3);
 6862 tgl                     10294              26 :                     n->newowner = $6;
  331 peter                   10295 CBC          26 :                     $$ = (Node *) n;
                              10296                 :                 }
 2953 alvherre                10297 ECB             :             | ALTER TYPE_P any_name OWNER TO RoleSpec
 6862 tgl                     10298                 :                 {
 6862 tgl                     10299 CBC          31 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10300 ECB             : 
 6862 tgl                     10301 GIC          31 :                     n->objectType = OBJECT_TYPE;
 2339 peter_e                 10302              31 :                     n->object = (Node *) $3;
 6862 tgl                     10303              31 :                     n->newowner = $6;
  331 peter                   10304 CBC          31 :                     $$ = (Node *) n;
                              10305                 :                 }
 2953 alvherre                10306 ECB             :             | ALTER TABLESPACE name OWNER TO RoleSpec
 6862 tgl                     10307                 :                 {
 6862 tgl                     10308 CBC           3 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10309 ECB             : 
 6862 tgl                     10310 GIC           3 :                     n->objectType = OBJECT_TABLESPACE;
 2339 peter_e                 10311               3 :                     n->object = (Node *) makeString($3);
 6862 tgl                     10312               3 :                     n->newowner = $6;
  331 peter                   10313 CBC           3 :                     $$ = (Node *) n;
                              10314                 :                 }
 2207 alvherre                10315 ECB             :             | ALTER STATISTICS any_name OWNER TO RoleSpec
                              10316                 :                 {
 2207 alvherre                10317 CBC          16 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10318 ECB             : 
 2207 alvherre                10319 GIC          16 :                     n->objectType = OBJECT_STATISTIC_EXT;
                              10320              16 :                     n->object = (Node *) $3;
                              10321              16 :                     n->newowner = $6;
  331 peter                   10322 CBC          16 :                     $$ = (Node *) n;
                              10323                 :                 }
 2953 alvherre                10324 ECB             :             | ALTER TEXT_P SEARCH DICTIONARY any_name OWNER TO RoleSpec
 5710 tgl                     10325                 :                 {
 5710 tgl                     10326 CBC          21 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10327 ECB             : 
 5710 tgl                     10328 GIC          21 :                     n->objectType = OBJECT_TSDICTIONARY;
 2339 peter_e                 10329              21 :                     n->object = (Node *) $5;
 5710 tgl                     10330              21 :                     n->newowner = $8;
  331 peter                   10331 CBC          21 :                     $$ = (Node *) n;
                              10332                 :                 }
 2953 alvherre                10333 ECB             :             | ALTER TEXT_P SEARCH CONFIGURATION any_name OWNER TO RoleSpec
 5710 tgl                     10334                 :                 {
 5710 tgl                     10335 CBC          16 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10336 ECB             : 
 5710 tgl                     10337 GIC          16 :                     n->objectType = OBJECT_TSCONFIGURATION;
 2339 peter_e                 10338              16 :                     n->object = (Node *) $5;
 5710 tgl                     10339              16 :                     n->newowner = $8;
  331 peter                   10340 CBC          16 :                     $$ = (Node *) n;
                              10341                 :                 }
 2953 alvherre                10342 ECB             :             | ALTER FOREIGN DATA_P WRAPPER name OWNER TO RoleSpec
 5224 peter_e                 10343                 :                 {
 5224 peter_e                 10344 CBC          10 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10345 ECB             : 
 5224 peter_e                 10346 GIC          10 :                     n->objectType = OBJECT_FDW;
 2339                         10347              10 :                     n->object = (Node *) makeString($5);
 5224                         10348              10 :                     n->newowner = $8;
  331 peter                   10349 CBC          10 :                     $$ = (Node *) n;
                              10350                 :                 }
 2953 alvherre                10351 ECB             :             | ALTER SERVER name OWNER TO RoleSpec
 5224 peter_e                 10352                 :                 {
 5224 peter_e                 10353 CBC          34 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10354 ECB             : 
 5224 peter_e                 10355 GIC          34 :                     n->objectType = OBJECT_FOREIGN_SERVER;
 2339                         10356              34 :                     n->object = (Node *) makeString($3);
 5224                         10357              34 :                     n->newowner = $6;
  331 peter                   10358 CBC          34 :                     $$ = (Node *) n;
                              10359                 :                 }
 2953 alvherre                10360 ECB             :             | ALTER EVENT TRIGGER name OWNER TO RoleSpec
 3917 rhaas                   10361                 :                 {
 3917 rhaas                   10362 CBC           6 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10363 ECB             : 
 3917 rhaas                   10364 GIC           6 :                     n->objectType = OBJECT_EVENT_TRIGGER;
 2339 peter_e                 10365               6 :                     n->object = (Node *) makeString($4);
 3917 rhaas                   10366               6 :                     n->newowner = $7;
  331 peter                   10367 CBC           6 :                     $$ = (Node *) n;
                              10368                 :                 }
 2271 peter_e                 10369 ECB             :             | ALTER PUBLICATION name OWNER TO RoleSpec
                              10370                 :                 {
 2271 peter_e                 10371 CBC          12 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10372 ECB             : 
 2271 peter_e                 10373 GIC          12 :                     n->objectType = OBJECT_PUBLICATION;
 2339                         10374              12 :                     n->object = (Node *) makeString($3);
 2271                         10375              12 :                     n->newowner = $6;
  331 peter                   10376 GBC          12 :                     $$ = (Node *) n;
                              10377                 :                 }
 2271 peter_e                 10378 EUB             :             | ALTER SUBSCRIPTION name OWNER TO RoleSpec
                              10379                 :                 {
 2271 peter_e                 10380 GBC           6 :                     AlterOwnerStmt *n = makeNode(AlterOwnerStmt);
  331 peter                   10381 EUB             : 
 2271 peter_e                 10382 GIC           6 :                     n->objectType = OBJECT_SUBSCRIPTION;
 2339                         10383               6 :                     n->object = (Node *) makeString($3);
 2271                         10384               6 :                     n->newowner = $6;
  331 peter                   10385 CBC           6 :                     $$ = (Node *) n;
                              10386                 :                 }
 2271 peter_e                 10387 ECB             :         ;
                              10388                 : 
                              10389                 : 
                              10390                 : /*****************************************************************************
                              10391                 :  *
                              10392                 :  * CREATE PUBLICATION name [WITH options]
                              10393                 :  *
  529 akapila                 10394                 :  * CREATE PUBLICATION FOR ALL TABLES [WITH options]
                              10395                 :  *
  381 tomas.vondra            10396                 :  * CREATE PUBLICATION FOR pub_obj [, ...] [WITH options]
 2271 peter_e                 10397                 :  *
  367 tomas.vondra            10398                 :  * pub_obj is one of:
                              10399                 :  *
                              10400                 :  *      TABLE table [, ...]
                              10401                 :  *      TABLES IN SCHEMA schema [, ...]
                              10402                 :  *
 2271 peter_e                 10403                 :  *****************************************************************************/
                              10404                 : 
                              10405                 : CreatePublicationStmt:
  529 akapila                 10406                 :             CREATE PUBLICATION name opt_definition
 2271 peter_e                 10407                 :                 {
 2271 peter_e                 10408 CBC          51 :                     CreatePublicationStmt *n = makeNode(CreatePublicationStmt);
                              10409                 : 
 2271 peter_e                 10410 GIC          51 :                     n->pubname = $3;
  529 akapila                 10411              51 :                     n->options = $4;
  331 peter                   10412 CBC          51 :                     $$ = (Node *) n;
                              10413                 :                 }
  367 tomas.vondra            10414 ECB             :             | CREATE PUBLICATION name FOR ALL TABLES opt_definition
  529 akapila                 10415                 :                 {
  529 akapila                 10416 CBC          24 :                     CreatePublicationStmt *n = makeNode(CreatePublicationStmt);
  331 peter                   10417 ECB             : 
  529 akapila                 10418 GIC          24 :                     n->pubname = $3;
                              10419              24 :                     n->options = $7;
  367 tomas.vondra            10420              24 :                     n->for_all_tables = true;
  331 peter                   10421 CBC          24 :                     $$ = (Node *) n;
                              10422                 :                 }
  529 akapila                 10423 ECB             :             | CREATE PUBLICATION name FOR pub_obj_list opt_definition
                              10424                 :                 {
  529 akapila                 10425 CBC         262 :                     CreatePublicationStmt *n = makeNode(CreatePublicationStmt);
  331 peter                   10426 ECB             : 
  529 akapila                 10427 GIC         262 :                     n->pubname = $3;
                              10428             262 :                     n->options = $6;
  331 peter                   10429             262 :                     n->pubobjects = (List *) $5;
  529 akapila                 10430 CBC         262 :                     preprocess_pubobj_list(n->pubobjects, yyscanner);
  331 peter                   10431 GIC         253 :                     $$ = (Node *) n;
 2271 peter_e                 10432 ECB             :                 }
 6862 tgl                     10433                 :         ;
                              10434                 : 
  529 akapila                 10435                 : /*
                              10436                 :  * FOR TABLE and FOR TABLES IN SCHEMA specifications
                              10437                 :  *
                              10438                 :  * This rule parses publication objects with and without keyword prefixes.
                              10439                 :  *
                              10440                 :  * The actual type of the object without keyword prefix depends on the previous
                              10441                 :  * one with keyword prefix. It will be preprocessed in preprocess_pubobj_list().
                              10442                 :  *
                              10443                 :  * For the object without keyword prefix, we cannot just use relation_expr here,
                              10444                 :  * because some extended expressions in relation_expr cannot be used as a
                              10445                 :  * schemaname and we cannot differentiate it. So, we extract the rules from
                              10446                 :  * relation_expr here.
                              10447                 :  */
                              10448                 : PublicationObjSpec:
                              10449                 :             TABLE relation_expr opt_column_list OptWhereClause
 2271 peter_e                 10450                 :                 {
  529 akapila                 10451 CBC         566 :                     $$ = makeNode(PublicationObjSpec);
                              10452             566 :                     $$->pubobjtype = PUBLICATIONOBJ_TABLE;
                              10453             566 :                     $$->pubtable = makeNode(PublicationTable);
  529 akapila                 10454 GIC         566 :                     $$->pubtable->relation = $2;
  379 tomas.vondra            10455             566 :                     $$->pubtable->columns = $3;
                              10456             566 :                     $$->pubtable->whereClause = $4;
 2271 peter_e                 10457 ECB             :                 }
                              10458                 :             | TABLES IN_P SCHEMA ColId
                              10459                 :                 {
  529 akapila                 10460 CBC         163 :                     $$ = makeNode(PublicationObjSpec);
  465 alvherre                10461             163 :                     $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_SCHEMA;
  199                         10462             163 :                     $$->name = $4;
  199 alvherre                10463 GIC         163 :                     $$->location = @4;
                              10464                 :                 }
                              10465                 :             | TABLES IN_P SCHEMA CURRENT_SCHEMA
  529 akapila                 10466 ECB             :                 {
  529 akapila                 10467 GIC           9 :                     $$ = makeNode(PublicationObjSpec);
  465 alvherre                10468 CBC           9 :                     $$->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA;
  199                         10469               9 :                     $$->location = @4;
  529 akapila                 10470 ECB             :                 }
  379 tomas.vondra            10471                 :             | ColId opt_column_list OptWhereClause
                              10472                 :                 {
  529 akapila                 10473 GIC          64 :                     $$ = makeNode(PublicationObjSpec);
                              10474              64 :                     $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
  379 tomas.vondra            10475 ECB             :                     /*
                              10476                 :                      * If either a row filter or column list is specified, create
                              10477                 :                      * a PublicationTable object.
                              10478                 :                      */
  379 tomas.vondra            10479 CBC          64 :                     if ($2 || $3)
  411 akapila                 10480 ECB             :                     {
                              10481                 :                         /*
                              10482                 :                          * The OptWhereClause must be stored here but it is
                              10483                 :                          * valid only for tables. For non-table objects, an
                              10484                 :                          * error will be thrown later via
                              10485                 :                          * preprocess_pubobj_list().
                              10486                 :                          */
  411 akapila                 10487 GIC          21 :                         $$->pubtable = makeNode(PublicationTable);
                              10488              21 :                         $$->pubtable->relation = makeRangeVar(NULL, $1, @1);
  379 tomas.vondra            10489              21 :                         $$->pubtable->columns = $2;
                              10490              21 :                         $$->pubtable->whereClause = $3;
                              10491                 :                     }
                              10492                 :                     else
                              10493                 :                     {
  411 akapila                 10494              43 :                         $$->name = $1;
                              10495                 :                     }
  529                         10496              64 :                     $$->location = @1;
                              10497                 :                 }
                              10498                 :             | ColId indirection opt_column_list OptWhereClause
                              10499                 :                 {
                              10500              13 :                     $$ = makeNode(PublicationObjSpec);
                              10501              13 :                     $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
                              10502              13 :                     $$->pubtable = makeNode(PublicationTable);
  529 akapila                 10503 CBC          13 :                     $$->pubtable->relation = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner);
  379 tomas.vondra            10504 GIC          13 :                     $$->pubtable->columns = $3;
  379 tomas.vondra            10505 CBC          13 :                     $$->pubtable->whereClause = $4;
  529 akapila                 10506              13 :                     $$->location = @1;
  529 akapila                 10507 ECB             :                 }
                              10508                 :             /* grammar like tablename * , ONLY tablename, ONLY ( tablename ) */
                              10509                 :             | extended_relation_expr opt_column_list OptWhereClause
                              10510                 :                 {
  529 akapila                 10511 CBC           3 :                     $$ = makeNode(PublicationObjSpec);
  529 akapila                 10512 GIC           3 :                     $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
  529 akapila                 10513 CBC           3 :                     $$->pubtable = makeNode(PublicationTable);
                              10514               3 :                     $$->pubtable->relation = $1;
  379 tomas.vondra            10515               3 :                     $$->pubtable->columns = $2;
                              10516               3 :                     $$->pubtable->whereClause = $3;
                              10517                 :                 }
                              10518                 :             | CURRENT_SCHEMA
                              10519                 :                 {
  529 akapila                 10520               6 :                     $$ = makeNode(PublicationObjSpec);
  529 akapila                 10521 GIC           6 :                     $$->pubobjtype = PUBLICATIONOBJ_CONTINUATION;
  529 akapila                 10522 CBC           6 :                     $$->location = @1;
  529 akapila                 10523 ECB             :                 }
                              10524                 :                 ;
 2271 peter_e                 10525                 : 
  331 peter                   10526                 : pub_obj_list:   PublicationObjSpec
  580 alvherre                10527 GIC         719 :                     { $$ = list_make1($1); }
                              10528                 :             | pub_obj_list ',' PublicationObjSpec
  529 akapila                 10529             105 :                     { $$ = lappend($1, $3); }
                              10530                 :     ;
                              10531                 : 
                              10532                 : /*****************************************************************************
                              10533                 :  *
                              10534                 :  * ALTER PUBLICATION name SET ( options )
                              10535                 :  *
                              10536                 :  * ALTER PUBLICATION name ADD pub_obj [, ...]
                              10537                 :  *
                              10538                 :  * ALTER PUBLICATION name DROP pub_obj [, ...]
                              10539                 :  *
                              10540                 :  * ALTER PUBLICATION name SET pub_obj [, ...]
                              10541                 :  *
                              10542                 :  * pub_obj is one of:
                              10543                 :  *
                              10544                 :  *      TABLE table_name [, ...]
                              10545                 :  *      TABLES IN SCHEMA schema_name [, ...]
  367 tomas.vondra            10546 ECB             :  *
 2271 peter_e                 10547                 :  *****************************************************************************/
                              10548                 : 
                              10549                 : AlterPublicationStmt:
 2158                         10550                 :             ALTER PUBLICATION name SET definition
 2271                         10551                 :                 {
 2271 peter_e                 10552 GIC          55 :                     AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
                              10553                 : 
                              10554              55 :                     n->pubname = $3;
 2271 peter_e                 10555 CBC          55 :                     n->options = $5;
  331 peter                   10556              55 :                     $$ = (Node *) n;
 2271 peter_e                 10557 ECB             :                 }
  529 akapila                 10558                 :             | ALTER PUBLICATION name ADD_P pub_obj_list
                              10559                 :                 {
 2271 peter_e                 10560 GIC         163 :                     AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
                              10561                 : 
 2271 peter_e                 10562 CBC         163 :                     n->pubname = $3;
  529 akapila                 10563             163 :                     n->pubobjects = $5;
                              10564             163 :                     preprocess_pubobj_list(n->pubobjects, yyscanner);
  461 alvherre                10565 GIC         160 :                     n->action = AP_AddObjects;
  331 peter                   10566             160 :                     $$ = (Node *) n;
                              10567                 :                 }
  529 akapila                 10568 ECB             :             | ALTER PUBLICATION name SET pub_obj_list
 2271 peter_e                 10569                 :                 {
 2271 peter_e                 10570 GIC         220 :                     AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
                              10571                 : 
                              10572             220 :                     n->pubname = $3;
  529 akapila                 10573             220 :                     n->pubobjects = $5;
  529 akapila                 10574 CBC         220 :                     preprocess_pubobj_list(n->pubobjects, yyscanner);
  461 alvherre                10575 GIC         220 :                     n->action = AP_SetObjects;
  331 peter                   10576             220 :                     $$ = (Node *) n;
                              10577                 :                 }
                              10578                 :             | ALTER PUBLICATION name DROP pub_obj_list
                              10579                 :                 {
 2271 peter_e                 10580              74 :                     AlterPublicationStmt *n = makeNode(AlterPublicationStmt);
                              10581                 : 
 2271 peter_e                 10582 CBC          74 :                     n->pubname = $3;
  529 akapila                 10583              74 :                     n->pubobjects = $5;
                              10584              74 :                     preprocess_pubobj_list(n->pubobjects, yyscanner);
  461 alvherre                10585              74 :                     n->action = AP_DropObjects;
  331 peter                   10586 GIC          74 :                     $$ = (Node *) n;
                              10587                 :                 }
                              10588                 :         ;
 2271 peter_e                 10589 ECB             : 
                              10590                 : /*****************************************************************************
                              10591                 :  *
                              10592                 :  * CREATE SUBSCRIPTION name ...
                              10593                 :  *
                              10594                 :  *****************************************************************************/
                              10595                 : 
                              10596                 : CreateSubscriptionStmt:
  856 peter                   10597                 :             CREATE SUBSCRIPTION name CONNECTION Sconst PUBLICATION name_list opt_definition
 2271 peter_e                 10598                 :                 {
 2271 peter_e                 10599 CBC         177 :                     CreateSubscriptionStmt *n =
                              10600             177 :                         makeNode(CreateSubscriptionStmt);
                              10601             177 :                     n->subname = $3;
 2271 peter_e                 10602 GIC         177 :                     n->conninfo = $5;
                              10603             177 :                     n->publication = $7;
                              10604             177 :                     n->options = $8;
  331 peter                   10605             177 :                     $$ = (Node *) n;
 2271 peter_e                 10606 ECB             :                 }
                              10607                 :         ;
                              10608                 : 
                              10609                 : /*****************************************************************************
                              10610                 :  *
 2158                         10611                 :  * ALTER SUBSCRIPTION name ...
                              10612                 :  *
                              10613                 :  *****************************************************************************/
                              10614                 : 
 2271                         10615                 : AlterSubscriptionStmt:
 2158                         10616                 :             ALTER SUBSCRIPTION name SET definition
 2271                         10617                 :                 {
 2271 peter_e                 10618 GIC          78 :                     AlterSubscriptionStmt *n =
                              10619              78 :                         makeNode(AlterSubscriptionStmt);
                              10620                 : 
 2208                         10621              78 :                     n->kind = ALTER_SUBSCRIPTION_OPTIONS;
 2271 peter_e                 10622 CBC          78 :                     n->subname = $3;
 2271 peter_e                 10623 GIC          78 :                     n->options = $5;
  331 peter                   10624 CBC          78 :                     $$ = (Node *) n;
                              10625                 :                 }
                              10626                 :             | ALTER SUBSCRIPTION name CONNECTION Sconst
                              10627                 :                 {
 2271 peter_e                 10628 GIC          10 :                     AlterSubscriptionStmt *n =
                              10629              10 :                         makeNode(AlterSubscriptionStmt);
                              10630                 : 
 2208                         10631              10 :                     n->kind = ALTER_SUBSCRIPTION_CONNECTION;
 2271                         10632              10 :                     n->subname = $3;
 2208                         10633              10 :                     n->conninfo = $5;
  331 peter                   10634              10 :                     $$ = (Node *) n;
                              10635                 :                 }
                              10636                 :             | ALTER SUBSCRIPTION name REFRESH PUBLICATION opt_definition
                              10637                 :                 {
 2208 peter_e                 10638              26 :                     AlterSubscriptionStmt *n =
                              10639              26 :                         makeNode(AlterSubscriptionStmt);
                              10640                 : 
                              10641              26 :                     n->kind = ALTER_SUBSCRIPTION_REFRESH;
                              10642              26 :                     n->subname = $3;
                              10643              26 :                     n->options = $6;
  331 peter                   10644              26 :                     $$ = (Node *) n;
                              10645                 :                 }
                              10646                 :             | ALTER SUBSCRIPTION name ADD_P PUBLICATION name_list opt_definition
  733 peter                   10647 ECB             :                 {
  733 peter                   10648 GIC          14 :                     AlterSubscriptionStmt *n =
  733 peter                   10649 CBC          14 :                         makeNode(AlterSubscriptionStmt);
  331 peter                   10650 ECB             : 
  733 peter                   10651 CBC          14 :                     n->kind = ALTER_SUBSCRIPTION_ADD_PUBLICATION;
  733 peter                   10652 GIC          14 :                     n->subname = $3;
                              10653              14 :                     n->publication = $6;
                              10654              14 :                     n->options = $7;
  331 peter                   10655 CBC          14 :                     $$ = (Node *) n;
                              10656                 :                 }
  733 peter                   10657 ECB             :             | ALTER SUBSCRIPTION name DROP PUBLICATION name_list opt_definition
                              10658                 :                 {
  733 peter                   10659 CBC          13 :                     AlterSubscriptionStmt *n =
                              10660              13 :                         makeNode(AlterSubscriptionStmt);
  331 peter                   10661 ECB             : 
  733 peter                   10662 GIC          13 :                     n->kind = ALTER_SUBSCRIPTION_DROP_PUBLICATION;
                              10663              13 :                     n->subname = $3;
                              10664              13 :                     n->publication = $6;
  733 peter                   10665 CBC          13 :                     n->options = $7;
  331 peter                   10666 GIC          13 :                     $$ = (Node *) n;
  733 peter                   10667 ECB             :                 }
  856                         10668                 :             | ALTER SUBSCRIPTION name SET PUBLICATION name_list opt_definition
 2271 peter_e                 10669                 :                 {
 2271 peter_e                 10670 CBC          30 :                     AlterSubscriptionStmt *n =
                              10671              30 :                         makeNode(AlterSubscriptionStmt);
                              10672                 : 
  733 peter                   10673 GIC          30 :                     n->kind = ALTER_SUBSCRIPTION_SET_PUBLICATION;
 2271 peter_e                 10674              30 :                     n->subname = $3;
 2208 peter_e                 10675 CBC          30 :                     n->publication = $6;
 2134 peter_e                 10676 GIC          30 :                     n->options = $7;
  331 peter                   10677 CBC          30 :                     $$ = (Node *) n;
 2271 peter_e                 10678 ECB             :                 }
                              10679                 :             | ALTER SUBSCRIPTION name ENABLE_P
                              10680                 :                 {
 2271 peter_e                 10681 CBC          13 :                     AlterSubscriptionStmt *n =
 2271 peter_e                 10682 GIC          13 :                         makeNode(AlterSubscriptionStmt);
                              10683                 : 
 2208                         10684              13 :                     n->kind = ALTER_SUBSCRIPTION_ENABLED;
 2271                         10685              13 :                     n->subname = $3;
                              10686              13 :                     n->options = list_make1(makeDefElem("enabled",
                              10687                 :                                             (Node *) makeBoolean(true), @1));
  331 peter                   10688              13 :                     $$ = (Node *) n;
                              10689                 :                 }
                              10690                 :             | ALTER SUBSCRIPTION name DISABLE_P
                              10691                 :                 {
 2271 peter_e                 10692               8 :                     AlterSubscriptionStmt *n =
                              10693               8 :                         makeNode(AlterSubscriptionStmt);
  331 peter                   10694 ECB             : 
 2208 peter_e                 10695 CBC           8 :                     n->kind = ALTER_SUBSCRIPTION_ENABLED;
 2271                         10696               8 :                     n->subname = $3;
                              10697               8 :                     n->options = list_make1(makeDefElem("enabled",
  331 peter                   10698 ECB             :                                             (Node *) makeBoolean(false), @1));
  331 peter                   10699 CBC           8 :                     $$ = (Node *) n;
 2208 peter_e                 10700 ECB             :                 }
                              10701                 :             | ALTER SUBSCRIPTION name SKIP definition
                              10702                 :                 {
  383 akapila                 10703 GIC          12 :                     AlterSubscriptionStmt *n =
                              10704              12 :                         makeNode(AlterSubscriptionStmt);
                              10705                 : 
                              10706              12 :                     n->kind = ALTER_SUBSCRIPTION_SKIP;
                              10707              12 :                     n->subname = $3;
                              10708              12 :                     n->options = $5;
  331 peter                   10709              12 :                     $$ = (Node *) n;
                              10710                 :                 }
                              10711                 :         ;
                              10712                 : 
 2271 peter_e                 10713 ECB             : /*****************************************************************************
                              10714                 :  *
                              10715                 :  * DROP SUBSCRIPTION [ IF EXISTS ] name
                              10716                 :  *
                              10717                 :  *****************************************************************************/
                              10718                 : 
 2161                         10719                 : DropSubscriptionStmt: DROP SUBSCRIPTION name opt_drop_behavior
                              10720                 :                 {
 2271 peter_e                 10721 GIC          75 :                     DropSubscriptionStmt *n = makeNode(DropSubscriptionStmt);
                              10722                 : 
 2271 peter_e                 10723 CBC          75 :                     n->subname = $3;
                              10724              75 :                     n->missing_ok = false;
 2161 peter_e                 10725 GIC          75 :                     n->behavior = $4;
 2271 peter_e                 10726 CBC          75 :                     $$ = (Node *) n;
 2271 peter_e                 10727 ECB             :                 }
 2161                         10728                 :                 |  DROP SUBSCRIPTION IF_P EXISTS name opt_drop_behavior
 2271                         10729                 :                 {
 2271 peter_e                 10730 GIC           3 :                     DropSubscriptionStmt *n = makeNode(DropSubscriptionStmt);
                              10731                 : 
                              10732               3 :                     n->subname = $5;
 2271 peter_e                 10733 CBC           3 :                     n->missing_ok = true;
 2161                         10734               3 :                     n->behavior = $6;
 2271 peter_e                 10735 GIC           3 :                     $$ = (Node *) n;
 2271 peter_e                 10736 ECB             :                 }
                              10737                 :         ;
                              10738                 : 
 9770 scrappy                 10739                 : /*****************************************************************************
                              10740                 :  *
                              10741                 :  *      QUERY:  Define Rewrite Rule
                              10742                 :  *
                              10743                 :  *****************************************************************************/
                              10744                 : 
                              10745                 : RuleStmt:   CREATE opt_or_replace RULE name AS
 7658 lockhart                10746                 :             ON event TO qualified_name where_clause
                              10747                 :             DO opt_instead RuleActionList
 9344 bruce                   10748                 :                 {
  331 peter                   10749 CBC        1031 :                     RuleStmt   *n = makeNode(RuleStmt);
  331 peter                   10750 ECB             : 
 7524 tgl                     10751 GIC        1031 :                     n->replace = $2;
 4903                         10752            1031 :                     n->relation = $9;
 7524                         10753            1031 :                     n->rulename = $4;
 4903 tgl                     10754 CBC        1031 :                     n->whereClause = $10;
                              10755            1031 :                     n->event = $7;
 4903 tgl                     10756 GIC        1031 :                     n->instead = $12;
 4903 tgl                     10757 CBC        1031 :                     n->actions = $13;
  331 peter                   10758            1031 :                     $$ = (Node *) n;
 9344 bruce                   10759 ECB             :                 }
                              10760                 :         ;
                              10761                 : 
                              10762                 : RuleActionList:
 7601 bruce                   10763 GIC         336 :             NOTHING                                 { $$ = NIL; }
 6888 neilc                   10764             672 :             | RuleActionStmt                        { $$ = list_make1($1); }
 7601 bruce                   10765 CBC          23 :             | '(' RuleActionMulti ')'               { $$ = $2; }
 9344 bruce                   10766 ECB             :         ;
                              10767                 : 
 8585 tgl                     10768                 : /* the thrashing around here is to discard "empty" statements... */
 7601 bruce                   10769                 : RuleActionMulti:
                              10770                 :             RuleActionMulti ';' RuleActionStmtOrEmpty
 7032 neilc                   10771 CBC          31 :                 { if ($3 != NULL)
 8198 bruce                   10772              23 :                     $$ = lappend($1, $3);
                              10773                 :                   else
 8585 tgl                     10774 GIC           8 :                     $$ = $1;
                              10775                 :                 }
 7601 bruce                   10776 ECB             :             | RuleActionStmtOrEmpty
 7032 neilc                   10777 CBC          23 :                 { if ($1 != NULL)
 6888 neilc                   10778 GIC          23 :                     $$ = list_make1($1);
 8585 tgl                     10779 ECB             :                   else
 8585 tgl                     10780 LBC           0 :                     $$ = NIL;
 8585 tgl                     10781 ECB             :                 }
                              10782                 :         ;
 9351 lockhart                10783                 : 
                              10784                 : RuleActionStmt:
                              10785                 :             SelectStmt
                              10786                 :             | InsertStmt
 7601 bruce                   10787                 :             | UpdateStmt
                              10788                 :             | DeleteStmt
                              10789                 :             | NotifyStmt
 8827 JanWieck                10790                 :         ;
                              10791                 : 
 7601 bruce                   10792                 : RuleActionStmtOrEmpty:
 7601 bruce                   10793 GIC          46 :             RuleActionStmt                          { $$ = $1; }
 7032 neilc                   10794 CBC           8 :             |   /*EMPTY*/                           { $$ = NULL; }
                              10795                 :         ;
                              10796                 : 
 7601 bruce                   10797 GIC           9 : event:      SELECT                                  { $$ = CMD_SELECT; }
 7601 bruce                   10798 CBC         719 :             | UPDATE                                { $$ = CMD_UPDATE; }
                              10799              76 :             | DELETE_P                              { $$ = CMD_DELETE; }
 7601 bruce                   10800 GIC         227 :             | INSERT                                { $$ = CMD_INSERT; }
 9344 bruce                   10801 ECB             :          ;
 9770 scrappy                 10802                 : 
 7601 bruce                   10803                 : opt_instead:
 2062 peter_e                 10804 CBC         616 :             INSTEAD                                 { $$ = true; }
 2062 peter_e                 10805 GIC          68 :             | ALSO                                  { $$ = false; }
                              10806             347 :             | /*EMPTY*/                             { $$ = false; }
                              10807                 :         ;
                              10808                 : 
                              10809                 : 
                              10810                 : /*****************************************************************************
                              10811                 :  *
                              10812                 :  *      QUERY:
                              10813                 :  *              NOTIFY <identifier> can appear both in rule bodies and
                              10814                 :  *              as a query-level command
                              10815                 :  *
 9770 scrappy                 10816 ECB             :  *****************************************************************************/
                              10817                 : 
 4800 tgl                     10818                 : NotifyStmt: NOTIFY ColId notify_payload
 9344 bruce                   10819                 :                 {
 9344 bruce                   10820 CBC          60 :                     NotifyStmt *n = makeNode(NotifyStmt);
  331 peter                   10821 ECB             : 
 5333 tgl                     10822 GIC          60 :                     n->conditionname = $2;
 4800                         10823              60 :                     n->payload = $3;
  331 peter                   10824              60 :                     $$ = (Node *) n;
 9344 bruce                   10825 ECB             :                 }
                              10826                 :         ;
 9770 scrappy                 10827                 : 
 4800 tgl                     10828                 : notify_payload:
 4800 tgl                     10829 CBC          31 :             ',' Sconst                          { $$ = $2; }
                              10830              29 :             | /*EMPTY*/                         { $$ = NULL; }
                              10831                 :         ;
                              10832                 : 
                              10833                 : ListenStmt: LISTEN ColId
                              10834                 :                 {
 9344 bruce                   10835 GIC          37 :                     ListenStmt *n = makeNode(ListenStmt);
                              10836                 : 
 5333 tgl                     10837              37 :                     n->conditionname = $2;
  331 peter                   10838              37 :                     $$ = (Node *) n;
                              10839                 :                 }
                              10840                 :         ;
                              10841                 : 
                              10842                 : UnlistenStmt:
                              10843                 :             UNLISTEN ColId
 8993 scrappy                 10844 ECB             :                 {
 8993 scrappy                 10845 GIC           3 :                     UnlistenStmt *n = makeNode(UnlistenStmt);
  331 peter                   10846 ECB             : 
 5333 tgl                     10847 CBC           3 :                     n->conditionname = $2;
  331 peter                   10848               3 :                     $$ = (Node *) n;
 8993 scrappy                 10849 ECB             :                 }
 7601 bruce                   10850                 :             | UNLISTEN '*'
 8948 lockhart                10851                 :                 {
 8948 lockhart                10852 CBC          16 :                     UnlistenStmt *n = makeNode(UnlistenStmt);
  331 peter                   10853 ECB             : 
 5333 tgl                     10854 GIC          16 :                     n->conditionname = NULL;
  331 peter                   10855              16 :                     $$ = (Node *) n;
                              10856                 :                 }
                              10857                 :         ;
 8993 scrappy                 10858 ECB             : 
 9770                         10859                 : 
                              10860                 : /*****************************************************************************
                              10861                 :  *
                              10862                 :  *      Transactions:
                              10863                 :  *
                              10864                 :  *      BEGIN / COMMIT / ROLLBACK
                              10865                 :  *      (also older versions END / ABORT)
 9351 lockhart                10866                 :  *
 9770 scrappy                 10867                 :  *****************************************************************************/
                              10868                 : 
 7601 bruce                   10869                 : TransactionStmt:
                              10870                 :             ABORT_P opt_transaction opt_transaction_chain
                              10871                 :                 {
 9344 bruce                   10872 CBC          97 :                     TransactionStmt *n = makeNode(TransactionStmt);
  331 peter                   10873 ECB             : 
 7363 tgl                     10874 GIC          97 :                     n->kind = TRANS_STMT_ROLLBACK;
 7553 bruce                   10875 GBC          97 :                     n->options = NIL;
 1477 peter                   10876 GIC          97 :                     n->chain = $3;
  331                         10877              97 :                     $$ = (Node *) n;
                              10878                 :                 }
                              10879                 :             | START TRANSACTION transaction_mode_list_or_empty
                              10880                 :                 {
 9344 bruce                   10881             761 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              10882                 : 
 7363 tgl                     10883             761 :                     n->kind = TRANS_STMT_START;
 7553 bruce                   10884             761 :                     n->options = $3;
  331 peter                   10885             761 :                     $$ = (Node *) n;
                              10886                 :                 }
                              10887                 :             | COMMIT opt_transaction opt_transaction_chain
 8281 lockhart                10888 ECB             :                 {
 8281 lockhart                10889 CBC        5487 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              10890                 : 
 7363 tgl                     10891 GIC        5487 :                     n->kind = TRANS_STMT_COMMIT;
 7553 bruce                   10892 CBC        5487 :                     n->options = NIL;
 1477 peter                   10893            5487 :                     n->chain = $3;
  331                         10894            5487 :                     $$ = (Node *) n;
 8281 lockhart                10895 ECB             :                 }
                              10896                 :             | ROLLBACK opt_transaction opt_transaction_chain
                              10897                 :                 {
 9344 bruce                   10898 GIC        1070 :                     TransactionStmt *n = makeNode(TransactionStmt);
  331 peter                   10899 ECB             : 
 7363 tgl                     10900 CBC        1070 :                     n->kind = TRANS_STMT_ROLLBACK;
 7553 bruce                   10901            1070 :                     n->options = NIL;
 1477 peter                   10902 GIC        1070 :                     n->chain = $3;
  331                         10903            1070 :                     $$ = (Node *) n;
                              10904                 :                 }
                              10905                 :             | SAVEPOINT ColId
                              10906                 :                 {
 6830 tgl                     10907            1000 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              10908                 : 
                              10909            1000 :                     n->kind = TRANS_STMT_SAVEPOINT;
 1878 peter_e                 10910            1000 :                     n->savepoint_name = $2;
  331 peter                   10911            1000 :                     $$ = (Node *) n;
                              10912                 :                 }
                              10913                 :             | RELEASE SAVEPOINT ColId
                              10914                 :                 {
 6814 tgl                     10915 CBC         102 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              10916                 : 
                              10917             102 :                     n->kind = TRANS_STMT_RELEASE;
 1878 peter_e                 10918             102 :                     n->savepoint_name = $3;
  331 peter                   10919             102 :                     $$ = (Node *) n;
                              10920                 :                 }
                              10921                 :             | RELEASE ColId
                              10922                 :                 {
 6830 tgl                     10923 GIC          42 :                     TransactionStmt *n = makeNode(TransactionStmt);
  331 peter                   10924 ECB             : 
 6830 tgl                     10925 CBC          42 :                     n->kind = TRANS_STMT_RELEASE;
 1878 peter_e                 10926 GIC          42 :                     n->savepoint_name = $2;
  331 peter                   10927              42 :                     $$ = (Node *) n;
                              10928                 :                 }
                              10929                 :             | ROLLBACK opt_transaction TO SAVEPOINT ColId
 6830 tgl                     10930 ECB             :                 {
 6830 tgl                     10931 GIC         107 :                     TransactionStmt *n = makeNode(TransactionStmt);
  331 peter                   10932 ECB             : 
 6830 tgl                     10933 CBC         107 :                     n->kind = TRANS_STMT_ROLLBACK_TO;
 1878 peter_e                 10934 GIC         107 :                     n->savepoint_name = $5;
  331 peter                   10935             107 :                     $$ = (Node *) n;
                              10936                 :                 }
                              10937                 :             | ROLLBACK opt_transaction TO ColId
                              10938                 :                 {
 6814 tgl                     10939             242 :                     TransactionStmt *n = makeNode(TransactionStmt);
  331 peter                   10940 ECB             : 
 6814 tgl                     10941 GIC         242 :                     n->kind = TRANS_STMT_ROLLBACK_TO;
 1878 peter_e                 10942 CBC         242 :                     n->savepoint_name = $4;
  331 peter                   10943             242 :                     $$ = (Node *) n;
                              10944                 :                 }
                              10945                 :             | PREPARE TRANSACTION Sconst
                              10946                 :                 {
 6505 tgl                     10947             385 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              10948                 : 
                              10949             385 :                     n->kind = TRANS_STMT_PREPARE;
                              10950             385 :                     n->gid = $3;
  331 peter                   10951 GIC         385 :                     $$ = (Node *) n;
                              10952                 :                 }
                              10953                 :             | COMMIT PREPARED Sconst
                              10954                 :                 {
 6505 tgl                     10955             310 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              10956                 : 
                              10957             310 :                     n->kind = TRANS_STMT_COMMIT_PREPARED;
                              10958             310 :                     n->gid = $3;
  331 peter                   10959             310 :                     $$ = (Node *) n;
                              10960                 :                 }
                              10961                 :             | ROLLBACK PREPARED Sconst
                              10962                 :                 {
 6505 tgl                     10963              36 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              10964                 : 
                              10965              36 :                     n->kind = TRANS_STMT_ROLLBACK_PREPARED;
                              10966              36 :                     n->gid = $3;
  331 peter                   10967 CBC          36 :                     $$ = (Node *) n;
                              10968                 :                 }
 9024 bruce                   10969 ECB             :         ;
 9344                         10970                 : 
  732 peter                   10971                 : TransactionStmtLegacy:
                              10972                 :             BEGIN_P opt_transaction transaction_mode_list_or_empty
                              10973                 :                 {
  732 peter                   10974 GIC        6546 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              10975                 : 
  732 peter                   10976 CBC        6546 :                     n->kind = TRANS_STMT_BEGIN;
  732 peter                   10977 GIC        6546 :                     n->options = $3;
  331 peter                   10978 CBC        6546 :                     $$ = (Node *) n;
  732 peter                   10979 ECB             :                 }
                              10980                 :             | END_P opt_transaction opt_transaction_chain
                              10981                 :                 {
  732 peter                   10982 GIC         180 :                     TransactionStmt *n = makeNode(TransactionStmt);
                              10983                 : 
  732 peter                   10984 CBC         180 :                     n->kind = TRANS_STMT_COMMIT;
  732 peter                   10985 GIC         180 :                     n->options = NIL;
  732 peter                   10986 CBC         180 :                     n->chain = $3;
  331                         10987             180 :                     $$ = (Node *) n;
  732 peter                   10988 ECB             :                 }
                              10989                 :         ;
                              10990                 : 
                              10991                 : opt_transaction:    WORK
                              10992                 :             | TRANSACTION
  878                         10993                 :             | /*EMPTY*/
                              10994                 :         ;
 9770 scrappy                 10995                 : 
 6814 tgl                     10996                 : transaction_mode_item:
 7394 peter_e                 10997                 :             ISOLATION LEVEL iso_level
 6814 tgl                     10998 CBC        3146 :                     { $$ = makeDefElem("transaction_isolation",
 2406 peter_e                 10999 GIC        3146 :                                        makeStringConst($3, @3), @1); }
                              11000                 :             | READ ONLY
 6814 tgl                     11001             595 :                     { $$ = makeDefElem("transaction_read_only",
 2062 peter_e                 11002 CBC         595 :                                        makeIntConst(true, @1), @1); }
                              11003                 :             | READ WRITE
 6814 tgl                     11004              41 :                     { $$ = makeDefElem("transaction_read_only",
 2062 peter_e                 11005              41 :                                        makeIntConst(false, @1), @1); }
 4444 heikki.linnakangas      11006 ECB             :             | DEFERRABLE
 4444 heikki.linnakangas      11007 GIC          19 :                     { $$ = makeDefElem("transaction_deferrable",
                              11008                 :                                        makeIntConst(true, @1), @1); }
                              11009                 :             | NOT DEFERRABLE
 4444 heikki.linnakangas      11010 CBC           5 :                     { $$ = makeDefElem("transaction_deferrable",
 2062 peter_e                 11011 GIC           5 :                                        makeIntConst(false, @1), @1); }
 6814 tgl                     11012 ECB             :         ;
                              11013                 : 
                              11014                 : /* Syntax with commas is SQL-spec, without commas is Postgres historical */
                              11015                 : transaction_mode_list:
                              11016                 :             transaction_mode_item
 6814 tgl                     11017 GIC        3251 :                     { $$ = list_make1($1); }
 6814 tgl                     11018 ECB             :             | transaction_mode_list ',' transaction_mode_item
 6814 tgl                     11019 GIC         395 :                     { $$ = lappend($1, $3); }
 6814 tgl                     11020 ECB             :             | transaction_mode_list transaction_mode_item
 6814 tgl                     11021 CBC         160 :                     { $$ = lappend($1, $2); }
 7394 peter_e                 11022 ECB             :         ;
                              11023                 : 
                              11024                 : transaction_mode_list_or_empty:
                              11025                 :             transaction_mode_list
                              11026                 :             | /* EMPTY */
 7394 peter_e                 11027 GIC        4283 :                     { $$ = NIL; }
 7394 peter_e                 11028 ECB             :         ;
                              11029                 : 
 1477 peter                   11030                 : opt_transaction_chain:
 1477 peter                   11031 GIC          57 :             AND CHAIN       { $$ = true; }
                              11032               1 :             | AND NO CHAIN  { $$ = false; }
                              11033            6776 :             | /* EMPTY */   { $$ = false; }
 1477 peter                   11034 ECB             :         ;
                              11035                 : 
 7394 peter_e                 11036                 : 
 9770 scrappy                 11037                 : /*****************************************************************************
                              11038                 :  *
                              11039                 :  *  QUERY:
                              11040                 :  *      CREATE [ OR REPLACE ] [ TEMP ] VIEW <viewname> '('target-list ')'
                              11041                 :  *          AS <query> [ WITH [ CASCADED | LOCAL ] CHECK OPTION ]
                              11042                 :  *
                              11043                 :  *****************************************************************************/
                              11044                 : 
 4126 rhaas                   11045                 : ViewStmt: CREATE OptTemp VIEW qualified_name opt_column_list opt_reloptions
 6161 tgl                     11046                 :                 AS SelectStmt opt_check_option
                              11047                 :                 {
  331 peter                   11048 GIC       43942 :                     ViewStmt   *n = makeNode(ViewStmt);
                              11049                 : 
 7524 tgl                     11050 CBC       43942 :                     n->view = $4;
 4500 rhaas                   11051 GIC       43942 :                     n->view->relpersistence = $2;
 7524 tgl                     11052 CBC       43942 :                     n->aliases = $5;
 4126 rhaas                   11053           43942 :                     n->query = $8;
 5871 tgl                     11054           43942 :                     n->replace = false;
 4126 rhaas                   11055 GIC       43942 :                     n->options = $6;
 3552 sfrost                  11056           43942 :                     n->withCheckOption = $9;
 6640 neilc                   11057           43942 :                     $$ = (Node *) n;
 6640 neilc                   11058 ECB             :                 }
                              11059                 :         | CREATE OR REPLACE OptTemp VIEW qualified_name opt_column_list opt_reloptions
 6161 tgl                     11060                 :                 AS SelectStmt opt_check_option
 6640 neilc                   11061                 :                 {
  331 peter                   11062 CBC         119 :                     ViewStmt   *n = makeNode(ViewStmt);
                              11063                 : 
 6640 neilc                   11064 GIC         119 :                     n->view = $6;
 4500 rhaas                   11065             119 :                     n->view->relpersistence = $4;
 6640 neilc                   11066             119 :                     n->aliases = $7;
 4126 rhaas                   11067             119 :                     n->query = $10;
 5871 tgl                     11068             119 :                     n->replace = true;
 4126 rhaas                   11069 CBC         119 :                     n->options = $8;
 3552 sfrost                  11070 GIC         119 :                     n->withCheckOption = $11;
 6640 neilc                   11071 CBC         119 :                     $$ = (Node *) n;
 9344 bruce                   11072 ECB             :                 }
 3720 peter_e                 11073                 :         | CREATE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions
                              11074                 :                 AS SelectStmt opt_check_option
                              11075                 :                 {
  331 peter                   11076 GIC           4 :                     ViewStmt   *n = makeNode(ViewStmt);
  331 peter                   11077 ECB             : 
 3720 peter_e                 11078 GIC           4 :                     n->view = $5;
 3720 peter_e                 11079 CBC           4 :                     n->view->relpersistence = $2;
                              11080               4 :                     n->aliases = $7;
                              11081               4 :                     n->query = makeRecursiveViewSelect(n->view->relname, n->aliases, $11);
                              11082               4 :                     n->replace = false;
 3720 peter_e                 11083 GIC           4 :                     n->options = $9;
 3552 sfrost                  11084               4 :                     n->withCheckOption = $12;
                              11085               4 :                     if (n->withCheckOption != NO_CHECK_OPTION)
 3552 sfrost                  11086 UIC           0 :                         ereport(ERROR,
                              11087                 :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              11088                 :                                  errmsg("WITH CHECK OPTION not supported on recursive views"),
                              11089                 :                                  parser_errposition(@12)));
 3720 peter_e                 11090 GIC           4 :                     $$ = (Node *) n;
                              11091                 :                 }
                              11092                 :         | CREATE OR REPLACE OptTemp RECURSIVE VIEW qualified_name '(' columnList ')' opt_reloptions
 3552 sfrost                  11093 ECB             :                 AS SelectStmt opt_check_option
 3720 peter_e                 11094                 :                 {
  331 peter                   11095 GIC           3 :                     ViewStmt   *n = makeNode(ViewStmt);
  331 peter                   11096 ECB             : 
 3720 peter_e                 11097 CBC           3 :                     n->view = $7;
 3720 peter_e                 11098 GIC           3 :                     n->view->relpersistence = $4;
 3720 peter_e                 11099 CBC           3 :                     n->aliases = $9;
                              11100               3 :                     n->query = makeRecursiveViewSelect(n->view->relname, n->aliases, $13);
 3720 peter_e                 11101 GIC           3 :                     n->replace = true;
 3720 peter_e                 11102 CBC           3 :                     n->options = $11;
 3552 sfrost                  11103 GIC           3 :                     n->withCheckOption = $14;
                              11104               3 :                     if (n->withCheckOption != NO_CHECK_OPTION)
 3552 sfrost                  11105 LBC           0 :                         ereport(ERROR,
 3552 sfrost                  11106 ECB             :                                 (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              11107                 :                                  errmsg("WITH CHECK OPTION not supported on recursive views"),
                              11108                 :                                  parser_errposition(@14)));
 3720 peter_e                 11109 GIC           3 :                     $$ = (Node *) n;
                              11110                 :                 }
                              11111                 :         ;
 9770 scrappy                 11112 ECB             : 
                              11113                 : opt_check_option:
 3552 sfrost                  11114 CBC          45 :         WITH CHECK OPTION               { $$ = CASCADED_CHECK_OPTION; }
 3552 sfrost                  11115 GIC           3 :         | WITH CASCADED CHECK OPTION    { $$ = CASCADED_CHECK_OPTION; }
 3552 sfrost                  11116 CBC          12 :         | WITH LOCAL CHECK OPTION       { $$ = LOCAL_CHECK_OPTION; }
 3552 sfrost                  11117 GIC       44008 :         | /* EMPTY */                   { $$ = NO_CHECK_OPTION; }
                              11118                 :         ;
                              11119                 : 
                              11120                 : /*****************************************************************************
                              11121                 :  *
 9344 bruce                   11122 ECB             :  *      QUERY:
                              11123                 :  *              LOAD "filename"
                              11124                 :  *
                              11125                 :  *****************************************************************************/
 9770 scrappy                 11126                 : 
 7601 bruce                   11127                 : LoadStmt:   LOAD file_name
 9344                         11128                 :                 {
  331 peter                   11129 GIC          26 :                     LoadStmt   *n = makeNode(LoadStmt);
                              11130                 : 
 9344 bruce                   11131              26 :                     n->filename = $2;
  331 peter                   11132              26 :                     $$ = (Node *) n;
                              11133                 :                 }
                              11134                 :         ;
                              11135                 : 
                              11136                 : 
                              11137                 : /*****************************************************************************
                              11138                 :  *
                              11139                 :  *      CREATE DATABASE
                              11140                 :  *
                              11141                 :  *****************************************************************************/
                              11142                 : 
 7601 bruce                   11143 ECB             : CreatedbStmt:
                              11144                 :             CREATE DATABASE name opt_with createdb_opt_list
 8281 lockhart                11145                 :                 {
 8201 tgl                     11146 CBC         808 :                     CreatedbStmt *n = makeNode(CreatedbStmt);
  331 peter                   11147 ECB             : 
 9344 bruce                   11148 CBC         808 :                     n->dbname = $3;
 7600                         11149             808 :                     n->options = $5;
  331 peter                   11150             808 :                     $$ = (Node *) n;
 9344 bruce                   11151 ECB             :                 }
 9025 scrappy                 11152                 :         ;
                              11153                 : 
                              11154                 : createdb_opt_list:
 3204 tgl                     11155 GIC         744 :             createdb_opt_items                      { $$ = $1; }
 7600 bruce                   11156              69 :             | /* EMPTY */                           { $$ = NIL; }
 9284 lockhart                11157 ECB             :         ;
                              11158                 : 
 3204 tgl                     11159                 : createdb_opt_items:
 3204 tgl                     11160 CBC         744 :             createdb_opt_item                       { $$ = list_make1($1); }
                              11161            1333 :             | createdb_opt_items createdb_opt_item  { $$ = lappend($1, $2); }
 3204 tgl                     11162 ECB             :         ;
                              11163                 : 
 7601 bruce                   11164                 : createdb_opt_item:
  156 tgl                     11165                 :             createdb_opt_name opt_equal NumericOnly
 5311 heikki.linnakangas      11166                 :                 {
  156 tgl                     11167 GIC         615 :                     $$ = makeDefElem($1, $3, @1);
                              11168                 :                 }
                              11169                 :             | createdb_opt_name opt_equal opt_boolean_or_string
                              11170                 :                 {
  331 peter                   11171 CBC        1462 :                     $$ = makeDefElem($1, (Node *) makeString($3), @1);
                              11172                 :                 }
 3204 tgl                     11173 ECB             :             | createdb_opt_name opt_equal DEFAULT
 6461                         11174                 :                 {
 2406 peter_e                 11175 LBC           0 :                     $$ = makeDefElem($1, NULL, @1);
 7691 bruce                   11176 ECB             :                 }
                              11177                 :         ;
                              11178                 : 
 3204 tgl                     11179                 : /*
                              11180                 :  * Ideally we'd use ColId here, but that causes shift/reduce conflicts against
 3204 tgl                     11181 EUB             :  * the ALTER DATABASE SET/RESET syntaxes.  Instead call out specific keywords
                              11182                 :  * we need, and allow IDENT so that database option names don't have to be
                              11183                 :  * parser keywords unless they are already keywords for other reasons.
                              11184                 :  *
 3204 tgl                     11185 ECB             :  * XXX this coding technique is fragile since if someone makes a formerly
                              11186                 :  * non-keyword option name into a keyword and forgets to add it here, the
                              11187                 :  * option will silently break.  Best defense is to provide a regression test
                              11188                 :  * exercising every such option, at least at the syntax level.
                              11189                 :  */
                              11190                 : createdb_opt_name:
 3204 tgl                     11191 GIC        1926 :             IDENT                           { $$ = $1; }
 3204 tgl                     11192 LBC           0 :             | CONNECTION LIMIT              { $$ = pstrdup("connection_limit"); }
 3204 tgl                     11193 CBC          23 :             | ENCODING                      { $$ = pstrdup($1); }
 3204 tgl                     11194 LBC           0 :             | LOCATION                      { $$ = pstrdup($1); }
 3204 tgl                     11195 CBC           1 :             | OWNER                         { $$ = pstrdup($1); }
                              11196               8 :             | TABLESPACE                    { $$ = pstrdup($1); }
                              11197             119 :             | TEMPLATE                      { $$ = pstrdup($1); }
 3204 tgl                     11198 ECB             :         ;
                              11199                 : 
 7690 tgl                     11200 EUB             : /*
                              11201                 :  *  Though the equals sign doesn't match other WITH options, pg_dump uses
                              11202                 :  *  equals for backward compatibility, and it doesn't seem worth removing it.
                              11203                 :  */
  878 peter                   11204 ECB             : opt_equal:  '='
                              11205                 :             | /*EMPTY*/
                              11206                 :         ;
                              11207                 : 
                              11208                 : 
 7709 peter_e                 11209                 : /*****************************************************************************
                              11210                 :  *
                              11211                 :  *      ALTER DATABASE
                              11212                 :  *
                              11213                 :  *****************************************************************************/
                              11214                 : 
                              11215                 : AlterDatabaseStmt:
                              11216                 :             ALTER DATABASE name WITH createdb_opt_list
                              11217                 :                  {
 6461 tgl                     11218 UIC           0 :                     AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
                              11219                 : 
                              11220               0 :                     n->dbname = $3;
                              11221               0 :                     n->options = $5;
  331 peter                   11222               0 :                     $$ = (Node *) n;
                              11223                 :                  }
 1033 peter                   11224 ECB             :             | ALTER DATABASE name createdb_opt_list
                              11225                 :                  {
 3204 tgl                     11226 CBC           5 :                     AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
  331 peter                   11227 ECB             : 
 3204 tgl                     11228 GIC           5 :                     n->dbname = $3;
                              11229               5 :                     n->options = $4;
  331 peter                   11230               5 :                     $$ = (Node *) n;
                              11231                 :                  }
                              11232                 :             | ALTER DATABASE name SET TABLESPACE name
                              11233                 :                  {
 5266 tgl                     11234               5 :                     AlterDatabaseStmt *n = makeNode(AlterDatabaseStmt);
                              11235                 : 
                              11236               5 :                     n->dbname = $3;
                              11237               5 :                     n->options = list_make1(makeDefElem("tablespace",
                              11238                 :                                                         (Node *) makeString($6), @6));
  331 peter                   11239               5 :                     $$ = (Node *) n;
                              11240                 :                  }
  419 peter                   11241 ECB             :             | ALTER DATABASE name REFRESH COLLATION VERSION_P
                              11242                 :                  {
  419 peter                   11243 CBC           6 :                     AlterDatabaseRefreshCollStmt *n = makeNode(AlterDatabaseRefreshCollStmt);
  331 peter                   11244 ECB             : 
  419 peter                   11245 CBC           6 :                     n->dbname = $3;
  331 peter                   11246 GIC           6 :                     $$ = (Node *) n;
                              11247                 :                  }
                              11248                 :         ;
                              11249                 : 
 7601 bruce                   11250 ECB             : AlterDatabaseSetStmt:
 1033 peter                   11251                 :             ALTER DATABASE name SetResetClause
                              11252                 :                 {
 7709 peter_e                 11253 GIC         516 :                     AlterDatabaseSetStmt *n = makeNode(AlterDatabaseSetStmt);
                              11254                 : 
 7709 peter_e                 11255 CBC         516 :                     n->dbname = $3;
 5697 tgl                     11256             516 :                     n->setstmt = $4;
  331 peter                   11257 GIC         516 :                     $$ = (Node *) n;
                              11258                 :                 }
                              11259                 :         ;
                              11260                 : 
                              11261                 : 
 9770 scrappy                 11262 ECB             : /*****************************************************************************
                              11263                 :  *
                              11264                 :  *      DROP DATABASE [ IF EXISTS ] dbname [ [ WITH ] ( options ) ]
                              11265                 :  *
 7587 tgl                     11266                 :  * This is implicitly CASCADE, no need for drop behavior
                              11267                 :  *****************************************************************************/
                              11268                 : 
                              11269                 : DropdbStmt: DROP DATABASE name
 7689 tgl                     11270 EUB             :                 {
 7689 tgl                     11271 GIC          20 :                     DropdbStmt *n = makeNode(DropdbStmt);
                              11272                 : 
                              11273              20 :                     n->dbname = $3;
 2062 peter_e                 11274              20 :                     n->missing_ok = false;
 1244 akapila                 11275              20 :                     n->options = NULL;
  331 peter                   11276              20 :                     $$ = (Node *) n;
                              11277                 :                 }
                              11278                 :             | DROP DATABASE IF_P EXISTS name
                              11279                 :                 {
 6347 andrew                  11280               2 :                     DropdbStmt *n = makeNode(DropdbStmt);
                              11281                 : 
                              11282               2 :                     n->dbname = $5;
 2062 peter_e                 11283               2 :                     n->missing_ok = true;
 1244 akapila                 11284               2 :                     n->options = NULL;
  331 peter                   11285               2 :                     $$ = (Node *) n;
 7689 tgl                     11286 ECB             :                 }
 1033 peter                   11287 EUB             :             | DROP DATABASE name opt_with '(' drop_option_list ')'
 1244 akapila                 11288 ECB             :                 {
 1244 akapila                 11289 GBC           7 :                     DropdbStmt *n = makeNode(DropdbStmt);
  331 peter                   11290 ECB             : 
 1244 akapila                 11291 CBC           7 :                     n->dbname = $3;
                              11292               7 :                     n->missing_ok = false;
 1244 akapila                 11293 GIC           7 :                     n->options = $6;
  331 peter                   11294               7 :                     $$ = (Node *) n;
                              11295                 :                 }
                              11296                 :             | DROP DATABASE IF_P EXISTS name opt_with '(' drop_option_list ')'
                              11297                 :                 {
 1244 akapila                 11298               6 :                     DropdbStmt *n = makeNode(DropdbStmt);
                              11299                 : 
                              11300               6 :                     n->dbname = $5;
                              11301               6 :                     n->missing_ok = true;
                              11302               6 :                     n->options = $8;
  331 peter                   11303               6 :                     $$ = (Node *) n;
                              11304                 :                 }
                              11305                 :         ;
                              11306                 : 
                              11307                 : drop_option_list:
                              11308                 :             drop_option
                              11309                 :                 {
 1244 akapila                 11310              13 :                     $$ = list_make1((Node *) $1);
                              11311                 :                 }
                              11312                 :             | drop_option_list ',' drop_option
 1244 akapila                 11313 EUB             :                 {
 1244 akapila                 11314 UIC           0 :                     $$ = lappend($1, (Node *) $3);
 1244 akapila                 11315 EUB             :                 }
 7689 tgl                     11316                 :         ;
                              11317                 : 
                              11318                 : /*
                              11319                 :  * Currently only the FORCE option is supported, but the syntax is designed
                              11320                 :  * to be extensible so that we can add more options in the future if required.
 1244 akapila                 11321 ECB             :  */
                              11322                 : drop_option:
                              11323                 :             FORCE
                              11324                 :                 {
 1244 akapila                 11325 CBC          13 :                     $$ = makeDefElem("force", NULL, @1);
                              11326                 :                 }
                              11327                 :         ;
                              11328                 : 
  702 tmunro                  11329 ECB             : /*****************************************************************************
                              11330                 :  *
                              11331                 :  *      ALTER COLLATION
                              11332                 :  *
                              11333                 :  *****************************************************************************/
                              11334                 : 
                              11335                 : AlterCollationStmt: ALTER COLLATION any_name REFRESH VERSION_P
                              11336                 :                 {
  702 tmunro                  11337 GIC           6 :                     AlterCollationStmt *n = makeNode(AlterCollationStmt);
  331 peter                   11338 ECB             : 
  702 tmunro                  11339 GIC           6 :                     n->collname = $3;
  331 peter                   11340 CBC           6 :                     $$ = (Node *) n;
  702 tmunro                  11341 ECB             :                 }
                              11342                 :         ;
                              11343                 : 
                              11344                 : 
                              11345                 : /*****************************************************************************
                              11346                 :  *
                              11347                 :  *      ALTER SYSTEM
 3399 ishii                   11348                 :  *
                              11349                 :  * This is used to change configuration parameters persistently.
                              11350                 :  *****************************************************************************/
                              11351                 : 
                              11352                 : AlterSystemStmt:
                              11353                 :             ALTER SYSTEM_P SET generic_set
                              11354                 :                 {
 3399 ishii                   11355 GIC          51 :                     AlterSystemStmt *n = makeNode(AlterSystemStmt);
                              11356                 : 
                              11357              51 :                     n->setstmt = $4;
  331 peter                   11358              51 :                     $$ = (Node *) n;
                              11359                 :                 }
                              11360                 :             | ALTER SYSTEM_P RESET generic_reset
                              11361                 :                 {
 3141 fujii                   11362              24 :                     AlterSystemStmt *n = makeNode(AlterSystemStmt);
                              11363                 : 
                              11364              24 :                     n->setstmt = $4;
  331 peter                   11365              24 :                     $$ = (Node *) n;
 3141 fujii                   11366 ECB             :                 }
                              11367                 :         ;
 3399 ishii                   11368                 : 
                              11369                 : 
 7689 tgl                     11370                 : /*****************************************************************************
 8487 peter_e                 11371                 :  *
                              11372                 :  * Manipulate a domain
                              11373                 :  *
                              11374                 :  *****************************************************************************/
 9770 scrappy                 11375                 : 
                              11376                 : CreateDomainStmt:
 7155 peter_e                 11377                 :             CREATE DOMAIN_P any_name opt_as Typename ColQualList
 9344 bruce                   11378                 :                 {
 7691 bruce                   11379 CBC        1862 :                     CreateDomainStmt *n = makeNode(CreateDomainStmt);
  331 peter                   11380 ECB             : 
 7691 bruce                   11381 GIC        1862 :                     n->domainname = $3;
 5015 peter_e                 11382            1862 :                     n->typeName = $5;
 4414 tgl                     11383            1862 :                     SplitColQualList($6, &n->constraints, &n->collClause,
 4414 tgl                     11384 ECB             :                                      yyscanner);
  331 peter                   11385 GIC        1862 :                     $$ = (Node *) n;
 9344 bruce                   11386 ECB             :                 }
                              11387                 :         ;
 9770 scrappy                 11388                 : 
 7429 bruce                   11389                 : AlterDomainStmt:
                              11390                 :             /* ALTER DOMAIN <domain> {SET DEFAULT <expr>|DROP DEFAULT} */
                              11391                 :             ALTER DOMAIN_P any_name alter_column_default
                              11392                 :                 {
 7429 bruce                   11393 CBC           7 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11394                 : 
                              11395               7 :                     n->subtype = 'T';
 5015 peter_e                 11396               7 :                     n->typeName = $3;
 7429 bruce                   11397               7 :                     n->def = $4;
  331 peter                   11398               7 :                     $$ = (Node *) n;
                              11399                 :                 }
                              11400                 :             /* ALTER DOMAIN <domain> DROP NOT NULL */
                              11401                 :             | ALTER DOMAIN_P any_name DROP NOT NULL_P
                              11402                 :                 {
 7429 bruce                   11403 GIC           6 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11404                 : 
 7429 bruce                   11405 CBC           6 :                     n->subtype = 'N';
 5015 peter_e                 11406 GIC           6 :                     n->typeName = $3;
  331 peter                   11407               6 :                     $$ = (Node *) n;
                              11408                 :                 }
 7429 bruce                   11409 EUB             :             /* ALTER DOMAIN <domain> SET NOT NULL */
                              11410                 :             | ALTER DOMAIN_P any_name SET NOT NULL_P
                              11411                 :                 {
 7429 bruce                   11412 GIC          12 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11413                 : 
                              11414              12 :                     n->subtype = 'O';
 5015 peter_e                 11415              12 :                     n->typeName = $3;
  331 peter                   11416              12 :                     $$ = (Node *) n;
                              11417                 :                 }
                              11418                 :             /* ALTER DOMAIN <domain> ADD CONSTRAINT ... */
                              11419                 :             | ALTER DOMAIN_P any_name ADD_P TableConstraint
 7429 bruce                   11420 ECB             :                 {
 7429 bruce                   11421 GIC          72 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11422                 : 
                              11423              72 :                     n->subtype = 'C';
 5015 peter_e                 11424              72 :                     n->typeName = $3;
 7429 bruce                   11425              72 :                     n->def = $5;
  331 peter                   11426              72 :                     $$ = (Node *) n;
                              11427                 :                 }
                              11428                 :             /* ALTER DOMAIN <domain> DROP CONSTRAINT <name> [RESTRICT|CASCADE] */
                              11429                 :             | ALTER DOMAIN_P any_name DROP CONSTRAINT name opt_drop_behavior
                              11430                 :                 {
 7429 bruce                   11431              18 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
  331 peter                   11432 ECB             : 
 7429 bruce                   11433 GIC          18 :                     n->subtype = 'X';
 5015 peter_e                 11434 CBC          18 :                     n->typeName = $3;
 7429 bruce                   11435              18 :                     n->name = $6;
 7429 bruce                   11436 GIC          18 :                     n->behavior = $7;
 4112 peter_e                 11437              18 :                     n->missing_ok = false;
  331 peter                   11438              18 :                     $$ = (Node *) n;
                              11439                 :                 }
                              11440                 :             /* ALTER DOMAIN <domain> DROP CONSTRAINT IF EXISTS <name> [RESTRICT|CASCADE] */
                              11441                 :             | ALTER DOMAIN_P any_name DROP CONSTRAINT IF_P EXISTS name opt_drop_behavior
                              11442                 :                 {
 4112 peter_e                 11443               3 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11444                 : 
                              11445               3 :                     n->subtype = 'X';
                              11446               3 :                     n->typeName = $3;
                              11447               3 :                     n->name = $8;
                              11448               3 :                     n->behavior = $9;
                              11449               3 :                     n->missing_ok = true;
  331 peter                   11450 CBC           3 :                     $$ = (Node *) n;
                              11451                 :                 }
 4330 alvherre                11452 ECB             :             /* ALTER DOMAIN <domain> VALIDATE CONSTRAINT <name> */
                              11453                 :             | ALTER DOMAIN_P any_name VALIDATE CONSTRAINT name
                              11454                 :                 {
 4330 alvherre                11455 GIC           6 :                     AlterDomainStmt *n = makeNode(AlterDomainStmt);
                              11456                 : 
 4330 alvherre                11457 CBC           6 :                     n->subtype = 'V';
 4330 alvherre                11458 GIC           6 :                     n->typeName = $3;
 4330 alvherre                11459 CBC           6 :                     n->name = $6;
  331 peter                   11460               6 :                     $$ = (Node *) n;
                              11461                 :                 }
                              11462                 :             ;
                              11463                 : 
                              11464                 : opt_as:     AS
                              11465                 :             | /* EMPTY */
                              11466                 :         ;
                              11467                 : 
                              11468                 : 
                              11469                 : /*****************************************************************************
                              11470                 :  *
                              11471                 :  * Manipulate a text search dictionary or configuration
                              11472                 :  *
                              11473                 :  *****************************************************************************/
 5710 tgl                     11474 ECB             : 
                              11475                 : AlterTSDictionaryStmt:
                              11476                 :             ALTER TEXT_P SEARCH DICTIONARY any_name definition
                              11477                 :                 {
 5710 tgl                     11478 CBC          20 :                     AlterTSDictionaryStmt *n = makeNode(AlterTSDictionaryStmt);
                              11479                 : 
                              11480              20 :                     n->dictname = $5;
 5710 tgl                     11481 GIC          20 :                     n->options = $6;
  331 peter                   11482              20 :                     $$ = (Node *) n;
                              11483                 :                 }
                              11484                 :         ;
                              11485                 : 
                              11486                 : AlterTSConfigurationStmt:
                              11487                 :             ALTER TEXT_P SEARCH CONFIGURATION any_name ADD_P MAPPING FOR name_list any_with any_name_list
 5710 tgl                     11488 ECB             :                 {
 5710 tgl                     11489 GIC       25529 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
  331 peter                   11490 ECB             : 
 2890 alvherre                11491 CBC       25529 :                     n->kind = ALTER_TSCONFIG_ADD_MAPPING;
 5710 tgl                     11492           25529 :                     n->cfgname = $5;
                              11493           25529 :                     n->tokentype = $9;
 5710 tgl                     11494 GIC       25529 :                     n->dicts = $11;
                              11495           25529 :                     n->override = false;
                              11496           25529 :                     n->replace = false;
  331 peter                   11497           25529 :                     $$ = (Node *) n;
 5710 tgl                     11498 ECB             :                 }
                              11499                 :             | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list any_with any_name_list
                              11500                 :                 {
 5710 tgl                     11501 CBC          10 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
  331 peter                   11502 ECB             : 
 2890 alvherre                11503 GIC          10 :                     n->kind = ALTER_TSCONFIG_ALTER_MAPPING_FOR_TOKEN;
 5710 tgl                     11504              10 :                     n->cfgname = $5;
                              11505              10 :                     n->tokentype = $9;
                              11506              10 :                     n->dicts = $11;
 5710 tgl                     11507 CBC          10 :                     n->override = true;
 5710 tgl                     11508 GIC          10 :                     n->replace = false;
  331 peter                   11509 CBC          10 :                     $$ = (Node *) n;
 5710 tgl                     11510 ECB             :                 }
 2966                         11511                 :             | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING REPLACE any_name any_with any_name
                              11512                 :                 {
 5710 tgl                     11513 GIC           9 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
                              11514                 : 
 2890 alvherre                11515               9 :                     n->kind = ALTER_TSCONFIG_REPLACE_DICT;
 5710 tgl                     11516 CBC           9 :                     n->cfgname = $5;
 5710 tgl                     11517 GIC           9 :                     n->tokentype = NIL;
 5710 tgl                     11518 CBC           9 :                     n->dicts = list_make2($9,$11);
                              11519               9 :                     n->override = false;
                              11520               9 :                     n->replace = true;
  331 peter                   11521               9 :                     $$ = (Node *) n;
                              11522                 :                 }
                              11523                 :             | ALTER TEXT_P SEARCH CONFIGURATION any_name ALTER MAPPING FOR name_list REPLACE any_name any_with any_name
                              11524                 :                 {
 5710 tgl                     11525 UIC           0 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
  331 peter                   11526 ECB             : 
 2890 alvherre                11527 UIC           0 :                     n->kind = ALTER_TSCONFIG_REPLACE_DICT_FOR_TOKEN;
 5710 tgl                     11528 LBC           0 :                     n->cfgname = $5;
                              11529               0 :                     n->tokentype = $9;
                              11530               0 :                     n->dicts = list_make2($11,$13);
                              11531               0 :                     n->override = false;
                              11532               0 :                     n->replace = true;
  331 peter                   11533               0 :                     $$ = (Node *) n;
                              11534                 :                 }
                              11535                 :             | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING FOR name_list
                              11536                 :                 {
 5710 tgl                     11537 UIC           0 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
  331 peter                   11538 ECB             : 
 2890 alvherre                11539 UIC           0 :                     n->kind = ALTER_TSCONFIG_DROP_MAPPING;
 5710 tgl                     11540 LBC           0 :                     n->cfgname = $5;
                              11541               0 :                     n->tokentype = $9;
                              11542               0 :                     n->missing_ok = false;
  331 peter                   11543               0 :                     $$ = (Node *) n;
 5710 tgl                     11544 ECB             :                 }
 5225                         11545                 :             | ALTER TEXT_P SEARCH CONFIGURATION any_name DROP MAPPING IF_P EXISTS FOR name_list
                              11546                 :                 {
 5710 tgl                     11547 UIC           0 :                     AlterTSConfigurationStmt *n = makeNode(AlterTSConfigurationStmt);
                              11548                 : 
 2890 alvherre                11549               0 :                     n->kind = ALTER_TSCONFIG_DROP_MAPPING;
 5710 tgl                     11550 LBC           0 :                     n->cfgname = $5;
 5710 tgl                     11551 UIC           0 :                     n->tokentype = $11;
 5710 tgl                     11552 LBC           0 :                     n->missing_ok = true;
  331 peter                   11553               0 :                     $$ = (Node *) n;
 5710 tgl                     11554 ECB             :                 }
                              11555                 :         ;
                              11556                 : 
                              11557                 : /* Use this if TIME or ORDINALITY after WITH should be taken as an identifier */
                              11558                 : any_with:   WITH
                              11559                 :             | WITH_LA
                              11560                 :         ;
                              11561                 : 
                              11562                 : 
                              11563                 : /*****************************************************************************
                              11564                 :  *
                              11565                 :  * Manipulate a conversion
                              11566                 :  *
                              11567                 :  *      CREATE [DEFAULT] CONVERSION <conversion_name>
                              11568                 :  *      FOR <encoding_name> TO <encoding_name> FROM <func_name>
                              11569                 :  *
                              11570                 :  *****************************************************************************/
                              11571                 : 
                              11572                 : CreateConversionStmt:
 7577 ishii                   11573                 :             CREATE opt_default CONVERSION_P any_name FOR Sconst
                              11574                 :             TO Sconst FROM any_name
                              11575                 :             {
 4177 peter_e                 11576 CBC          32 :                 CreateConversionStmt *n = makeNode(CreateConversionStmt);
  331 peter                   11577 ECB             : 
 4177 peter_e                 11578 GIC          32 :                 n->conversion_name = $4;
                              11579              32 :                 n->for_encoding_name = $6;
                              11580              32 :                 n->to_encoding_name = $8;
                              11581              32 :                 n->func_name = $10;
                              11582              32 :                 n->def = $2;
  331 peter                   11583              32 :                 $$ = (Node *) n;
 7577 ishii                   11584 ECB             :             }
                              11585                 :         ;
                              11586                 : 
 9770 scrappy                 11587                 : /*****************************************************************************
                              11588                 :  *
 9344 bruce                   11589                 :  *      QUERY:
 5249 peter_e                 11590                 :  *              CLUSTER [VERBOSE] <qualified_name> [ USING <index_name> ]
  857 michael                 11591                 :  *              CLUSTER [ (options) ] <qualified_name> [ USING <index_name> ]
 5249 peter_e                 11592                 :  *              CLUSTER [VERBOSE]
                              11593                 :  *              CLUSTER [VERBOSE] <index_name> ON <qualified_name> (for pre-8.3)
                              11594                 :  *
                              11595                 :  *****************************************************************************/
 9770 scrappy                 11596                 : 
                              11597                 : ClusterStmt:
 5249 peter_e                 11598                 :             CLUSTER opt_verbose qualified_name cluster_index_specification
 7450 bruce                   11599                 :                 {
 4177 peter_e                 11600 CBC          85 :                     ClusterStmt *n = makeNode(ClusterStmt);
  331 peter                   11601 ECB             : 
 4177 peter_e                 11602 CBC          85 :                     n->relation = $3;
                              11603              85 :                     n->indexname = $4;
  857 michael                 11604              85 :                     n->params = NIL;
 1720 michael                 11605 GIC          85 :                     if ($2)
  857 michael                 11606 UIC           0 :                         n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
  331 peter                   11607 GIC          85 :                     $$ = (Node *) n;
  857 michael                 11608 ECB             :                 }
                              11609                 : 
                              11610                 :             | CLUSTER '(' utility_option_list ')' qualified_name cluster_index_specification
                              11611                 :                 {
  857 michael                 11612 LBC           0 :                     ClusterStmt *n = makeNode(ClusterStmt);
  331 peter                   11613 ECB             : 
  857 michael                 11614 LBC           0 :                     n->relation = $5;
                              11615               0 :                     n->indexname = $6;
                              11616               0 :                     n->params = $3;
  331 peter                   11617 UIC           0 :                     $$ = (Node *) n;
                              11618                 :                 }
                              11619                 :             | CLUSTER opt_verbose
 4177 peter_e                 11620 EUB             :                 {
 4177 peter_e                 11621 GIC          12 :                     ClusterStmt *n = makeNode(ClusterStmt);
  331 peter                   11622 EUB             : 
 4177 peter_e                 11623 GBC          12 :                     n->relation = NULL;
                              11624              12 :                     n->indexname = NULL;
  857 michael                 11625              12 :                     n->params = NIL;
 1720                         11626              12 :                     if ($2)
  857                         11627               6 :                         n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
  331 peter                   11628              12 :                     $$ = (Node *) n;
                              11629                 :                 }
                              11630                 :             /* kept for pre-8.3 compatibility */
                              11631                 :             | CLUSTER opt_verbose name ON qualified_name
 5845 bruce                   11632 EUB             :                 {
 4177 peter_e                 11633 GIC           9 :                     ClusterStmt *n = makeNode(ClusterStmt);
  331 peter                   11634 EUB             : 
 4177 peter_e                 11635 GBC           9 :                     n->relation = $5;
                              11636               9 :                     n->indexname = $3;
  857 michael                 11637               9 :                     n->params = NIL;
 1720                         11638               9 :                     if ($2)
  857 michael                 11639 UIC           0 :                         n->params = lappend(n->params, makeDefElem("verbose", NULL, @2));
  331 peter                   11640 GIC           9 :                     $$ = (Node *) n;
                              11641                 :                 }
 5845 bruce                   11642 EUB             :         ;
                              11643                 : 
                              11644                 : cluster_index_specification:
 1033 peter                   11645 GBC          70 :             USING name              { $$ = $2; }
 5845 bruce                   11646              15 :             | /*EMPTY*/             { $$ = NULL; }
 9344 bruce                   11647 EUB             :         ;
 9770 scrappy                 11648                 : 
                              11649                 : 
                              11650                 : /*****************************************************************************
                              11651                 :  *
                              11652                 :  *      QUERY:
                              11653                 :  *              VACUUM
                              11654                 :  *              ANALYZE
                              11655                 :  *
                              11656                 :  *****************************************************************************/
                              11657                 : 
                              11658                 : VacuumStmt: VACUUM opt_full opt_freeze opt_verbose opt_analyze opt_vacuum_relation_list
                              11659                 :                 {
 9344 bruce                   11660 GIC        1033 :                     VacuumStmt *n = makeNode(VacuumStmt);
                              11661                 : 
 1483 rhaas                   11662            1033 :                     n->options = NIL;
 4892 tgl                     11663            1033 :                     if ($2)
 1483 rhaas                   11664              53 :                         n->options = lappend(n->options,
                              11665              53 :                                              makeDefElem("full", NULL, @2));
 2944 alvherre                11666            1033 :                     if ($3)
 1483 rhaas                   11667             331 :                         n->options = lappend(n->options,
                              11668             331 :                                              makeDefElem("freeze", NULL, @3));
 4892 tgl                     11669            1033 :                     if ($4)
 1483 rhaas                   11670               5 :                         n->options = lappend(n->options,
 1483 rhaas                   11671 CBC           5 :                                              makeDefElem("verbose", NULL, @4));
 1916 rhaas                   11672 GIC        1033 :                     if ($5)
 1483 rhaas                   11673 CBC         136 :                         n->options = lappend(n->options,
                              11674             136 :                                              makeDefElem("analyze", NULL, @5));
 1916                         11675            1033 :                     n->rels = $6;
 1483                         11676            1033 :                     n->is_vacuumcmd = true;
  331 peter                   11677            1033 :                     $$ = (Node *) n;
 9344 bruce                   11678 ECB             :                 }
                              11679                 :             | VACUUM '(' utility_option_list ')' opt_vacuum_relation_list
                              11680                 :                 {
 4892 tgl                     11681 GIC        1491 :                     VacuumStmt *n = makeNode(VacuumStmt);
                              11682                 : 
 1483 rhaas                   11683            1491 :                     n->options = $3;
 2014 tgl                     11684            1491 :                     n->rels = $5;
 1483 rhaas                   11685            1491 :                     n->is_vacuumcmd = true;
 4892 tgl                     11686            1491 :                     $$ = (Node *) n;
                              11687                 :                 }
                              11688                 :         ;
                              11689                 : 
                              11690                 : AnalyzeStmt: analyze_keyword opt_verbose opt_vacuum_relation_list
                              11691                 :                 {
 8007                         11692            2367 :                     VacuumStmt *n = makeNode(VacuumStmt);
                              11693                 : 
 1483 rhaas                   11694            2367 :                     n->options = NIL;
 4892 tgl                     11695 CBC        2367 :                     if ($2)
 1483 rhaas                   11696 UIC           0 :                         n->options = lappend(n->options,
 1483 rhaas                   11697 LBC           0 :                                              makeDefElem("verbose", NULL, @2));
 2014 tgl                     11698 CBC        2367 :                     n->rels = $3;
 1483 rhaas                   11699            2367 :                     n->is_vacuumcmd = false;
  331 peter                   11700            2367 :                     $$ = (Node *) n;
 8007 tgl                     11701 EUB             :                 }
  860 michael                 11702 ECB             :             | analyze_keyword '(' utility_option_list ')' opt_vacuum_relation_list
                              11703                 :                 {
 1861 andres                  11704 GIC          93 :                     VacuumStmt *n = makeNode(VacuumStmt);
                              11705                 : 
 1483 rhaas                   11706              93 :                     n->options = $3;
 1861 andres                  11707 GBC          93 :                     n->rels = $5;
 1483 rhaas                   11708 GIC          93 :                     n->is_vacuumcmd = false;
 1861 andres                  11709 GBC          93 :                     $$ = (Node *) n;
 1861 andres                  11710 EUB             :                 }
                              11711                 :         ;
                              11712                 : 
                              11713                 : utility_option_list:
                              11714                 :             utility_option_elem
                              11715                 :                 {
 1483 rhaas                   11716 CBC        6948 :                     $$ = list_make1($1);
                              11717                 :                 }
  860 michael                 11718 ECB             :             | utility_option_list ',' utility_option_elem
 1483 rhaas                   11719                 :                 {
 1483 rhaas                   11720 CBC        3183 :                     $$ = lappend($1, $3);
 1648 michael                 11721 ECB             :                 }
 9344 bruce                   11722                 :         ;
                              11723                 : 
                              11724                 : analyze_keyword:
                              11725                 :             ANALYZE
                              11726                 :             | ANALYSE /* British */
                              11727                 :         ;
 9482 vadim4o                 11728                 : 
                              11729                 : utility_option_elem:
  860 michael                 11730                 :             utility_option_name utility_option_arg
 1483 rhaas                   11731                 :                 {
 1472 rhaas                   11732 CBC       10131 :                     $$ = makeDefElem($1, $2, @1);
 1483 rhaas                   11733 ECB             :                 }
 1483 rhaas                   11734 EUB             :         ;
 1483 rhaas                   11735 ECB             : 
                              11736                 : utility_option_name:
 1483 rhaas                   11737 GIC        9342 :             NonReservedWord                         { $$ = $1; }
                              11738             727 :             | analyze_keyword                       { $$ = "analyze"; }
   11 alvherre                11739 GNC          65 :             | FORMAT_LA                             { $$ = "format"; }
                              11740                 :         ;
 1483 rhaas                   11741 ECB             : 
  860 michael                 11742                 : utility_option_arg:
 1472 rhaas                   11743 GIC        6383 :             opt_boolean_or_string                   { $$ = (Node *) makeString($1); }
  879 peter                   11744             181 :             | NumericOnly                           { $$ = (Node *) $1; }
                              11745            3567 :             | /* EMPTY */                           { $$ = NULL; }
                              11746                 :         ;
                              11747                 : 
                              11748                 : opt_analyze:
 1916 rhaas                   11749             136 :             analyze_keyword                         { $$ = true; }
                              11750             897 :             | /*EMPTY*/                             { $$ = false; }
                              11751                 :         ;
                              11752                 : 
                              11753                 : opt_verbose:
 2062 peter_e                 11754              11 :             VERBOSE                                 { $$ = true; }
                              11755            4641 :             | /*EMPTY*/                             { $$ = false; }
 9344 bruce                   11756 ECB             :         ;
                              11757                 : 
 2062 peter_e                 11758 CBC          53 : opt_full:   FULL                                    { $$ = true; }
                              11759             980 :             | /*EMPTY*/                             { $$ = false; }
 7943 tgl                     11760 ECB             :         ;
                              11761                 : 
 2062 peter_e                 11762 CBC         331 : opt_freeze: FREEZE                                  { $$ = true; }
                              11763             702 :             | /*EMPTY*/                             { $$ = false; }
 7896 tgl                     11764 ECB             :         ;
                              11765                 : 
 7601 bruce                   11766                 : opt_name_list:
 7601 bruce                   11767 CBC        1033 :             '(' name_list ')'                       { $$ = $2; }
                              11768            5539 :             | /*EMPTY*/                             { $$ = NIL; }
 9344 bruce                   11769 ECB             :         ;
 9351 lockhart                11770                 : 
 2014 tgl                     11771                 : vacuum_relation:
                              11772                 :             qualified_name opt_name_list
                              11773                 :                 {
 2014 tgl                     11774 GIC        4404 :                     $$ = (Node *) makeVacuumRelation($1, InvalidOid, $2);
                              11775                 :                 }
                              11776                 :         ;
 2014 tgl                     11777 ECB             : 
                              11778                 : vacuum_relation_list:
                              11779                 :             vacuum_relation
 2014 tgl                     11780 CBC        4330 :                     { $$ = list_make1($1); }
 2014 tgl                     11781 ECB             :             | vacuum_relation_list ',' vacuum_relation
 2014 tgl                     11782 CBC          74 :                     { $$ = lappend($1, $3); }
                              11783                 :         ;
                              11784                 : 
                              11785                 : opt_vacuum_relation_list:
 2014 tgl                     11786 GIC        4330 :             vacuum_relation_list                    { $$ = $1; }
                              11787             654 :             | /*EMPTY*/                             { $$ = NIL; }
 2014 tgl                     11788 ECB             :         ;
                              11789                 : 
 9297 lockhart                11790                 : 
 9770 scrappy                 11791                 : /*****************************************************************************
 9770 scrappy                 11792 EUB             :  *
 9344 bruce                   11793                 :  *      QUERY:
 7371 tgl                     11794 ECB             :  *              EXPLAIN [ANALYZE] [VERBOSE] query
 5005                         11795                 :  *              EXPLAIN ( options ) query
 9770 scrappy                 11796                 :  *
                              11797                 :  *****************************************************************************/
                              11798                 : 
                              11799                 : ExplainStmt:
 5005 tgl                     11800                 :         EXPLAIN ExplainableStmt
                              11801                 :                 {
 5005 tgl                     11802 CBC        3507 :                     ExplainStmt *n = makeNode(ExplainStmt);
  331 peter                   11803 ECB             : 
 5005 tgl                     11804 CBC        3507 :                     n->query = $2;
                              11805            3507 :                     n->options = NIL;
 5005 tgl                     11806 GIC        3507 :                     $$ = (Node *) n;
                              11807                 :                 }
                              11808                 :         | EXPLAIN analyze_keyword opt_verbose ExplainableStmt
                              11809                 :                 {
 7873                         11810            1146 :                     ExplainStmt *n = makeNode(ExplainStmt);
                              11811                 : 
 5871 tgl                     11812 CBC        1146 :                     n->query = $4;
 2406 peter_e                 11813 GIC        1146 :                     n->options = list_make1(makeDefElem("analyze", NULL, @2));
 5005 tgl                     11814            1146 :                     if ($3)
 5005 tgl                     11815 UIC           0 :                         n->options = lappend(n->options,
 2406 peter_e                 11816 LBC           0 :                                              makeDefElem("verbose", NULL, @3));
 5005 tgl                     11817 GIC        1146 :                     $$ = (Node *) n;
                              11818                 :                 }
                              11819                 :         | EXPLAIN VERBOSE ExplainableStmt
                              11820                 :                 {
 5005 tgl                     11821 UIC           0 :                     ExplainStmt *n = makeNode(ExplainStmt);
                              11822                 : 
                              11823               0 :                     n->query = $3;
 2406 peter_e                 11824               0 :                     n->options = list_make1(makeDefElem("verbose", NULL, @2));
 5005 tgl                     11825               0 :                     $$ = (Node *) n;
                              11826                 :                 }
                              11827                 :         | EXPLAIN '(' utility_option_list ')' ExplainableStmt
 5005 tgl                     11828 ECB             :                 {
 5005 tgl                     11829 GIC        5286 :                     ExplainStmt *n = makeNode(ExplainStmt);
                              11830                 : 
                              11831            5286 :                     n->query = $5;
                              11832            5286 :                     n->options = $3;
 5005 tgl                     11833 CBC        5286 :                     $$ = (Node *) n;
 7873 tgl                     11834 ECB             :                 }
 9344 bruce                   11835                 :         ;
                              11836                 : 
                              11837                 : ExplainableStmt:
                              11838                 :             SelectStmt
 7335 tgl                     11839                 :             | InsertStmt
                              11840                 :             | UpdateStmt
                              11841                 :             | DeleteStmt
                              11842                 :             | MergeStmt
                              11843                 :             | DeclareCursorStmt
                              11844                 :             | CreateAsStmt
 3689 kgrittn                 11845                 :             | CreateMatViewStmt
                              11846                 :             | RefreshMatViewStmt
                              11847                 :             | ExecuteStmt                   /* by default all are $$=$1 */
                              11848                 :         ;
                              11849                 : 
 7530 tgl                     11850                 : /*****************************************************************************
                              11851                 :  *
                              11852                 :  *      QUERY:
                              11853                 :  *              PREPARE <plan_name> [(args, ...)] AS <query>
                              11854                 :  *
                              11855                 :  *****************************************************************************/
                              11856                 : 
                              11857                 : PrepareStmt: PREPARE name prep_type_clause AS PreparableStmt
                              11858                 :                 {
 7530 tgl                     11859 CBC         813 :                     PrepareStmt *n = makeNode(PrepareStmt);
                              11860                 : 
 7530 tgl                     11861 GIC         813 :                     n->name = $2;
                              11862             813 :                     n->argtypes = $3;
 5871 tgl                     11863 CBC         813 :                     n->query = $5;
 7530                         11864             813 :                     $$ = (Node *) n;
                              11865                 :                 }
                              11866                 :         ;
                              11867                 : 
 5920 tgl                     11868 GIC         686 : prep_type_clause: '(' type_list ')'         { $$ = $2; }
 7530                         11869             130 :                 | /* EMPTY */               { $$ = NIL; }
 7530 tgl                     11870 ECB             :         ;
                              11871                 : 
                              11872                 : PreparableStmt:
                              11873                 :             SelectStmt
                              11874                 :             | InsertStmt
                              11875                 :             | UpdateStmt
  377 alvherre                11876                 :             | DeleteStmt
                              11877                 :             | MergeStmt                     /* by default all are $$=$1 */
 7335 tgl                     11878                 :         ;
                              11879                 : 
                              11880                 : /*****************************************************************************
                              11881                 :  *
 7222 peter_e                 11882                 :  * EXECUTE <plan_name> [(params, ...)]
                              11883                 :  * CREATE TABLE <name> AS EXECUTE <plan_name> [(params, ...)]
                              11884                 :  *
                              11885                 :  *****************************************************************************/
                              11886                 : 
                              11887                 : ExecuteStmt: EXECUTE name execute_param_clause
                              11888                 :                 {
 7530 tgl                     11889 GIC        4776 :                     ExecuteStmt *n = makeNode(ExecuteStmt);
                              11890                 : 
                              11891            4776 :                     n->name = $2;
                              11892            4776 :                     n->params = $3;
 7222 peter_e                 11893            4776 :                     $$ = (Node *) n;
                              11894                 :                 }
                              11895                 :             | CREATE OptTemp TABLE create_as_target AS
                              11896                 :                 EXECUTE name execute_param_clause opt_with_data
                              11897                 :                 {
 4038 tgl                     11898 CBC          36 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
 7222 peter_e                 11899 GIC          36 :                     ExecuteStmt *n = makeNode(ExecuteStmt);
  331 peter                   11900 ECB             : 
 5892 tgl                     11901 CBC          36 :                     n->name = $7;
                              11902              36 :                     n->params = $8;
 4038 tgl                     11903 GIC          36 :                     ctas->query = (Node *) n;
                              11904              36 :                     ctas->into = $4;
 1002 michael                 11905              36 :                     ctas->objtype = OBJECT_TABLE;
 4038 tgl                     11906 CBC          36 :                     ctas->is_select_into = false;
 1514 michael                 11907 GIC          36 :                     ctas->if_not_exists = false;
 4154 tgl                     11908 ECB             :                     /* cram additional flags into the IntoClause */
 4154 tgl                     11909 CBC          36 :                     $4->rel->relpersistence = $2;
                              11910              36 :                     $4->skipData = !($9);
 4038 tgl                     11911 GBC          36 :                     $$ = (Node *) ctas;
 7530 tgl                     11912 EUB             :                 }
 1514 michael                 11913 ECB             :             | CREATE OptTemp TABLE IF_P NOT EXISTS create_as_target AS
                              11914                 :                 EXECUTE name execute_param_clause opt_with_data
                              11915                 :                 {
 1514 michael                 11916 GIC           6 :                     CreateTableAsStmt *ctas = makeNode(CreateTableAsStmt);
 1514 michael                 11917 GBC           6 :                     ExecuteStmt *n = makeNode(ExecuteStmt);
                              11918                 : 
                              11919               6 :                     n->name = $10;
                              11920               6 :                     n->params = $11;
                              11921               6 :                     ctas->query = (Node *) n;
 1514 michael                 11922 GIC           6 :                     ctas->into = $7;
 1002                         11923               6 :                     ctas->objtype = OBJECT_TABLE;
 1514                         11924               6 :                     ctas->is_select_into = false;
 1514 michael                 11925 CBC           6 :                     ctas->if_not_exists = true;
                              11926                 :                     /* cram additional flags into the IntoClause */
                              11927               6 :                     $7->rel->relpersistence = $2;
                              11928               6 :                     $7->skipData = !($12);
                              11929               6 :                     $$ = (Node *) ctas;
                              11930                 :                 }
                              11931                 :         ;
                              11932                 : 
 7463 tgl                     11933 GIC        4288 : execute_param_clause: '(' expr_list ')'             { $$ = $2; }
 7530                         11934             530 :                     | /* EMPTY */                   { $$ = NIL; }
                              11935                 :                     ;
                              11936                 : 
                              11937                 : /*****************************************************************************
                              11938                 :  *
                              11939                 :  *      QUERY:
                              11940                 :  *              DEALLOCATE [PREPARE] <plan_name>
                              11941                 :  *
                              11942                 :  *****************************************************************************/
                              11943                 : 
                              11944                 : DeallocateStmt: DEALLOCATE name
                              11945                 :                     {
                              11946            1119 :                         DeallocateStmt *n = makeNode(DeallocateStmt);
                              11947                 : 
                              11948            1119 :                         n->name = $2;
                              11949            1119 :                         $$ = (Node *) n;
                              11950                 :                     }
                              11951                 :                 | DEALLOCATE PREPARE name
                              11952                 :                     {
                              11953               9 :                         DeallocateStmt *n = makeNode(DeallocateStmt);
                              11954                 : 
 7530 tgl                     11955 CBC           9 :                         n->name = $3;
 7530 tgl                     11956 GIC           9 :                         $$ = (Node *) n;
 5841 neilc                   11957 ECB             :                     }
                              11958                 :                 | DEALLOCATE ALL
                              11959                 :                     {
 5841 neilc                   11960 CBC          23 :                         DeallocateStmt *n = makeNode(DeallocateStmt);
                              11961                 : 
 5841 neilc                   11962 GIC          23 :                         n->name = NULL;
                              11963              23 :                         $$ = (Node *) n;
 5841 neilc                   11964 ECB             :                     }
                              11965                 :                 | DEALLOCATE PREPARE ALL
                              11966                 :                     {
 5841 neilc                   11967 UIC           0 :                         DeallocateStmt *n = makeNode(DeallocateStmt);
                              11968                 : 
                              11969               0 :                         n->name = NULL;
                              11970               0 :                         $$ = (Node *) n;
                              11971                 :                     }
                              11972                 :         ;
                              11973                 : 
                              11974                 : /*****************************************************************************
                              11975                 :  *
                              11976                 :  *      QUERY:
                              11977                 :  *              INSERT STATEMENTS
                              11978                 :  *
                              11979                 :  *****************************************************************************/
                              11980                 : 
                              11981                 : InsertStmt:
                              11982                 :             opt_with_clause INSERT INTO insert_target insert_rest
                              11983                 :             opt_on_conflict returning_clause
                              11984                 :                 {
 4559 tgl                     11985 CBC       43090 :                     $5->relation = $4;
 2893 andres                  11986 GIC       43090 :                     $5->onConflictClause = $6;
 2893 andres                  11987 CBC       43090 :                     $5->returningList = $7;
 4559 tgl                     11988           43090 :                     $5->withClause = $1;
                              11989           43090 :                     $$ = (Node *) $5;
                              11990                 :                 }
                              11991                 :         ;
                              11992                 : 
                              11993                 : /*
 2893 andres                  11994 ECB             :  * Can't easily make AS optional here, because VALUES in insert_rest would
 2881 tgl                     11995                 :  * have a shift/reduce conflict with VALUES as an optional alias.  We could
                              11996                 :  * easily allow unreserved_keywords as optional aliases, but that'd be an odd
                              11997                 :  * divergence from other places.  So just require AS for now.
 2893 andres                  11998                 :  */
                              11999                 : insert_target:
                              12000                 :             qualified_name
                              12001                 :                 {
 2893 andres                  12002 CBC       43027 :                     $$ = $1;
 2893 andres                  12003 ECB             :                 }
                              12004                 :             | qualified_name AS ColId
                              12005                 :                 {
 2893 andres                  12006 CBC          63 :                     $1->alias = makeAlias($3, NIL);
                              12007              63 :                     $$ = $1;
                              12008                 :                 }
                              12009                 :         ;
                              12010                 : 
                              12011                 : insert_rest:
 6094 mail                    12012 ECB             :             SelectStmt
 9344 bruce                   12013                 :                 {
 9221 bruce                   12014 GIC       34846 :                     $$ = makeNode(InsertStmt);
 8664 tgl                     12015 CBC       34846 :                     $$->cols = NIL;
 8221                         12016           34846 :                     $$->selectStmt = $1;
 8847 bruce                   12017 ECB             :                 }
 2194 peter_e                 12018                 :             | OVERRIDING override_kind VALUE_P SelectStmt
                              12019                 :                 {
 2194 peter_e                 12020 CBC          48 :                     $$ = makeNode(InsertStmt);
                              12021              48 :                     $$->cols = NIL;
 2194 peter_e                 12022 GIC          48 :                     $$->override = $2;
 2194 peter_e                 12023 CBC          48 :                     $$->selectStmt = $4;
 2194 peter_e                 12024 ECB             :                 }
 6094 mail                    12025                 :             | '(' insert_column_list ')' SelectStmt
                              12026                 :                 {
 8847 bruce                   12027 GIC        7821 :                     $$ = makeNode(InsertStmt);
                              12028            7821 :                     $$->cols = $2;
 6094 mail                    12029 CBC        7821 :                     $$->selectStmt = $4;
 8847 bruce                   12030 ECB             :                 }
                              12031                 :             | '(' insert_column_list ')' OVERRIDING override_kind VALUE_P SelectStmt
                              12032                 :                 {
 2194 peter_e                 12033 UIC           0 :                     $$ = makeNode(InsertStmt);
                              12034               0 :                     $$->cols = $2;
                              12035               0 :                     $$->override = $5;
                              12036               0 :                     $$->selectStmt = $7;
                              12037                 :                 }
                              12038                 :             | DEFAULT VALUES
                              12039                 :                 {
 8847 bruce                   12040 GIC         375 :                     $$ = makeNode(InsertStmt);
 6094 mail                    12041             375 :                     $$->cols = NIL;
 6094 mail                    12042 CBC         375 :                     $$->selectStmt = NULL;
                              12043                 :                 }
 9344 bruce                   12044 ECB             :         ;
                              12045                 : 
                              12046                 : override_kind:
 2194 peter_e                 12047 GIC          30 :             USER        { $$ = OVERRIDING_USER_VALUE; }
                              12048              30 :             | SYSTEM_P  { $$ = OVERRIDING_SYSTEM_VALUE; }
 2194 peter_e                 12049 ECB             :         ;
                              12050                 : 
 7601 bruce                   12051                 : insert_column_list:
 6878 tgl                     12052                 :             insert_column_item
 6878 tgl                     12053 GIC        7905 :                     { $$ = list_make1($1); }
                              12054                 :             | insert_column_list ',' insert_column_item
 7600 bruce                   12055           15554 :                     { $$ = lappend($1, $3); }
 9344 bruce                   12056 ECB             :         ;
                              12057                 : 
 7601                         12058                 : insert_column_item:
                              12059                 :             ColId opt_indirection
                              12060                 :                 {
 6878 tgl                     12061 GIC       23459 :                     $$ = makeNode(ResTarget);
                              12062           23459 :                     $$->name = $1;
 5018 tgl                     12063 GBC       23459 :                     $$->indirection = check_indirection($2, yyscanner);
 6878 tgl                     12064 GIC       23459 :                     $$->val = NULL;
 6226 tgl                     12065 GBC       23459 :                     $$->location = @1;
 9344 bruce                   12066 EUB             :                 }
                              12067                 :         ;
                              12068                 : 
                              12069                 : opt_on_conflict:
                              12070                 :             ON CONFLICT opt_conf_expr DO UPDATE SET set_clause_list where_clause
                              12071                 :                 {
 2893 andres                  12072 GIC         572 :                     $$ = makeNode(OnConflictClause);
                              12073             572 :                     $$->action = ONCONFLICT_UPDATE;
                              12074             572 :                     $$->infer = $3;
                              12075             572 :                     $$->targetList = $7;
                              12076             572 :                     $$->whereClause = $8;
                              12077             572 :                     $$->location = @1;
                              12078                 :                 }
                              12079                 :             |
                              12080                 :             ON CONFLICT opt_conf_expr DO NOTHING
 2893 andres                  12081 ECB             :                 {
 2893 andres                  12082 CBC         161 :                     $$ = makeNode(OnConflictClause);
                              12083             161 :                     $$->action = ONCONFLICT_NOTHING;
                              12084             161 :                     $$->infer = $3;
                              12085             161 :                     $$->targetList = NIL;
 2893 andres                  12086 GIC         161 :                     $$->whereClause = NULL;
                              12087             161 :                     $$->location = @1;
                              12088                 :                 }
                              12089                 :             | /*EMPTY*/
                              12090                 :                 {
                              12091           42357 :                     $$ = NULL;
                              12092                 :                 }
                              12093                 :         ;
                              12094                 : 
                              12095                 : opt_conf_expr:
                              12096                 :             '(' index_params ')' where_clause
                              12097                 :                 {
 2893 andres                  12098 CBC         628 :                     $$ = makeNode(InferClause);
 2893 andres                  12099 GIC         628 :                     $$->indexElems = $2;
                              12100             628 :                     $$->whereClause = $4;
                              12101             628 :                     $$->conname = NULL;
 2893 andres                  12102 CBC         628 :                     $$->location = @1;
 2893 andres                  12103 ECB             :                 }
                              12104                 :             |
                              12105                 :             ON CONSTRAINT name
                              12106                 :                 {
 2893 andres                  12107 GIC          24 :                     $$ = makeNode(InferClause);
                              12108              24 :                     $$->indexElems = NIL;
                              12109              24 :                     $$->whereClause = NULL;
 2893 andres                  12110 CBC          24 :                     $$->conname = $3;
                              12111              24 :                     $$->location = @1;
 2893 andres                  12112 ECB             :                 }
                              12113                 :             | /*EMPTY*/
                              12114                 :                 {
 2893 andres                  12115 GIC          81 :                     $$ = NULL;
 2893 andres                  12116 ECB             :                 }
                              12117                 :         ;
                              12118                 : 
 6084 tgl                     12119                 : returning_clause:
 6084 tgl                     12120 GIC        1232 :             RETURNING target_list       { $$ = $2; }
                              12121           51593 :             | /* EMPTY */               { $$ = NIL; }
                              12122                 :         ;
 6084 tgl                     12123 ECB             : 
 9297 lockhart                12124                 : 
 9770 scrappy                 12125                 : /*****************************************************************************
                              12126                 :  *
                              12127                 :  *      QUERY:
                              12128                 :  *              DELETE STATEMENTS
 9770 scrappy                 12129 EUB             :  *
                              12130                 :  *****************************************************************************/
 9351 lockhart                12131                 : 
 4559 tgl                     12132                 : DeleteStmt: opt_with_clause DELETE_P FROM relation_expr_opt_alias
                              12133                 :             using_clause where_or_current_clause returning_clause
                              12134                 :                 {
 9344 bruce                   12135 GIC        2104 :                     DeleteStmt *n = makeNode(DeleteStmt);
  331 peter                   12136 ECB             : 
 4559 tgl                     12137 CBC        2104 :                     n->relation = $4;
                              12138            2104 :                     n->usingClause = $5;
 4559 tgl                     12139 GIC        2104 :                     n->whereClause = $6;
                              12140            2104 :                     n->returningList = $7;
                              12141            2104 :                     n->withClause = $1;
  331 peter                   12142            2104 :                     $$ = (Node *) n;
 9344 bruce                   12143 ECB             :                 }
                              12144                 :         ;
                              12145                 : 
                              12146                 : using_clause:
 4177 peter_e                 12147 GIC          54 :                 USING from_list                     { $$ = $2; }
 6576 neilc                   12148            2050 :             | /*EMPTY*/                             { $$ = NIL; }
 6576 neilc                   12149 ECB             :         ;
                              12150                 : 
 5200 peter_e                 12151                 : 
                              12152                 : /*****************************************************************************
                              12153                 :  *
                              12154                 :  *      QUERY:
                              12155                 :  *              LOCK TABLE
                              12156                 :  *
                              12157                 :  *****************************************************************************/
                              12158                 : 
                              12159                 : LockStmt:   LOCK_P opt_table relation_expr_list opt_lock opt_nowait
 9208 bruce                   12160                 :                 {
  331 peter                   12161 CBC         522 :                     LockStmt   *n = makeNode(LockStmt);
                              12162                 : 
 7689 tgl                     12163 GIC         522 :                     n->relations = $3;
 8728 bruce                   12164             522 :                     n->mode = $4;
 6968 ishii                   12165             522 :                     n->nowait = $5;
  331 peter                   12166             522 :                     $$ = (Node *) n;
                              12167                 :                 }
 8733 lockhart                12168 ECB             :         ;
 8878 vadim4o                 12169                 : 
 4177 peter_e                 12170 CBC         476 : opt_lock:   IN_P lock_type MODE             { $$ = $2; }
 7600 bruce                   12171              46 :             | /*EMPTY*/                     { $$ = AccessExclusiveLock; }
 8733 lockhart                12172 ECB             :         ;
 9208 bruce                   12173                 : 
 7600 bruce                   12174 GIC         234 : lock_type:  ACCESS SHARE                    { $$ = AccessShareLock; }
                              12175               7 :             | ROW SHARE                     { $$ = RowShareLock; }
                              12176              44 :             | ROW EXCLUSIVE                 { $$ = RowExclusiveLock; }
                              12177              33 :             | SHARE UPDATE EXCLUSIVE        { $$ = ShareUpdateExclusiveLock; }
 7600 bruce                   12178 CBC          40 :             | SHARE                         { $$ = ShareLock; }
                              12179               6 :             | SHARE ROW EXCLUSIVE           { $$ = ShareRowExclusiveLock; }
                              12180              50 :             | EXCLUSIVE                     { $$ = ExclusiveLock; }
                              12181              62 :             | ACCESS EXCLUSIVE              { $$ = AccessExclusiveLock; }
 8878 vadim4o                 12182 ECB             :         ;
 9770 scrappy                 12183                 : 
 2062 peter_e                 12184 GIC         148 : opt_nowait: NOWAIT                          { $$ = true; }
                              12185             389 :             | /*EMPTY*/                     { $$ = false; }
                              12186                 :         ;
 6968 ishii                   12187 ECB             : 
                              12188                 : opt_nowait_or_skip:
 3106 alvherre                12189 GIC          25 :             NOWAIT                          { $$ = LockWaitError; }
                              12190              95 :             | SKIP LOCKED                   { $$ = LockWaitSkip; }
                              12191            2246 :             | /*EMPTY*/                     { $$ = LockWaitBlock; }
                              12192                 :         ;
                              12193                 : 
 8733 lockhart                12194 ECB             : 
 9770 scrappy                 12195                 : /*****************************************************************************
                              12196                 :  *
 9344 bruce                   12197                 :  *      QUERY:
 9221                         12198                 :  *              UpdateStmt (UPDATE)
                              12199                 :  *
                              12200                 :  *****************************************************************************/
                              12201                 : 
                              12202                 : UpdateStmt: opt_with_clause UPDATE relation_expr_opt_alias
 6062 tgl                     12203                 :             SET set_clause_list
 6063 bruce                   12204                 :             from_clause
 5781 tgl                     12205                 :             where_or_current_clause
 6063 bruce                   12206                 :             returning_clause
                              12207                 :                 {
 6063 bruce                   12208 GIC        7631 :                     UpdateStmt *n = makeNode(UpdateStmt);
                              12209                 : 
 4559 tgl                     12210            7631 :                     n->relation = $3;
 4559 tgl                     12211 CBC        7631 :                     n->targetList = $5;
 4559 tgl                     12212 GIC        7631 :                     n->fromClause = $6;
                              12213            7631 :                     n->whereClause = $7;
                              12214            7631 :                     n->returningList = $8;
                              12215            7631 :                     n->withClause = $1;
  331 peter                   12216 CBC        7631 :                     $$ = (Node *) n;
 6063 bruce                   12217 ECB             :                 }
                              12218                 :         ;
                              12219                 : 
                              12220                 : set_clause_list:
 6062 tgl                     12221 GIC        8555 :             set_clause                          { $$ = $1; }
                              12222            1955 :             | set_clause_list ',' set_clause    { $$ = list_concat($1,$3); }
                              12223                 :         ;
                              12224                 : 
                              12225                 : set_clause:
                              12226                 :             set_target '=' a_expr
                              12227                 :                 {
 2329                         12228           10422 :                     $1->val = (Node *) $3;
                              12229           10422 :                     $$ = list_make1($1);
                              12230                 :                 }
 2329 tgl                     12231 ECB             :             | '(' set_target_list ')' '=' a_expr
                              12232                 :                 {
  331 peter                   12233 CBC          88 :                     int         ncolumns = list_length($2);
                              12234              88 :                     int         i = 1;
  331 peter                   12235 ECB             :                     ListCell   *col_cell;
 3217 tgl                     12236                 : 
                              12237                 :                     /* Create a MultiAssignRef source for each target */
 3217 tgl                     12238 CBC         272 :                     foreach(col_cell, $2)
                              12239                 :                     {
  331 peter                   12240 GIC         184 :                         ResTarget  *res_col = (ResTarget *) lfirst(col_cell);
 3217 tgl                     12241             184 :                         MultiAssignRef *r = makeNode(MultiAssignRef);
                              12242                 : 
 2329 tgl                     12243 CBC         184 :                         r->source = (Node *) $5;
 3217                         12244             184 :                         r->colno = i;
 3217 tgl                     12245 GIC         184 :                         r->ncolumns = ncolumns;
                              12246             184 :                         res_col->val = (Node *) r;
                              12247             184 :                         i++;
                              12248                 :                     }
                              12249                 : 
 6062                         12250              88 :                     $$ = $2;
                              12251                 :                 }
                              12252                 :         ;
                              12253                 : 
                              12254                 : set_target:
                              12255                 :             ColId opt_indirection
                              12256                 :                 {
 6062 tgl                     12257 CBC       10609 :                     $$ = makeNode(ResTarget);
 6062 tgl                     12258 GIC       10609 :                     $$->name = $1;
 5018 tgl                     12259 CBC       10609 :                     $$->indirection = check_indirection($2, yyscanner);
 6062                         12260           10609 :                     $$->val = NULL;  /* upper production sets this */
                              12261           10609 :                     $$->location = @1;
 6062 tgl                     12262 ECB             :                 }
                              12263                 :         ;
                              12264                 : 
                              12265                 : set_target_list:
 6062 tgl                     12266 CBC          91 :             set_target                              { $$ = list_make1($1); }
                              12267              96 :             | set_target_list ',' set_target        { $$ = lappend($1,$3); }
                              12268                 :         ;
                              12269                 : 
 9770 scrappy                 12270 ECB             : 
  377 alvherre                12271                 : /*****************************************************************************
                              12272                 :  *
                              12273                 :  *      QUERY:
                              12274                 :  *              MERGE
                              12275                 :  *
                              12276                 :  *****************************************************************************/
                              12277                 : 
                              12278                 : MergeStmt:
                              12279                 :             opt_with_clause MERGE INTO relation_expr_opt_alias
                              12280                 :             USING table_ref
                              12281                 :             ON a_expr
                              12282                 :             merge_when_list
                              12283                 :                 {
  331 peter                   12284 GIC         528 :                     MergeStmt  *m = makeNode(MergeStmt);
  377 alvherre                12285 ECB             : 
  377 alvherre                12286 CBC         528 :                     m->withClause = $1;
                              12287             528 :                     m->relation = $4;
  377 alvherre                12288 GIC         528 :                     m->sourceRelation = $6;
                              12289             528 :                     m->joinCondition = $8;
                              12290             528 :                     m->mergeWhenClauses = $9;
                              12291                 : 
  331 peter                   12292             528 :                     $$ = (Node *) m;
                              12293                 :                 }
                              12294                 :         ;
                              12295                 : 
                              12296                 : merge_when_list:
  377 alvherre                12297             528 :             merge_when_clause                       { $$ = list_make1($1); }
                              12298             279 :             | merge_when_list merge_when_clause     { $$ = lappend($1,$2); }
                              12299                 :         ;
                              12300                 : 
                              12301                 : merge_when_clause:
                              12302                 :             WHEN MATCHED opt_merge_when_condition THEN merge_update
                              12303                 :                 {
  377 alvherre                12304 CBC         352 :                     $5->matched = true;
  377 alvherre                12305 GIC         352 :                     $5->condition = $3;
  377 alvherre                12306 ECB             : 
  377 alvherre                12307 CBC         352 :                     $$ = (Node *) $5;
  377 alvherre                12308 ECB             :                 }
                              12309                 :             | WHEN MATCHED opt_merge_when_condition THEN merge_delete
                              12310                 :                 {
  377 alvherre                12311 CBC         121 :                     $5->matched = true;
                              12312             121 :                     $5->condition = $3;
                              12313                 : 
  377 alvherre                12314 GIC         121 :                     $$ = (Node *) $5;
                              12315                 :                 }
                              12316                 :             | WHEN NOT MATCHED opt_merge_when_condition THEN merge_insert
  377 alvherre                12317 ECB             :                 {
  377 alvherre                12318 CBC         319 :                     $6->matched = false;
  377 alvherre                12319 GIC         319 :                     $6->condition = $4;
                              12320                 : 
                              12321             319 :                     $$ = (Node *) $6;
                              12322                 :                 }
                              12323                 :             | WHEN MATCHED opt_merge_when_condition THEN DO NOTHING
  377 alvherre                12324 ECB             :                 {
  377 alvherre                12325 CBC          11 :                     MergeWhenClause *m = makeNode(MergeWhenClause);
                              12326                 : 
  377 alvherre                12327 GIC          11 :                     m->matched = true;
                              12328              11 :                     m->commandType = CMD_NOTHING;
  377 alvherre                12329 CBC          11 :                     m->condition = $3;
  377 alvherre                12330 ECB             : 
  331 peter                   12331 GIC          11 :                     $$ = (Node *) m;
                              12332                 :                 }
                              12333                 :             | WHEN NOT MATCHED opt_merge_when_condition THEN DO NOTHING
  377 alvherre                12334 ECB             :                 {
  377 alvherre                12335 GIC           4 :                     MergeWhenClause *m = makeNode(MergeWhenClause);
  377 alvherre                12336 ECB             : 
  377 alvherre                12337 CBC           4 :                     m->matched = false;
  377 alvherre                12338 GIC           4 :                     m->commandType = CMD_NOTHING;
  377 alvherre                12339 CBC           4 :                     m->condition = $4;
  377 alvherre                12340 ECB             : 
  331 peter                   12341 CBC           4 :                     $$ = (Node *) m;
  377 alvherre                12342 ECB             :                 }
                              12343                 :         ;
                              12344                 : 
                              12345                 : opt_merge_when_condition:
  377 alvherre                12346 CBC         215 :             AND a_expr              { $$ = $2; }
  377 alvherre                12347 GIC         607 :             |                       { $$ = NULL; }
                              12348                 :         ;
                              12349                 : 
                              12350                 : merge_update:
                              12351                 :             UPDATE SET set_clause_list
                              12352                 :                 {
  377 alvherre                12353 CBC         352 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
                              12354             352 :                     n->commandType = CMD_UPDATE;
                              12355             352 :                     n->override = OVERRIDING_NOT_SET;
                              12356             352 :                     n->targetList = $3;
                              12357             352 :                     n->values = NIL;
                              12358                 : 
  377 alvherre                12359 GIC         352 :                     $$ = n;
                              12360                 :                 }
                              12361                 :         ;
  377 alvherre                12362 ECB             : 
                              12363                 : merge_delete:
                              12364                 :             DELETE_P
                              12365                 :                 {
  377 alvherre                12366 GIC         121 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
                              12367             121 :                     n->commandType = CMD_DELETE;
                              12368             121 :                     n->override = OVERRIDING_NOT_SET;
                              12369             121 :                     n->targetList = NIL;
                              12370             121 :                     n->values = NIL;
                              12371                 : 
                              12372             121 :                     $$ = n;
                              12373                 :                 }
                              12374                 :         ;
                              12375                 : 
                              12376                 : merge_insert:
                              12377                 :             INSERT merge_values_clause
                              12378                 :                 {
                              12379             217 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
  377 alvherre                12380 CBC         217 :                     n->commandType = CMD_INSERT;
  377 alvherre                12381 GIC         217 :                     n->override = OVERRIDING_NOT_SET;
  377 alvherre                12382 CBC         217 :                     n->targetList = NIL;
                              12383             217 :                     n->values = $2;
                              12384             217 :                     $$ = n;
  377 alvherre                12385 ECB             :                 }
                              12386                 :             | INSERT OVERRIDING override_kind VALUE_P merge_values_clause
                              12387                 :                 {
  377 alvherre                12388 LBC           0 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
  377 alvherre                12389 UIC           0 :                     n->commandType = CMD_INSERT;
                              12390               0 :                     n->override = $3;
                              12391               0 :                     n->targetList = NIL;
                              12392               0 :                     n->values = $5;
  377 alvherre                12393 LBC           0 :                     $$ = n;
  377 alvherre                12394 ECB             :                 }
                              12395                 :             | INSERT '(' insert_column_list ')' merge_values_clause
                              12396                 :                 {
  377 alvherre                12397 GIC          72 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
                              12398              72 :                     n->commandType = CMD_INSERT;
                              12399              72 :                     n->override = OVERRIDING_NOT_SET;
  377 alvherre                12400 CBC          72 :                     n->targetList = $3;
                              12401              72 :                     n->values = $5;
  377 alvherre                12402 GIC          72 :                     $$ = n;
  377 alvherre                12403 ECB             :                 }
                              12404                 :             | INSERT '(' insert_column_list ')' OVERRIDING override_kind VALUE_P merge_values_clause
                              12405                 :                 {
  377 alvherre                12406 GIC          12 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
  377 alvherre                12407 CBC          12 :                     n->commandType = CMD_INSERT;
                              12408              12 :                     n->override = $6;
  377 alvherre                12409 GIC          12 :                     n->targetList = $3;
  377 alvherre                12410 CBC          12 :                     n->values = $8;
  377 alvherre                12411 GIC          12 :                     $$ = n;
                              12412                 :                 }
                              12413                 :             | INSERT DEFAULT VALUES
  377 alvherre                12414 ECB             :                 {
  377 alvherre                12415 CBC          18 :                     MergeWhenClause *n = makeNode(MergeWhenClause);
  377 alvherre                12416 GIC          18 :                     n->commandType = CMD_INSERT;
  377 alvherre                12417 CBC          18 :                     n->override = OVERRIDING_NOT_SET;
  377 alvherre                12418 GIC          18 :                     n->targetList = NIL;
                              12419              18 :                     n->values = NIL;
                              12420              18 :                     $$ = n;
  377 alvherre                12421 ECB             :                 }
                              12422                 :         ;
                              12423                 : 
                              12424                 : merge_values_clause:
                              12425                 :             VALUES '(' expr_list ')'
                              12426                 :                 {
  377 alvherre                12427 CBC         301 :                     $$ = $3;
                              12428                 :                 }
                              12429                 :         ;
                              12430                 : 
 9770 scrappy                 12431 ECB             : /*****************************************************************************
                              12432                 :  *
 9344 bruce                   12433                 :  *      QUERY:
                              12434                 :  *              CURSOR STATEMENTS
 9770 scrappy                 12435                 :  *
                              12436                 :  *****************************************************************************/
 4897 alvherre                12437                 : DeclareCursorStmt: DECLARE cursor_name cursor_options CURSOR opt_hold FOR SelectStmt
                              12438                 :                 {
 7335 tgl                     12439 GIC        1381 :                     DeclareCursorStmt *n = makeNode(DeclareCursorStmt);
                              12440                 : 
 9344 bruce                   12441            1381 :                     n->portalname = $2;
 5837 tgl                     12442 ECB             :                     /* currently we always set FAST_PLAN option */
 5837 tgl                     12443 CBC        1381 :                     n->options = $3 | $5 | CURSOR_OPT_FAST_PLAN;
 7318 bruce                   12444 GIC        1381 :                     n->query = $7;
  331 peter                   12445            1381 :                     $$ = (Node *) n;
                              12446                 :                 }
                              12447                 :         ;
                              12448                 : 
 4897 alvherre                12449 CBC        5392 : cursor_name:    name                        { $$ = $1; }
 4897 alvherre                12450 ECB             :         ;
                              12451                 : 
 7335 tgl                     12452 CBC        1381 : cursor_options: /*EMPTY*/                   { $$ = 0; }
 7318 bruce                   12453              52 :             | cursor_options NO SCROLL      { $$ = $1 | CURSOR_OPT_NO_SCROLL; }
 7335 tgl                     12454 GIC         120 :             | cursor_options SCROLL         { $$ = $1 | CURSOR_OPT_SCROLL; }
 7318 bruce                   12455 CBC           5 :             | cursor_options BINARY         { $$ = $1 | CURSOR_OPT_BINARY; }
  732 peter                   12456 UIC           0 :             | cursor_options ASENSITIVE     { $$ = $1 | CURSOR_OPT_ASENSITIVE; }
 7335 tgl                     12457 GIC           3 :             | cursor_options INSENSITIVE    { $$ = $1 | CURSOR_OPT_INSENSITIVE; }
                              12458                 :         ;
                              12459                 : 
 5837                         12460            1332 : opt_hold: /* EMPTY */                       { $$ = 0; }
                              12461              46 :             | WITH HOLD                     { $$ = CURSOR_OPT_HOLD; }
 5837 tgl                     12462 CBC           3 :             | WITHOUT HOLD                  { $$ = 0; }
 7313 tgl                     12463 ECB             :         ;
 7318 bruce                   12464                 : 
 9770 scrappy                 12465                 : /*****************************************************************************
                              12466                 :  *
                              12467                 :  *      QUERY:
 9344 bruce                   12468                 :  *              SELECT STATEMENTS
                              12469                 :  *
                              12470                 :  *****************************************************************************/
                              12471                 : 
                              12472                 : /* A complete SELECT statement looks like this.
                              12473                 :  *
                              12474                 :  * The rule returns either a single SelectStmt node or a tree of them,
 8190 tgl                     12475                 :  * representing a set-operation tree.
                              12476                 :  *
 8119                         12477                 :  * There is an ambiguity when a sub-SELECT is within an a_expr and there
                              12478                 :  * are excess parentheses: do the parentheses belong to the sub-SELECT or
 5019                         12479                 :  * to the surrounding a_expr?  We don't really care, but bison wants to know.
 8119                         12480                 :  * To resolve the ambiguity, we are careful to define the grammar so that
                              12481                 :  * the decision is staved off as long as possible: as long as we can keep
                              12482                 :  * absorbing parentheses into the sub-SELECT, we will do so, and only when
                              12483                 :  * it's no longer possible to do that will we decide that parens belong to
 7601 bruce                   12484 EUB             :  * the expression.  For example, in "SELECT (((SELECT 2)) + 3)" the extra
 8119 tgl                     12485                 :  * parentheses are treated as part of the sub-select.  The necessity of doing
 7601 bruce                   12486                 :  * it that way is shown by "SELECT (((SELECT 2)) UNION SELECT 2)".    Had we
 8119 tgl                     12487                 :  * parsed "((SELECT 2))" as an a_expr, it'd be too late to go back to the
                              12488                 :  * SELECT viewpoint when we see the UNION.
                              12489                 :  *
                              12490                 :  * This approach is implemented by defining a nonterminal select_with_parens,
                              12491                 :  * which represents a SELECT with at least one outer layer of parentheses,
                              12492                 :  * and being careful to use select_with_parens, never '(' SelectStmt ')',
 8119 tgl                     12493 ECB             :  * in the expression grammar.  We will then have shift-reduce conflicts
                              12494                 :  * which we can resolve in favor of always treating '(' <select> ')' as
                              12495                 :  * a select_with_parens.  To resolve the conflicts, the productions that
                              12496                 :  * conflict with the select_with_parens productions are manually given
                              12497                 :  * precedences lower than the precedence of ')', thereby ensuring that we
                              12498                 :  * shift ')' (and then reduce to select_with_parens) rather than trying to
                              12499                 :  * reduce the inner <select> nonterminal to something else.  We use UMINUS
                              12500                 :  * precedence for this, which is a fairly arbitrary choice.
                              12501                 :  *
                              12502                 :  * To be able to define select_with_parens itself without ambiguity, we need
                              12503                 :  * a nonterminal select_no_parens that represents a SELECT structure with no
                              12504                 :  * outermost parentheses.  This is a little bit tedious, but it works.
                              12505                 :  *
                              12506                 :  * In non-expression contexts, we use SelectStmt which can represent a SELECT
                              12507                 :  * with or without outer parentheses.
                              12508                 :  */
                              12509                 : 
                              12510                 : SelectStmt: select_no_parens            %prec UMINUS
 7601 bruce                   12511                 :             | select_with_parens        %prec UMINUS
 8119 tgl                     12512                 :         ;
                              12513                 : 
 7601 bruce                   12514                 : select_with_parens:
 7601 bruce                   12515 CBC       44838 :             '(' select_no_parens ')'                { $$ = $2; }
                              12516              75 :             | '(' select_with_parens ')'            { $$ = $2; }
                              12517                 :         ;
                              12518                 : 
                              12519                 : /*
                              12520                 :  * This rule parses the equivalent of the standard's <query expression>.
                              12521                 :  * The duplicative productions are annoying, but hard to get rid of without
                              12522                 :  * creating shift/reduce conflicts.
 5300 tgl                     12523 ECB             :  *
                              12524                 :  *  The locking clause (FOR UPDATE etc) may be before or after LIMIT/OFFSET.
                              12525                 :  *  In <=7.2.X, LIMIT/OFFSET had to be after FOR UPDATE
                              12526                 :  *  We now support both orderings, but prefer LIMIT/OFFSET before the locking
                              12527                 :  * clause.
                              12528                 :  *  2002-08-28 bjm
                              12529                 :  */
                              12530                 : select_no_parens:
 7601 bruce                   12531 GIC      243746 :             simple_select                       { $$ = $1; }
                              12532                 :             | select_clause sort_clause
                              12533                 :                 {
 6188 tgl                     12534           24082 :                     insertSelectOptions((SelectStmt *) $1, $2, NIL,
 1097 alvherre                12535 ECB             :                                         NULL, NULL,
                              12536                 :                                         yyscanner);
 7601 bruce                   12537 CBC       24082 :                     $$ = $1;
                              12538                 :                 }
 6555 tgl                     12539 ECB             :             | select_clause opt_sort_clause for_locking_clause opt_select_limit
 7601 bruce                   12540                 :                 {
 7529 bruce                   12541 CBC        2144 :                     insertSelectOptions((SelectStmt *) $1, $2, $3,
 1097 alvherre                12542 GIC        2144 :                                         $4,
                              12543                 :                                         NULL,
                              12544                 :                                         yyscanner);
 7601 bruce                   12545 CBC        2144 :                     $$ = $1;
                              12546                 :                 }
                              12547                 :             | select_clause opt_sort_clause select_limit opt_for_locking_clause
 7601 bruce                   12548 ECB             :                 {
 7529 bruce                   12549 CBC        2984 :                     insertSelectOptions((SelectStmt *) $1, $2, $4,
 1097 alvherre                12550            2984 :                                         $3,
 5018 tgl                     12551 ECB             :                                         NULL,
 5018 tgl                     12552 EUB             :                                         yyscanner);
 7601 bruce                   12553 CBC        2978 :                     $$ = $1;
                              12554                 :                 }
                              12555                 :             | with_clause select_clause
 5300 tgl                     12556 ECB             :                 {
 5300 tgl                     12557 CBC         809 :                     insertSelectOptions((SelectStmt *) $2, NULL, NIL,
 1097 alvherre                12558 ECB             :                                         NULL,
 5018 tgl                     12559 GIC         809 :                                         $1,
                              12560                 :                                         yyscanner);
 5300                         12561             809 :                     $$ = $2;
                              12562                 :                 }
                              12563                 :             | with_clause select_clause sort_clause
                              12564                 :                 {
                              12565             194 :                     insertSelectOptions((SelectStmt *) $2, $3, NIL,
                              12566                 :                                         NULL,
 5018                         12567             194 :                                         $1,
                              12568                 :                                         yyscanner);
 5300                         12569             194 :                     $$ = $2;
                              12570                 :                 }
                              12571                 :             | with_clause select_clause opt_sort_clause for_locking_clause opt_select_limit
                              12572                 :                 {
                              12573               3 :                     insertSelectOptions((SelectStmt *) $2, $3, $4,
 1097 alvherre                12574               3 :                                         $5,
 5018 tgl                     12575               3 :                                         $1,
                              12576                 :                                         yyscanner);
 5300                         12577               3 :                     $$ = $2;
                              12578                 :                 }
                              12579                 :             | with_clause select_clause opt_sort_clause select_limit opt_for_locking_clause
                              12580                 :                 {
                              12581              32 :                     insertSelectOptions((SelectStmt *) $2, $3, $5,
 1097 alvherre                12582              32 :                                         $4,
 5018 tgl                     12583              32 :                                         $1,
                              12584                 :                                         yyscanner);
 5300                         12585              32 :                     $$ = $2;
                              12586                 :                 }
                              12587                 :         ;
                              12588                 : 
                              12589                 : select_clause:
 7601 bruce                   12590           63356 :             simple_select                           { $$ = $1; }
                              12591             230 :             | select_with_parens                    { $$ = $1; }
                              12592                 :         ;
                              12593                 : 
                              12594                 : /*
                              12595                 :  * This rule parses SELECT statements that can appear within set operations,
                              12596                 :  * including UNION, INTERSECT and EXCEPT.  '(' and ')' can be used to specify
                              12597                 :  * the ordering of the set operations.  Without '(' and ')' we want the
                              12598                 :  * operations to be ordered per the precedence specs at the head of this file.
                              12599                 :  *
                              12600                 :  * As with select_no_parens, simple_select cannot have outer parentheses,
                              12601                 :  * but can have parenthesized subclauses.
                              12602                 :  *
                              12603                 :  * It might appear that we could fold the first two alternatives into one
                              12604                 :  * by using opt_distinct_clause.  However, that causes a shift/reduce conflict
                              12605                 :  * against INSERT ... SELECT ... ON CONFLICT.  We avoid the ambiguity by
                              12606                 :  * requiring SELECT DISTINCT [ON] to be followed by a non-empty target_list.
                              12607                 :  *
                              12608                 :  * Note that sort clauses cannot be included at this level --- SQL requires
                              12609                 :  *      SELECT foo UNION SELECT bar ORDER BY baz
                              12610                 :  * to be parsed as
 8190 tgl                     12611 ECB             :  *      (SELECT foo UNION SELECT bar) ORDER BY baz
                              12612                 :  * not
                              12613                 :  *      SELECT foo UNION (SELECT bar ORDER BY baz)
                              12614                 :  * Likewise for WITH, FOR UPDATE and LIMIT.  Therefore, those clauses are
                              12615                 :  * described as part of the select_no_parens production, not simple_select.
                              12616                 :  * This does not limit functionality, because you can reintroduce these
                              12617                 :  * clauses inside parentheses.
                              12618                 :  *
                              12619                 :  * NOTE: only the leftmost component SelectStmt should have INTO.
                              12620                 :  * However, this is not checked by the grammar; parse analysis must check it.
                              12621                 :  */
                              12622                 : simple_select:
                              12623                 :             SELECT opt_all_clause opt_target_list
                              12624                 :             into_clause from_clause where_clause
                              12625                 :             group_clause having_clause window_clause
                              12626                 :                 {
 2893 andres                  12627 CBC      246886 :                     SelectStmt *n = makeNode(SelectStmt);
                              12628                 : 
 2893 andres                  12629 GIC      246886 :                     n->targetList = $3;
 2893 andres                  12630 CBC      246886 :                     n->intoClause = $4;
 2893 andres                  12631 GIC      246886 :                     n->fromClause = $5;
                              12632          246886 :                     n->whereClause = $6;
  752 tomas.vondra            12633 CBC      246886 :                     n->groupClause = ($7)->list;
  752 tomas.vondra            12634 GIC      246886 :                     n->groupDistinct = ($7)->distinct;
 2893 andres                  12635          246886 :                     n->havingClause = $8;
                              12636          246886 :                     n->windowClause = $9;
  331 peter                   12637 CBC      246886 :                     $$ = (Node *) n;
 2893 andres                  12638 ECB             :                 }
                              12639                 :             | SELECT distinct_clause target_list
                              12640                 :             into_clause from_clause where_clause
 5215 tgl                     12641                 :             group_clause having_clause window_clause
                              12642                 :                 {
 9221 bruce                   12643 GIC        3996 :                     SelectStmt *n = makeNode(SelectStmt);
                              12644                 : 
 8473 tgl                     12645 CBC        3996 :                     n->distinctClause = $2;
 9344 bruce                   12646            3996 :                     n->targetList = $3;
 5826 tgl                     12647 GIC        3996 :                     n->intoClause = $4;
 9344 bruce                   12648            3996 :                     n->fromClause = $5;
 9344 bruce                   12649 CBC        3996 :                     n->whereClause = $6;
  752 tomas.vondra            12650 GIC        3996 :                     n->groupClause = ($7)->list;
                              12651            3996 :                     n->groupDistinct = ($7)->distinct;
 9344 bruce                   12652            3996 :                     n->havingClause = $8;
 5215 tgl                     12653 CBC        3996 :                     n->windowClause = $9;
  331 peter                   12654 GIC        3996 :                     $$ = (Node *) n;
 9344 bruce                   12655 ECB             :                 }
 6094 mail                    12656 GIC       39445 :             | values_clause                         { $$ = $1; }
 5252 peter_e                 12657 ECB             :             | TABLE relation_expr
                              12658                 :                 {
                              12659                 :                     /* same as SELECT * FROM relation_expr */
  331 peter                   12660 GIC         109 :                     ColumnRef  *cr = makeNode(ColumnRef);
  331 peter                   12661 CBC         109 :                     ResTarget  *rt = makeNode(ResTarget);
 5253 peter_e                 12662 GIC         109 :                     SelectStmt *n = makeNode(SelectStmt);
 5253 peter_e                 12663 ECB             : 
 5253 peter_e                 12664 GIC         109 :                     cr->fields = list_make1(makeNode(A_Star));
 5253 peter_e                 12665 CBC         109 :                     cr->location = -1;
                              12666                 : 
 5253 peter_e                 12667 GIC         109 :                     rt->name = NULL;
                              12668             109 :                     rt->indirection = NIL;
  331 peter                   12669 CBC         109 :                     rt->val = (Node *) cr;
 5253 peter_e                 12670             109 :                     rt->location = -1;
 5253 peter_e                 12671 ECB             : 
 5253 peter_e                 12672 GIC         109 :                     n->targetList = list_make1(rt);
 5253 peter_e                 12673 CBC         109 :                     n->fromClause = list_make1($2);
  331 peter                   12674 GIC         109 :                     $$ = (Node *) n;
                              12675                 :                 }
                              12676                 :             | select_clause UNION set_quantifier select_clause
 7601 bruce                   12677 ECB             :                 {
  752 tomas.vondra            12678 CBC       16321 :                     $$ = makeSetOp(SETOP_UNION, $3 == SET_QUANTIFIER_ALL, $1, $4);
 7601 bruce                   12679 ECB             :                 }
                              12680                 :             | select_clause INTERSECT set_quantifier select_clause
                              12681                 :                 {
  752 tomas.vondra            12682 GIC         126 :                     $$ = makeSetOp(SETOP_INTERSECT, $3 == SET_QUANTIFIER_ALL, $1, $4);
                              12683                 :                 }
                              12684                 :             | select_clause EXCEPT set_quantifier select_clause
                              12685                 :                 {
  752 tomas.vondra            12686 CBC         219 :                     $$ = makeSetOp(SETOP_EXCEPT, $3 == SET_QUANTIFIER_ALL, $1, $4);
 7601 bruce                   12687 ECB             :                 }
                              12688                 :         ;
                              12689                 : 
                              12690                 : /*
                              12691                 :  * SQL standard WITH clause looks like:
                              12692                 :  *
                              12693                 :  * WITH [ RECURSIVE ] <query name> [ (<column>,...) ]
                              12694                 :  *      AS (query) [ SEARCH or CYCLE clause ]
                              12695                 :  *
                              12696                 :  * Recognizing WITH_LA here allows a CTE to be named TIME or ORDINALITY.
                              12697                 :  */
                              12698                 : with_clause:
                              12699                 :         WITH cte_list
                              12700                 :             {
 5300 tgl                     12701 GIC         989 :                 $$ = makeNode(WithClause);
                              12702             989 :                 $$->ctes = $2;
                              12703             989 :                 $$->recursive = false;
                              12704             989 :                 $$->location = @1;
                              12705                 :             }
                              12706                 :         | WITH_LA cte_list
                              12707                 :             {
 2966                         12708               3 :                 $$ = makeNode(WithClause);
                              12709               3 :                 $$->ctes = $2;
                              12710               3 :                 $$->recursive = false;
                              12711               3 :                 $$->location = @1;
                              12712                 :             }
                              12713                 :         | WITH RECURSIVE cte_list
                              12714                 :             {
 5300                         12715             500 :                 $$ = makeNode(WithClause);
                              12716             500 :                 $$->ctes = $3;
                              12717             500 :                 $$->recursive = true;
                              12718             500 :                 $$->location = @1;
                              12719                 :             }
                              12720                 :         ;
                              12721                 : 
                              12722                 : cte_list:
 5300 tgl                     12723 CBC        1492 :         common_table_expr                       { $$ = list_make1($1); }
 5300 tgl                     12724 GIC         381 :         | cte_list ',' common_table_expr        { $$ = lappend($1, $3); }
 5300 tgl                     12725 ECB             :         ;
                              12726                 : 
  797 peter                   12727                 : common_table_expr:  name opt_name_list AS opt_materialized '(' PreparableStmt ')' opt_search_clause opt_cycle_clause
 5300 tgl                     12728                 :             {
 5300 tgl                     12729 CBC        1873 :                 CommonTableExpr *n = makeNode(CommonTableExpr);
  331 peter                   12730 ECB             : 
 5300 tgl                     12731 CBC        1873 :                 n->ctename = $1;
                              12732            1873 :                 n->aliascolnames = $2;
 1513                         12733            1873 :                 n->ctematerialized = $4;
 1513 tgl                     12734 GIC        1873 :                 n->ctequery = $6;
  797 peter                   12735            1873 :                 n->search_clause = castNode(CTESearchClause, $8);
                              12736            1873 :                 n->cycle_clause = castNode(CTECycleClause, $9);
 5300 tgl                     12737            1873 :                 n->location = @1;
                              12738            1873 :                 $$ = (Node *) n;
 5300 tgl                     12739 ECB             :             }
                              12740                 :         ;
                              12741                 : 
 1513                         12742                 : opt_materialized:
 1513 tgl                     12743 CBC          62 :         MATERIALIZED                            { $$ = CTEMaterializeAlways; }
                              12744              21 :         | NOT MATERIALIZED                      { $$ = CTEMaterializeNever; }
                              12745            1790 :         | /*EMPTY*/                             { $$ = CTEMaterializeDefault; }
 1513 tgl                     12746 ECB             :         ;
                              12747                 : 
  797 peter                   12748                 : opt_search_clause:
                              12749                 :         SEARCH DEPTH FIRST_P BY columnList SET ColId
                              12750                 :             {
  797 peter                   12751 GIC          45 :                 CTESearchClause *n = makeNode(CTESearchClause);
  331 peter                   12752 ECB             : 
  797 peter                   12753 GIC          45 :                 n->search_col_list = $5;
                              12754              45 :                 n->search_breadth_first = false;
                              12755              45 :                 n->search_seq_column = $7;
  797 peter                   12756 CBC          45 :                 n->location = @1;
                              12757              45 :                 $$ = (Node *) n;
  797 peter                   12758 ECB             :             }
                              12759                 :         | SEARCH BREADTH FIRST_P BY columnList SET ColId
                              12760                 :             {
  797 peter                   12761 CBC          18 :                 CTESearchClause *n = makeNode(CTESearchClause);
                              12762                 : 
                              12763              18 :                 n->search_col_list = $5;
                              12764              18 :                 n->search_breadth_first = true;
                              12765              18 :                 n->search_seq_column = $7;
                              12766              18 :                 n->location = @1;
  797 peter                   12767 GIC          18 :                 $$ = (Node *) n;
  797 peter                   12768 ECB             :             }
                              12769                 :         | /*EMPTY*/
                              12770                 :             {
  797 peter                   12771 GIC        1810 :                 $$ = NULL;
                              12772                 :             }
                              12773                 :         ;
  797 peter                   12774 ECB             : 
                              12775                 : opt_cycle_clause:
                              12776                 :         CYCLE columnList SET ColId TO AexprConst DEFAULT AexprConst USING ColId
                              12777                 :             {
  797 peter                   12778 CBC          33 :                 CTECycleClause *n = makeNode(CTECycleClause);
                              12779                 : 
  797 peter                   12780 GIC          33 :                 n->cycle_col_list = $2;
                              12781              33 :                 n->cycle_mark_column = $4;
  797 peter                   12782 CBC          33 :                 n->cycle_mark_value = $6;
  797 peter                   12783 GIC          33 :                 n->cycle_mark_default = $8;
                              12784              33 :                 n->cycle_path_column = $10;
                              12785              33 :                 n->location = @1;
                              12786              33 :                 $$ = (Node *) n;
                              12787                 :             }
                              12788                 :         | CYCLE columnList SET ColId USING ColId
                              12789                 :             {
  771                         12790              30 :                 CTECycleClause *n = makeNode(CTECycleClause);
                              12791                 : 
                              12792              30 :                 n->cycle_col_list = $2;
                              12793              30 :                 n->cycle_mark_column = $4;
                              12794              30 :                 n->cycle_mark_value = makeBoolAConst(true, -1);
                              12795              30 :                 n->cycle_mark_default = makeBoolAConst(false, -1);
                              12796              30 :                 n->cycle_path_column = $6;
  771 peter                   12797 CBC          30 :                 n->location = @1;
                              12798              30 :                 $$ = (Node *) n;
  771 peter                   12799 ECB             :             }
  797                         12800                 :         | /*EMPTY*/
                              12801                 :             {
  797 peter                   12802 GIC        1810 :                 $$ = NULL;
                              12803                 :             }
  797 peter                   12804 ECB             :         ;
                              12805                 : 
 4559 tgl                     12806                 : opt_with_clause:
 4559 tgl                     12807 CBC         454 :         with_clause                             { $$ = $1; }
 4559 tgl                     12808 GIC       52945 :         | /*EMPTY*/                             { $$ = NULL; }
                              12809                 :         ;
                              12810                 : 
 7601 bruce                   12811 ECB             : into_clause:
 5892 tgl                     12812                 :             INTO OptTempTableName
                              12813                 :                 {
 5892 tgl                     12814 CBC          64 :                     $$ = makeNode(IntoClause);
 5892 tgl                     12815 GIC          64 :                     $$->rel = $2;
                              12816              64 :                     $$->colNames = NIL;
                              12817              64 :                     $$->options = NIL;
                              12818              64 :                     $$->onCommit = ONCOMMIT_NOOP;
 5892 tgl                     12819 CBC          64 :                     $$->tableSpaceName = NULL;
 3649                         12820              64 :                     $$->viewQuery = NULL;
 4154 tgl                     12821 GIC          64 :                     $$->skipData = false;
                              12822                 :                 }
                              12823                 :             | /*EMPTY*/
 5892                         12824          250821 :                 { $$ = NULL; }
 8439 tgl                     12825 ECB             :         ;
                              12826                 : 
                              12827                 : /*
                              12828                 :  * Redundancy here is needed to avoid shift/reduce conflicts,
                              12829                 :  * since TEMP is not a reserved word.  See also OptTemp.
                              12830                 :  */
 7601 bruce                   12831                 : OptTempTableName:
                              12832                 :             TEMPORARY opt_table qualified_name
                              12833                 :                 {
 7689 tgl                     12834 LBC           0 :                     $$ = $3;
 4500 rhaas                   12835 UIC           0 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
                              12836                 :                 }
                              12837                 :             | TEMP opt_table qualified_name
                              12838                 :                 {
 7689 tgl                     12839 CBC           3 :                     $$ = $3;
 4500 rhaas                   12840               3 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
 7689 tgl                     12841 ECB             :                 }
                              12842                 :             | LOCAL TEMPORARY opt_table qualified_name
                              12843                 :                 {
 7689 tgl                     12844 UIC           0 :                     $$ = $4;
 4500 rhaas                   12845               0 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
                              12846                 :                 }
 7689 tgl                     12847 ECB             :             | LOCAL TEMP opt_table qualified_name
                              12848                 :                 {
 7689 tgl                     12849 LBC           0 :                     $$ = $4;
 4500 rhaas                   12850               0 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
 7689 tgl                     12851 ECB             :                 }
                              12852                 :             | GLOBAL TEMPORARY opt_table qualified_name
 8439                         12853                 :                 {
 3952 tgl                     12854 UIC           0 :                     ereport(WARNING,
                              12855                 :                             (errmsg("GLOBAL is deprecated in temporary table creation"),
                              12856                 :                              parser_errposition(@1)));
 7689 tgl                     12857 LBC           0 :                     $$ = $4;
 4500 rhaas                   12858 UIC           0 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
 8439 tgl                     12859 ECB             :                 }
 7689                         12860                 :             | GLOBAL TEMP opt_table qualified_name
 8439                         12861                 :                 {
 3952 tgl                     12862 LBC           0 :                     ereport(WARNING,
 3952 tgl                     12863 ECB             :                             (errmsg("GLOBAL is deprecated in temporary table creation"),
                              12864                 :                              parser_errposition(@1)));
 7689 tgl                     12865 UIC           0 :                     $$ = $4;
 4500 rhaas                   12866               0 :                     $$->relpersistence = RELPERSISTENCE_TEMP;
 7689 tgl                     12867 ECB             :                 }
                              12868                 :             | UNLOGGED opt_table qualified_name
                              12869                 :                 {
 4484 rhaas                   12870 UIC           0 :                     $$ = $3;
                              12871               0 :                     $$->relpersistence = RELPERSISTENCE_UNLOGGED;
                              12872                 :                 }
                              12873                 :             | TABLE qualified_name
 7601 bruce                   12874 ECB             :                 {
 7689 tgl                     12875 GIC          15 :                     $$ = $2;
 4500 rhaas                   12876 CBC          15 :                     $$->relpersistence = RELPERSISTENCE_PERMANENT;
 7689 tgl                     12877 ECB             :                 }
                              12878                 :             | qualified_name
 7601 bruce                   12879                 :                 {
 7689 tgl                     12880 CBC          46 :                     $$ = $1;
 4500 rhaas                   12881              46 :                     $$->relpersistence = RELPERSISTENCE_PERMANENT;
 8439 tgl                     12882 ECB             :                 }
                              12883                 :         ;
                              12884                 : 
                              12885                 : opt_table:  TABLE
  878 peter                   12886                 :             | /*EMPTY*/
                              12887                 :         ;
 9770 scrappy                 12888                 : 
  752 tomas.vondra            12889                 : set_quantifier:
  752 tomas.vondra            12890 CBC       11962 :             ALL                                     { $$ = SET_QUANTIFIER_ALL; }
                              12891              16 :             | DISTINCT                              { $$ = SET_QUANTIFIER_DISTINCT; }
                              12892            7247 :             | /*EMPTY*/                             { $$ = SET_QUANTIFIER_DEFAULT; }
 9274 lockhart                12893 ECB             :         ;
                              12894                 : 
                              12895                 : /* We use (NIL) as a placeholder to indicate that all target expressions
                              12896                 :  * should be placed in the DISTINCT list during parsetree analysis.
                              12897                 :  */
 2893 andres                  12898                 : distinct_clause:
 6888 neilc                   12899 GIC        3918 :             DISTINCT                                { $$ = list_make1(NIL); }
 7601 bruce                   12900              81 :             | DISTINCT ON '(' expr_list ')'         { $$ = $4; }
                              12901                 :         ;
                              12902                 : 
 2893 andres                  12903 ECB             : opt_all_clause:
  878 peter                   12904                 :             ALL
                              12905                 :             | /*EMPTY*/
                              12906                 :         ;
                              12907                 : 
                              12908                 : opt_distinct_clause:
  807 tgl                     12909 UIC           0 :             distinct_clause                         { $$ = $1; }
  807 tgl                     12910 CBC       17582 :             | opt_all_clause                        { $$ = NIL; }
  807 tgl                     12911 ECB             :         ;
                              12912                 : 
 7529 bruce                   12913                 : opt_sort_clause:
  807 tgl                     12914 CBC        4599 :             sort_clause                             { $$ = $1; }
 7529 bruce                   12915          263024 :             | /*EMPTY*/                             { $$ = NIL; }
 7529 bruce                   12916 ECB             :         ;
                              12917                 : 
                              12918                 : sort_clause:
 7601 bruce                   12919 GIC       29049 :             ORDER BY sortby_list                    { $$ = $3; }
 9344 bruce                   12920 ECB             :         ;
                              12921                 : 
                              12922                 : sortby_list:
 6888 neilc                   12923 GIC       29058 :             sortby                                  { $$ = list_make1($1); }
 7601 bruce                   12924           12627 :             | sortby_list ',' sortby                { $$ = lappend($1, $3); }
                              12925                 :         ;
                              12926                 : 
                              12927                 : sortby:     a_expr USING qual_all_Op opt_nulls_order
                              12928                 :                 {
 7175 tgl                     12929             110 :                     $$ = makeNode(SortBy);
 9013 scrappy                 12930 GBC         110 :                     $$->node = $1;
 5934 tgl                     12931             110 :                     $$->sortby_dir = SORTBY_USING;
 5934 tgl                     12932 GIC         110 :                     $$->sortby_nulls = $4;
 7175                         12933             110 :                     $$->useOp = $3;
 5333                         12934             110 :                     $$->location = @3;
 7175 tgl                     12935 ECB             :                 }
 5867 meskes                  12936                 :             | a_expr opt_asc_desc opt_nulls_order
                              12937                 :                 {
 7175 tgl                     12938 GIC       41575 :                     $$ = makeNode(SortBy);
                              12939           41575 :                     $$->node = $1;
 5867 meskes                  12940 GBC       41575 :                     $$->sortby_dir = $2;
 5934 tgl                     12941           41575 :                     $$->sortby_nulls = $3;
 7175 tgl                     12942 GIC       41575 :                     $$->useOp = NIL;
 5333                         12943           41575 :                     $$->location = -1;       /* no operator */
                              12944                 :                 }
 9344 bruce                   12945 EUB             :         ;
 9770 scrappy                 12946                 : 
                              12947                 : 
                              12948                 : select_limit:
                              12949                 :             limit_clause offset_clause
 1097 alvherre                12950                 :                 {
 1097 alvherre                12951 GIC          81 :                     $$ = $1;
                              12952              81 :                     ($$)->limitOffset = $2;
 1097 alvherre                12953 EUB             :                 }
                              12954                 :             | offset_clause limit_clause
                              12955                 :                 {
 1097 alvherre                12956 GIC         106 :                     $$ = $2;
                              12957             106 :                     ($$)->limitOffset = $1;
 1097 alvherre                12958 EUB             :                 }
                              12959                 :             | limit_clause
                              12960                 :                 {
 1097 alvherre                12961 GBC        2752 :                     $$ = $1;
 1097 alvherre                12962 EUB             :                 }
                              12963                 :             | offset_clause
                              12964                 :                 {
 1097 alvherre                12965 GIC         172 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
  331 peter                   12966 EUB             : 
 1097 alvherre                12967 GBC         172 :                     n->limitOffset = $1;
 1097 alvherre                12968 GIC         172 :                     n->limitCount = NULL;
                              12969             172 :                     n->limitOption = LIMIT_OPTION_COUNT;
                              12970             172 :                     $$ = n;
 1097 alvherre                12971 ECB             :                 }
 4982 tgl                     12972                 :         ;
                              12973                 : 
                              12974                 : opt_select_limit:
 4982 tgl                     12975 GIC          95 :             select_limit                        { $$ = $1; }
 1097 alvherre                12976 CBC       19634 :             | /* EMPTY */                       { $$ = NULL; }
 4982 tgl                     12977 ECB             :         ;
                              12978                 : 
                              12979                 : limit_clause:
                              12980                 :             LIMIT select_limit_value
                              12981                 :                 {
 1097 alvherre                12982 GIC        2899 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
                              12983                 : 
                              12984            2899 :                     n->limitOffset = NULL;
                              12985            2899 :                     n->limitCount = $2;
 1097 alvherre                12986 CBC        2899 :                     n->limitOption = LIMIT_OPTION_COUNT;
                              12987            2899 :                     $$ = n;
 1097 alvherre                12988 ECB             :                 }
                              12989                 :             | LIMIT select_limit_value ',' select_offset_value
                              12990                 :                 {
                              12991                 :                     /* Disabled because it was too confusing, bjm 2002-02-18 */
 7204 tgl                     12992 UIC           0 :                     ereport(ERROR,
                              12993                 :                             (errcode(ERRCODE_SYNTAX_ERROR),
                              12994                 :                              errmsg("LIMIT #,# syntax is not supported"),
 5333 tgl                     12995 ECB             :                              errhint("Use separate LIMIT and OFFSET clauses."),
 5018                         12996                 :                              parser_errposition(@1)));
                              12997                 :                 }
                              12998                 :             /* SQL:2008 syntax */
                              12999                 :             /* to avoid shift/reduce conflicts, handle the optional value with
                              13000                 :              * a separate production rather than an opt_ expression.  The fact
                              13001                 :              * that ONLY is fully reserved means that this way, we defer any
                              13002                 :              * decision about what rule reduces ROW or ROWS to the point where
                              13003                 :              * we can see the ONLY token in the lookahead slot.
                              13004                 :              */
 1784 rhodiumtoad             13005 EUB             :             | FETCH first_or_next select_fetch_first_value row_or_rows ONLY
 1097 alvherre                13006 ECB             :                 {
 1097 alvherre                13007 GIC          10 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
                              13008                 : 
                              13009              10 :                     n->limitOffset = NULL;
 1097 alvherre                13010 CBC          10 :                     n->limitCount = $3;
                              13011              10 :                     n->limitOption = LIMIT_OPTION_COUNT;
 1097 alvherre                13012 GIC          10 :                     $$ = n;
                              13013                 :                 }
                              13014                 :             | FETCH first_or_next select_fetch_first_value row_or_rows WITH TIES
 1097 alvherre                13015 ECB             :                 {
 1097 alvherre                13016 GIC          27 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
                              13017                 : 
                              13018              27 :                     n->limitOffset = NULL;
 1097 alvherre                13019 CBC          27 :                     n->limitCount = $3;
                              13020              27 :                     n->limitOption = LIMIT_OPTION_WITH_TIES;
 1097 alvherre                13021 GIC          27 :                     $$ = n;
                              13022                 :                 }
                              13023                 :             | FETCH first_or_next row_or_rows ONLY
                              13024                 :                 {
 1097 alvherre                13025 LBC           0 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
  331 peter                   13026 ECB             : 
 1097 alvherre                13027 LBC           0 :                     n->limitOffset = NULL;
                              13028               0 :                     n->limitCount = makeIntConst(1, -1);
                              13029               0 :                     n->limitOption = LIMIT_OPTION_COUNT;
                              13030               0 :                     $$ = n;
                              13031                 :                 }
                              13032                 :             | FETCH first_or_next row_or_rows WITH TIES
                              13033                 :                 {
 1056 alvherre                13034 CBC           3 :                     SelectLimit *n = (SelectLimit *) palloc(sizeof(SelectLimit));
  331 peter                   13035 ECB             : 
 1056 alvherre                13036 CBC           3 :                     n->limitOffset = NULL;
                              13037               3 :                     n->limitCount = makeIntConst(1, -1);
                              13038               3 :                     n->limitOption = LIMIT_OPTION_WITH_TIES;
                              13039               3 :                     $$ = n;
                              13040                 :                 }
                              13041                 :         ;
                              13042                 : 
                              13043                 : offset_clause:
                              13044                 :             OFFSET select_offset_value
 4982 tgl                     13045 GIC         359 :                 { $$ = $2; }
                              13046                 :             /* SQL:2008 syntax */
 1784 rhodiumtoad             13047 ECB             :             | OFFSET select_fetch_first_value row_or_rows
 4982 tgl                     13048 LBC           0 :                 { $$ = $2; }
                              13049                 :         ;
                              13050                 : 
                              13051                 : select_limit_value:
 7220 tgl                     13052 CBC        2898 :             a_expr                                  { $$ = $1; }
 7601 bruce                   13053 ECB             :             | ALL
                              13054                 :                 {
                              13055                 :                     /* LIMIT ALL is represented as a NULL constant */
 5337 tgl                     13056 GIC           1 :                     $$ = makeNullAConst(@1);
 7601 bruce                   13057 ECB             :                 }
                              13058                 :         ;
                              13059                 : 
                              13060                 : select_offset_value:
 4982 tgl                     13061 CBC         359 :             a_expr                                  { $$ = $1; }
                              13062                 :         ;
 4982 tgl                     13063 ECB             : 
 5282 peter_e                 13064                 : /*
                              13065                 :  * Allowing full expressions without parentheses causes various parsing
 1784 rhodiumtoad             13066                 :  * problems with the trailing ROW/ROWS key words.  SQL spec only calls for
                              13067                 :  * <simple value specification>, which is either a literal or a parameter (but
                              13068                 :  * an <SQL parameter reference> could be an identifier, bringing up conflicts
                              13069                 :  * with ROW/ROWS). We solve this by leveraging the presence of ONLY (see above)
                              13070                 :  * to determine whether the expression is missing rather than trying to make it
                              13071                 :  * optional in this rule.
                              13072                 :  *
                              13073                 :  * c_expr covers almost all the spec-required cases (and more), but it doesn't
                              13074                 :  * cover signed numeric literals, which are allowed by the spec. So we include
                              13075                 :  * those here explicitly. We need FCONST as well as ICONST because values that
                              13076                 :  * don't fit in the platform's "long", but do fit in bigint, should still be
                              13077                 :  * accepted here. (This is possible in 64-bit Windows as well as all 32-bit
                              13078                 :  * builds.)
                              13079                 :  */
                              13080                 : select_fetch_first_value:
 1784 rhodiumtoad             13081 CBC          37 :             c_expr                                  { $$ = $1; }
 1784 rhodiumtoad             13082 ECB             :             | '+' I_or_F_const
 1784 rhodiumtoad             13083 LBC           0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
                              13084                 :             | '-' I_or_F_const
 1784 rhodiumtoad             13085 UIC           0 :                 { $$ = doNegate($2, @1); }
                              13086                 :         ;
                              13087                 : 
 1784 rhodiumtoad             13088 EUB             : I_or_F_const:
 1784 rhodiumtoad             13089 UIC           0 :             Iconst                                  { $$ = makeIntConst($1,@1); }
                              13090               0 :             | FCONST                                { $$ = makeFloatConst($1,@1); }
                              13091                 :         ;
                              13092                 : 
                              13093                 : /* noise words */
 4982 tgl                     13094 GIC          16 : row_or_rows: ROW                                    { $$ = 0; }
                              13095              24 :             | ROWS                                  { $$ = 0; }
                              13096                 :         ;
                              13097                 : 
                              13098              40 : first_or_next: FIRST_P                              { $$ = 0; }
 4982 tgl                     13099 UIC           0 :             | NEXT                                  { $$ = 0; }
                              13100                 :         ;
                              13101                 : 
                              13102                 : 
 2885 andres                  13103 ECB             : /*
                              13104                 :  * This syntax for group_clause tries to follow the spec quite closely.
                              13105                 :  * However, the spec allows only column references, not expressions,
                              13106                 :  * which introduces an ambiguity between implicit row constructors
                              13107                 :  * (a,b) and lists of column references.
                              13108                 :  *
                              13109                 :  * We handle this by using the a_expr production for what the spec calls
                              13110                 :  * <ordinary grouping set>, which in the spec represents either one column
                              13111                 :  * reference or a parenthesized list of column references. Then, we check the
                              13112                 :  * top node of the a_expr to see if it's an implicit RowExpr, and if so, just
                              13113                 :  * grab and use the list, discarding the node. (this is done in parse analysis,
                              13114                 :  * not here)
                              13115                 :  *
                              13116                 :  * (we abuse the row_format field of RowExpr to distinguish implicit and
                              13117                 :  * explicit row constructors; it's debatable if anyone sanely wants to use them
                              13118                 :  * in a group clause, but if they have a reason to, we make it possible.)
                              13119                 :  *
                              13120                 :  * Each item in the group_clause list is either an expression tree or a
 2885 andres                  13121 EUB             :  * GroupingSet node of some type.
                              13122                 :  */
 7601 bruce                   13123                 : group_clause:
  752 tomas.vondra            13124                 :             GROUP_P BY set_quantifier group_by_list
                              13125                 :                 {
  752 tomas.vondra            13126 GBC        2553 :                     GroupClause *n = (GroupClause *) palloc(sizeof(GroupClause));
                              13127                 : 
  752 tomas.vondra            13128 GIC        2553 :                     n->distinct = $3 == SET_QUANTIFIER_DISTINCT;
                              13129            2553 :                     n->list = $4;
  752 tomas.vondra            13130 CBC        2553 :                     $$ = n;
                              13131                 :                 }
  752 tomas.vondra            13132 ECB             :             | /*EMPTY*/
                              13133                 :                 {
  752 tomas.vondra            13134 CBC      265911 :                     GroupClause *n = (GroupClause *) palloc(sizeof(GroupClause));
  331 peter                   13135 ECB             : 
  752 tomas.vondra            13136 GIC      265911 :                     n->distinct = false;
                              13137          265911 :                     n->list = NIL;
                              13138          265911 :                     $$ = n;
                              13139                 :                 }
                              13140                 :         ;
 9770 scrappy                 13141 ECB             : 
                              13142                 : group_by_list:
 2885 andres                  13143 GIC        2798 :             group_by_item                           { $$ = list_make1($1); }
 2885 andres                  13144 GBC        2361 :             | group_by_list ',' group_by_item       { $$ = lappend($1,$3); }
                              13145                 :         ;
                              13146                 : 
                              13147                 : group_by_item:
 2885 andres                  13148 CBC        4586 :             a_expr                                  { $$ = $1; }
 2885 andres                  13149 GIC         111 :             | empty_grouping_set                    { $$ = $1; }
                              13150              92 :             | cube_clause                           { $$ = $1; }
                              13151             125 :             | rollup_clause                         { $$ = $1; }
 2885 andres                  13152 CBC         245 :             | grouping_sets_clause                  { $$ = $1; }
                              13153                 :         ;
                              13154                 : 
                              13155                 : empty_grouping_set:
                              13156                 :             '(' ')'
 2885 andres                  13157 ECB             :                 {
 2885 andres                  13158 GIC         111 :                     $$ = (Node *) makeGroupingSet(GROUPING_SET_EMPTY, NIL, @1);
                              13159                 :                 }
                              13160                 :         ;
                              13161                 : 
                              13162                 : /*
                              13163                 :  * These hacks rely on setting precedence of CUBE and ROLLUP below that of '(',
                              13164                 :  * so that they shift in these rules rather than reducing the conflicting
                              13165                 :  * unreserved_keyword rule.
                              13166                 :  */
                              13167                 : 
                              13168                 : rollup_clause:
                              13169                 :             ROLLUP '(' expr_list ')'
                              13170                 :                 {
                              13171             125 :                     $$ = (Node *) makeGroupingSet(GROUPING_SET_ROLLUP, $3, @1);
                              13172                 :                 }
                              13173                 :         ;
                              13174                 : 
                              13175                 : cube_clause:
                              13176                 :             CUBE '(' expr_list ')'
 2885 andres                  13177 ECB             :                 {
 2885 andres                  13178 GIC          92 :                     $$ = (Node *) makeGroupingSet(GROUPING_SET_CUBE, $3, @1);
 2885 andres                  13179 EUB             :                 }
                              13180                 :         ;
                              13181                 : 
                              13182                 : grouping_sets_clause:
                              13183                 :             GROUPING SETS '(' group_by_list ')'
                              13184                 :                 {
 2885 andres                  13185 GBC         245 :                     $$ = (Node *) makeGroupingSet(GROUPING_SET_SETS, $4, @1);
 2885 andres                  13186 EUB             :                 }
                              13187                 :         ;
                              13188                 : 
                              13189                 : having_clause:
 7601 bruce                   13190 CBC         263 :             HAVING a_expr                           { $$ = $2; }
                              13191          268201 :             | /*EMPTY*/                             { $$ = NULL; }
                              13192                 :         ;
                              13193                 : 
 6555 tgl                     13194 ECB             : for_locking_clause:
 6188 tgl                     13195 GBC        2317 :             for_locking_items                       { $$ = $1; }
 6188 tgl                     13196 UIC           0 :             | FOR READ ONLY                         { $$ = NIL; }
                              13197                 :         ;
                              13198                 : 
                              13199                 : opt_for_locking_clause:
 6188 tgl                     13200 GIC         170 :             for_locking_clause                      { $$ = $1; }
                              13201           20428 :             | /* EMPTY */                           { $$ = NIL; }
                              13202                 :         ;
                              13203                 : 
                              13204                 : for_locking_items:
                              13205            2317 :             for_locking_item                        { $$ = list_make1($1); }
                              13206              49 :             | for_locking_items for_locking_item    { $$ = lappend($1, $2); }
                              13207                 :         ;
                              13208                 : 
                              13209                 : for_locking_item:
                              13210                 :             for_locking_strength locked_rels_list opt_nowait_or_skip
                              13211                 :                 {
 6460                         13212            2366 :                     LockingClause *n = makeNode(LockingClause);
                              13213                 : 
 3728 alvherre                13214            2366 :                     n->lockedRels = $2;
                              13215            2366 :                     n->strength = $1;
 3106                         13216            2366 :                     n->waitPolicy = $3;
 6460 tgl                     13217            2366 :                     $$ = (Node *) n;
                              13218                 :                 }
                              13219                 :         ;
                              13220                 : 
                              13221                 : for_locking_strength:
  879 peter                   13222 CBC         725 :             FOR UPDATE                          { $$ = LCS_FORUPDATE; }
  879 peter                   13223 GIC          33 :             | FOR NO KEY UPDATE                 { $$ = LCS_FORNOKEYUPDATE; }
  879 peter                   13224 CBC         107 :             | FOR SHARE                         { $$ = LCS_FORSHARE; }
                              13225            1501 :             | FOR KEY SHARE                     { $$ = LCS_FORKEYSHARE; }
 3728 alvherre                13226 ECB             :         ;
                              13227                 : 
                              13228                 : locked_rels_list:
 5333 tgl                     13229 GIC        1504 :             OF qualified_name_list                  { $$ = $2; }
 6460 tgl                     13230 CBC         862 :             | /* EMPTY */                           { $$ = NIL; }
                              13231                 :         ;
 9297 lockhart                13232 ECB             : 
 6094 mail                    13233                 : 
 2329 tgl                     13234                 : /*
                              13235                 :  * We should allow ROW '(' expr_list ')' too, but that seems to require
                              13236                 :  * making VALUES a fully reserved word, which will probably break more apps
                              13237                 :  * than allowing the noise-word is worth.
                              13238                 :  */
 6094 mail                    13239                 : values_clause:
 2329 tgl                     13240                 :             VALUES '(' expr_list ')'
                              13241                 :                 {
 6094 mail                    13242 GIC       39445 :                     SelectStmt *n = makeNode(SelectStmt);
                              13243                 : 
 2329 tgl                     13244 CBC       39445 :                     n->valuesLists = list_make1($3);
 6094 mail                    13245           39445 :                     $$ = (Node *) n;
 6094 mail                    13246 ECB             :                 }
 2329 tgl                     13247                 :             | values_clause ',' '(' expr_list ')'
 6094 mail                    13248                 :                 {
 6094 mail                    13249 GIC       82144 :                     SelectStmt *n = (SelectStmt *) $1;
                              13250                 : 
 2329 tgl                     13251           82144 :                     n->valuesLists = lappend(n->valuesLists, $4);
 6094 mail                    13252           82144 :                     $$ = (Node *) n;
                              13253                 :                 }
 6094 mail                    13254 ECB             :         ;
                              13255                 : 
                              13256                 : 
                              13257                 : /*****************************************************************************
                              13258                 :  *
                              13259                 :  *  clauses common to all Optimizable Stmts:
                              13260                 :  *      from_clause     - allow list of both JOIN expressions and table names
                              13261                 :  *      where_clause    - qualifications for joins or restrictions
                              13262                 :  *
                              13263                 :  *****************************************************************************/
                              13264                 : 
                              13265                 : from_clause:
 7601 bruce                   13266 GIC      189198 :             FROM from_list                          { $$ = $2; }
 7601 bruce                   13267 CBC       86897 :             | /*EMPTY*/                             { $$ = NIL; }
                              13268                 :         ;
                              13269                 : 
                              13270                 : from_list:
 6888 neilc                   13271 GIC      189532 :             table_ref                               { $$ = list_make1($1); }
 7600 bruce                   13272           61351 :             | from_list ',' table_ref               { $$ = lappend($1, $3); }
                              13273                 :         ;
 8811 lockhart                13274 ECB             : 
                              13275                 : /*
                              13276                 :  * table_ref is where an alias clause can be attached.
                              13277                 :  */
                              13278                 : table_ref:  relation_expr opt_alias_clause
                              13279                 :                 {
 7689 tgl                     13280 GIC      275848 :                     $1->alias = $2;
 8244 tgl                     13281 CBC      275848 :                     $$ = (Node *) $1;
                              13282                 :                 }
                              13283                 :             | relation_expr opt_alias_clause tablesample_clause
                              13284                 :                 {
 2815 tgl                     13285 GIC         121 :                     RangeTableSample *n = (RangeTableSample *) $3;
  331 peter                   13286 ECB             : 
 2815 tgl                     13287 CBC         121 :                     $1->alias = $2;
                              13288                 :                     /* relation_expr goes inside the RangeTableSample node */
 2815 tgl                     13289 GIC         121 :                     n->relation = (Node *) $1;
                              13290             121 :                     $$ = (Node *) n;
 2886 simon                   13291 ECB             :                 }
 3897 tgl                     13292 EUB             :             | func_table func_alias_clause
                              13293                 :                 {
 3426 tgl                     13294 GIC       28973 :                     RangeFunction *n = (RangeFunction *) $1;
                              13295                 : 
 3897 tgl                     13296 CBC       28973 :                     n->alias = linitial($2);
                              13297           28973 :                     n->coldeflist = lsecond($2);
 7553 bruce                   13298 GIC       28973 :                     $$ = (Node *) n;
                              13299                 :                 }
                              13300                 :             | LATERAL_P func_table func_alias_clause
 7553 bruce                   13301 ECB             :                 {
 3426 tgl                     13302 CBC         996 :                     RangeFunction *n = (RangeFunction *) $2;
                              13303                 : 
 3897 tgl                     13304 GIC         996 :                     n->lateral = true;
                              13305             996 :                     n->alias = linitial($3);
                              13306             996 :                     n->coldeflist = lsecond($3);
 7637                         13307             996 :                     $$ = (Node *) n;
 7637 tgl                     13308 ECB             :                 }
                              13309                 :             | xmltable opt_alias_clause
 2223 alvherre                13310                 :                 {
 2223 alvherre                13311 CBC          40 :                     RangeTableFunc *n = (RangeTableFunc *) $1;
  331 peter                   13312 ECB             : 
 2223 alvherre                13313 CBC          40 :                     n->alias = $2;
 2223 alvherre                13314 GIC          40 :                     $$ = (Node *) n;
                              13315                 :                 }
                              13316                 :             | LATERAL_P xmltable opt_alias_clause
                              13317                 :                 {
 2223 alvherre                13318 CBC          67 :                     RangeTableFunc *n = (RangeTableFunc *) $2;
  331 peter                   13319 ECB             : 
 2223 alvherre                13320 CBC          67 :                     n->lateral = true;
                              13321              67 :                     n->alias = $3;
 2223 alvherre                13322 GIC          67 :                     $$ = (Node *) n;
                              13323                 :                 }
                              13324                 :             | select_with_parens opt_alias_clause
 8114 tgl                     13325 ECB             :                 {
 3897 tgl                     13326 CBC       13646 :                     RangeSubselect *n = makeNode(RangeSubselect);
                              13327                 : 
 3897 tgl                     13328 GIC       13646 :                     n->lateral = false;
                              13329           13646 :                     n->subquery = $1;
                              13330           13646 :                     n->alias = $2;
                              13331           13646 :                     $$ = (Node *) n;
                              13332                 :                 }
                              13333                 :             | LATERAL_P select_with_parens opt_alias_clause
                              13334                 :                 {
 8244 tgl                     13335 CBC        1673 :                     RangeSubselect *n = makeNode(RangeSubselect);
  331 peter                   13336 ECB             : 
 3897 tgl                     13337 GIC        1673 :                     n->lateral = true;
                              13338            1673 :                     n->subquery = $2;
                              13339            1673 :                     n->alias = $3;
 8244                         13340            1673 :                     $$ = (Node *) n;
 8454 lockhart                13341 ECB             :                 }
 7601 bruce                   13342                 :             | joined_table
                              13343                 :                 {
 8244 tgl                     13344 GIC       69851 :                     $$ = (Node *) $1;
                              13345                 :                 }
 7601 bruce                   13346 ECB             :             | '(' joined_table ')' alias_clause
                              13347                 :                 {
 8244 tgl                     13348 CBC          87 :                     $2->alias = $4;
                              13349              87 :                     $$ = (Node *) $2;
 8811 lockhart                13350 ECB             :                 }
                              13351                 :         ;
                              13352                 : 
                              13353                 : 
 8244 tgl                     13354                 : /*
                              13355                 :  * It may seem silly to separate joined_table from table_ref, but there is
 3641 peter_e                 13356                 :  * method in SQL's madness: if you don't do it this way you get reduce-
 8244 tgl                     13357                 :  * reduce conflicts, because it's not clear to the parser generator whether
                              13358                 :  * to expect alias_clause after ')' or not.  For the same reason we must
                              13359                 :  * treat 'JOIN' and 'join_type JOIN' separately, rather than allowing
                              13360                 :  * join_type to expand to empty; if we try it, the parser generator can't
                              13361                 :  * figure out when to reduce an empty join_type right after table_ref.
                              13362                 :  *
 8811 lockhart                13363                 :  * Note that a CROSS JOIN is the same as an unqualified
                              13364                 :  * INNER JOIN, and an INNER JOIN/ON has the same shape
 8454                         13365                 :  * but a qualification expression to limit membership.
 8811                         13366                 :  * A NATURAL JOIN implicitly matches column names between
                              13367                 :  * tables and the shape is determined by which columns are
                              13368                 :  * in common. We'll collect columns during the later transformations.
                              13369                 :  */
 8244 tgl                     13370                 : 
                              13371                 : joined_table:
 7601 bruce                   13372                 :             '(' joined_table ')'
 8244 tgl                     13373                 :                 {
 8244 tgl                     13374 CBC        7279 :                     $$ = $2;
                              13375                 :                 }
                              13376                 :             | table_ref CROSS JOIN table_ref
                              13377                 :                 {
 8244 tgl                     13378 ECB             :                     /* CROSS JOIN is same as unqualified inner join */
  331 peter                   13379 GIC         140 :                     JoinExpr   *n = makeNode(JoinExpr);
  331 peter                   13380 ECB             : 
 8244 tgl                     13381 CBC         140 :                     n->jointype = JOIN_INNER;
 2062 peter_e                 13382             140 :                     n->isNatural = false;
 8244 tgl                     13383             140 :                     n->larg = $1;
 8244 tgl                     13384 GIC         140 :                     n->rarg = $4;
 5015 peter_e                 13385             140 :                     n->usingClause = NIL;
  739 peter                   13386             140 :                     n->join_using_alias = NULL;
 8244 tgl                     13387 CBC         140 :                     n->quals = NULL;
 8454 lockhart                13388 GIC         140 :                     $$ = n;
 8811 lockhart                13389 ECB             :                 }
 7601 bruce                   13390                 :             | table_ref join_type JOIN table_ref join_qual
 8811 lockhart                13391                 :                 {
  331 peter                   13392 CBC       36840 :                     JoinExpr   *n = makeNode(JoinExpr);
                              13393                 : 
 8244 tgl                     13394 GIC       36840 :                     n->jointype = $2;
 2062 peter_e                 13395           36840 :                     n->isNatural = false;
 8244 tgl                     13396 CBC       36840 :                     n->larg = $1;
 8244 tgl                     13397 GIC       36840 :                     n->rarg = $4;
                              13398           36840 :                     if ($5 != NULL && IsA($5, List))
                              13399                 :                     {
  739 peter                   13400 ECB             :                          /* USING clause */
  739 peter                   13401 CBC         243 :                         n->usingClause = linitial_node(List, castNode(List, $5));
  739 peter                   13402 GIC         243 :                         n->join_using_alias = lsecond_node(Alias, castNode(List, $5));
                              13403                 :                     }
                              13404                 :                     else
                              13405                 :                     {
                              13406                 :                         /* ON clause */
                              13407           36597 :                         n->quals = $5;
                              13408                 :                     }
 8454 lockhart                13409           36840 :                     $$ = n;
                              13410                 :                 }
                              13411                 :             | table_ref JOIN table_ref join_qual
                              13412                 :                 {
                              13413                 :                     /* letting join_type reduce to empty doesn't work */
  331 peter                   13414           32829 :                     JoinExpr   *n = makeNode(JoinExpr);
                              13415                 : 
 8244 tgl                     13416           32829 :                     n->jointype = JOIN_INNER;
 2062 peter_e                 13417           32829 :                     n->isNatural = false;
 8244 tgl                     13418           32829 :                     n->larg = $1;
                              13419           32829 :                     n->rarg = $3;
                              13420           32829 :                     if ($4 != NULL && IsA($4, List))
                              13421                 :                     {
                              13422                 :                         /* USING clause */
  739 peter                   13423             354 :                         n->usingClause = linitial_node(List, castNode(List, $4));
                              13424             354 :                         n->join_using_alias = lsecond_node(Alias, castNode(List, $4));
                              13425                 :                     }
 8244 tgl                     13426 ECB             :                     else
                              13427                 :                     {
                              13428                 :                         /* ON clause */
  739 peter                   13429 GIC       32475 :                         n->quals = $4;
                              13430                 :                     }
 8244 tgl                     13431 CBC       32829 :                     $$ = n;
                              13432                 :                 }
 7601 bruce                   13433 ECB             :             | table_ref NATURAL join_type JOIN table_ref
 8811 lockhart                13434                 :                 {
  331 peter                   13435 CBC          39 :                     JoinExpr   *n = makeNode(JoinExpr);
  331 peter                   13436 ECB             : 
 8244 tgl                     13437 CBC          39 :                     n->jointype = $3;
 2062 peter_e                 13438              39 :                     n->isNatural = true;
 8244 tgl                     13439              39 :                     n->larg = $1;
                              13440              39 :                     n->rarg = $5;
 5015 peter_e                 13441 GIC          39 :                     n->usingClause = NIL; /* figure out which columns later... */
  739 peter                   13442              39 :                     n->join_using_alias = NULL;
 8244 tgl                     13443              39 :                     n->quals = NULL; /* fill later */
 8244 tgl                     13444 CBC          39 :                     $$ = n;
                              13445                 :                 }
 7601 bruce                   13446 ECB             :             | table_ref NATURAL JOIN table_ref
 8811 lockhart                13447                 :                 {
 8244 tgl                     13448                 :                     /* letting join_type reduce to empty doesn't work */
  331 peter                   13449 CBC          90 :                     JoinExpr   *n = makeNode(JoinExpr);
  331 peter                   13450 ECB             : 
 8244 tgl                     13451 GIC          90 :                     n->jointype = JOIN_INNER;
 2062 peter_e                 13452              90 :                     n->isNatural = true;
 8244 tgl                     13453 CBC          90 :                     n->larg = $1;
                              13454              90 :                     n->rarg = $4;
 5015 peter_e                 13455 GIC          90 :                     n->usingClause = NIL; /* figure out which columns later... */
  739 peter                   13456              90 :                     n->join_using_alias = NULL;
 8244 tgl                     13457              90 :                     n->quals = NULL; /* fill later */
 8454 lockhart                13458              90 :                     $$ = n;
 8244 tgl                     13459 ECB             :                 }
                              13460                 :         ;
 8454 lockhart                13461                 : 
                              13462                 : alias_clause:
                              13463                 :             AS ColId '(' name_list ')'
                              13464                 :                 {
 7689 tgl                     13465 GIC        7308 :                     $$ = makeNode(Alias);
 7689 tgl                     13466 CBC        7308 :                     $$->aliasname = $2;
 7689 tgl                     13467 GIC        7308 :                     $$->colnames = $4;
 8244 tgl                     13468 ECB             :                 }
 7601 bruce                   13469                 :             | AS ColId
 8244 tgl                     13470                 :                 {
 7689 tgl                     13471 CBC       16630 :                     $$ = makeNode(Alias);
                              13472           16630 :                     $$->aliasname = $2;
                              13473                 :                 }
                              13474                 :             | ColId '(' name_list ')'
 8244 tgl                     13475 ECB             :                 {
 7689 tgl                     13476 CBC        3340 :                     $$ = makeNode(Alias);
 7689 tgl                     13477 GIC        3340 :                     $$->aliasname = $1;
                              13478            3340 :                     $$->colnames = $3;
                              13479                 :                 }
                              13480                 :             | ColId
 8244 tgl                     13481 ECB             :                 {
 7689 tgl                     13482 GIC      194377 :                     $$ = makeNode(Alias);
 7689 tgl                     13483 CBC      194377 :                     $$->aliasname = $1;
                              13484                 :                 }
                              13485                 :         ;
                              13486                 : 
 3897                         13487          200152 : opt_alias_clause: alias_clause                      { $$ = $1; }
 3897 tgl                     13488 GIC       91243 :             | /*EMPTY*/                             { $$ = NULL; }
 3897 tgl                     13489 ECB             :         ;
                              13490                 : 
  739 peter                   13491                 : /*
                              13492                 :  * The alias clause after JOIN ... USING only accepts the AS ColId spelling,
                              13493                 :  * per SQL standard.  (The grammar could parse the other variants, but they
                              13494                 :  * don't seem to be useful, and it might lead to parser problems in the
                              13495                 :  * future.)
                              13496                 :  */
                              13497                 : opt_alias_clause_for_join_using:
                              13498                 :             AS ColId
                              13499                 :                 {
  739 peter                   13500 GIC          42 :                     $$ = makeNode(Alias);
  739 peter                   13501 CBC          42 :                     $$->aliasname = $2;
                              13502                 :                     /* the column name list will be inserted later */
  739 peter                   13503 ECB             :                 }
  739 peter                   13504 CBC         555 :             | /*EMPTY*/                             { $$ = NULL; }
  739 peter                   13505 ECB             :         ;
                              13506                 : 
 3897 tgl                     13507                 : /*
                              13508                 :  * func_alias_clause can include both an Alias and a coldeflist, so we make it
                              13509                 :  * return a 2-element list that gets disassembled by calling production.
                              13510                 :  */
                              13511                 : func_alias_clause:
                              13512                 :             alias_clause
                              13513                 :                 {
 3897 tgl                     13514 GIC       21416 :                     $$ = list_make2($1, NIL);
                              13515                 :                 }
                              13516                 :             | AS '(' TableFuncElementList ')'
 3897 tgl                     13517 ECB             :                 {
 3897 tgl                     13518 CBC          52 :                     $$ = list_make2(NULL, $3);
 3897 tgl                     13519 ECB             :                 }
                              13520                 :             | AS ColId '(' TableFuncElementList ')'
                              13521                 :                 {
  331 peter                   13522 GIC         268 :                     Alias      *a = makeNode(Alias);
  331 peter                   13523 ECB             : 
 3897 tgl                     13524 CBC         268 :                     a->aliasname = $2;
 3897 tgl                     13525 GIC         268 :                     $$ = list_make2(a, $4);
                              13526                 :                 }
                              13527                 :             | ColId '(' TableFuncElementList ')'
 3897 tgl                     13528 ECB             :                 {
  331 peter                   13529 CBC          25 :                     Alias      *a = makeNode(Alias);
  331 peter                   13530 ECB             : 
 3897 tgl                     13531 GIC          25 :                     a->aliasname = $1;
                              13532              25 :                     $$ = list_make2(a, $3);
                              13533                 :                 }
 3897 tgl                     13534 ECB             :             | /*EMPTY*/
                              13535                 :                 {
 3897 tgl                     13536 GIC        8208 :                     $$ = list_make2(NULL, NIL);
                              13537                 :                 }
                              13538                 :         ;
 3897 tgl                     13539 ECB             : 
  878 peter                   13540 CBC         494 : join_type:  FULL opt_outer                          { $$ = JOIN_FULL; }
  878 peter                   13541 GIC       34207 :             | LEFT opt_outer                        { $$ = JOIN_LEFT; }
                              13542             169 :             | RIGHT opt_outer                       { $$ = JOIN_RIGHT; }
 7601 bruce                   13543            2009 :             | INNER_P                               { $$ = JOIN_INNER; }
                              13544                 :         ;
                              13545                 : 
                              13546                 : /* OUTER is just noise... */
                              13547                 : opt_outer: OUTER_P
                              13548                 :             | /*EMPTY*/
                              13549                 :         ;
                              13550                 : 
                              13551                 : /* JOIN qualification clauses
 8811 lockhart                13552 ECB             :  * Possibilities are:
  739 peter                   13553                 :  *  USING ( column list ) [ AS alias ]
                              13554                 :  *                        allows only unqualified column names,
                              13555                 :  *                        which must match between tables.
 7601 bruce                   13556                 :  *  ON expr allows more general qualifications.
                              13557                 :  *
                              13558                 :  * We return USING as a two-element List (the first item being a sub-List
                              13559                 :  * of the common column names, and the second either an Alias item or NULL).
                              13560                 :  * An ON-expr will not be a List, so it can be told apart that way.
                              13561                 :  */
                              13562                 : 
                              13563                 : join_qual: USING '(' name_list ')' opt_alias_clause_for_join_using
                              13564                 :                 {
  739 peter                   13565 GIC         597 :                     $$ = (Node *) list_make2($3, $5);
  739 peter                   13566 ECB             :                 }
                              13567                 :             | ON a_expr
                              13568                 :                 {
  739 peter                   13569 GIC       69072 :                     $$ = $2;
  739 peter                   13570 ECB             :                 }
                              13571                 :         ;
                              13572                 : 
                              13573                 : 
 7601 bruce                   13574                 : relation_expr:
                              13575                 :             qualified_name
 9344                         13576                 :                 {
 2298 rhaas                   13577                 :                     /* inheritance query, implicitly */
 7689 tgl                     13578 GIC      333464 :                     $$ = $1;
 2298                         13579          333464 :                     $$->inh = true;
 7689                         13580          333464 :                     $$->alias = NULL;
 9344 bruce                   13581 ECB             :                 }
                              13582                 :             | extended_relation_expr
  529 akapila                 13583                 :                 {
  529 akapila                 13584 CBC        3109 :                     $$ = $1;
                              13585                 :                 }
                              13586                 :         ;
                              13587                 : 
  529 akapila                 13588 ECB             : extended_relation_expr:
                              13589                 :             qualified_name '*'
                              13590                 :                 {
                              13591                 :                     /* inheritance query, explicitly */
 7689 tgl                     13592 CBC         102 :                     $$ = $1;
 2298                         13593             102 :                     $$->inh = true;
 7689                         13594             102 :                     $$->alias = NULL;
 9344 bruce                   13595 ECB             :                 }
                              13596                 :             | ONLY qualified_name
                              13597                 :                 {
                              13598                 :                     /* no inheritance */
 7689 tgl                     13599 GIC        3010 :                     $$ = $2;
 2298                         13600            3010 :                     $$->inh = false;
 7689                         13601            3010 :                     $$->alias = NULL;
                              13602                 :                 }
                              13603                 :             | ONLY '(' qualified_name ')'
                              13604                 :                 {
                              13605                 :                     /* no inheritance, SQL99-style syntax */
 7553 lockhart                13606 UIC           0 :                     $$ = $3;
 2298 tgl                     13607               0 :                     $$->inh = false;
 7553 lockhart                13608               0 :                     $$->alias = NULL;
                              13609                 :                 }
                              13610                 :         ;
                              13611                 : 
                              13612                 : 
                              13613                 : relation_expr_list:
 5200 peter_e                 13614 GIC        1178 :             relation_expr                           { $$ = list_make1($1); }
                              13615            4272 :             | relation_expr_list ',' relation_expr  { $$ = lappend($1, $3); }
                              13616                 :         ;
 5200 peter_e                 13617 ECB             : 
                              13618                 : 
                              13619                 : /*
                              13620                 :  * Given "UPDATE foo set set ...", we have to decide without looking any
 6286 tgl                     13621                 :  * further ahead whether the first "set" is an alias or the UPDATE's SET
                              13622                 :  * keyword.  Since "set" is allowed as a column name both interpretations
                              13623                 :  * are feasible.  We resolve the shift/reduce conflict by giving the first
                              13624                 :  * relation_expr_opt_alias production a higher precedence than the SET token
                              13625                 :  * has, causing the parser to prefer to reduce, in effect assuming that the
                              13626                 :  * SET is not an alias.
                              13627                 :  */
                              13628                 : relation_expr_opt_alias: relation_expr                  %prec UMINUS
                              13629                 :                 {
 6286 neilc                   13630 CBC        9625 :                     $$ = $1;
 6286 neilc                   13631 ECB             :                 }
      tgl                     13632                 :             | relation_expr ColId
                              13633                 :                 {
  331 peter                   13634 GIC         644 :                     Alias      *alias = makeNode(Alias);
                              13635                 : 
 6286 tgl                     13636 CBC         644 :                     alias->aliasname = $2;
 6286 tgl                     13637 GIC         644 :                     $1->alias = alias;
                              13638             644 :                     $$ = $1;
                              13639                 :                 }
                              13640                 :             | relation_expr AS ColId
                              13641                 :                 {
  331 peter                   13642              15 :                     Alias      *alias = makeNode(Alias);
                              13643                 : 
 6286 neilc                   13644 CBC          15 :                     alias->aliasname = $3;
                              13645              15 :                     $1->alias = alias;
                              13646              15 :                     $$ = $1;
                              13647                 :                 }
                              13648                 :         ;
                              13649                 : 
                              13650                 : /*
 2815 tgl                     13651 ECB             :  * TABLESAMPLE decoration in a FROM item
                              13652                 :  */
 2886 simon                   13653                 : tablesample_clause:
                              13654                 :             TABLESAMPLE func_name '(' expr_list ')' opt_repeatable_clause
                              13655                 :                 {
 2886 simon                   13656 GIC         121 :                     RangeTableSample *n = makeNode(RangeTableSample);
                              13657                 : 
 2815 tgl                     13658 EUB             :                     /* n->relation will be filled in later */
 2886 simon                   13659 GBC         121 :                     n->method = $2;
                              13660             121 :                     n->args = $4;
 2886 simon                   13661 GIC         121 :                     n->repeatable = $6;
 2815 tgl                     13662             121 :                     n->location = @2;
 2886 simon                   13663             121 :                     $$ = (Node *) n;
                              13664                 :                 }
                              13665                 :         ;
 2886 simon                   13666 ECB             : 
                              13667                 : opt_repeatable_clause:
 2886 simon                   13668 GIC          48 :             REPEATABLE '(' a_expr ')'   { $$ = (Node *) $3; }
                              13669              73 :             | /*EMPTY*/                 { $$ = NULL; }
                              13670                 :         ;
                              13671                 : 
                              13672                 : /*
                              13673                 :  * func_table represents a function invocation in a FROM list. It can be
                              13674                 :  * a plain function call, like "foo(...)", or a ROWS FROM expression with
                              13675                 :  * one or more function calls, "ROWS FROM (foo(...), bar(...))",
                              13676                 :  * optionally with WITH ORDINALITY attached.
                              13677                 :  * In the ROWS FROM syntax, a column definition list can be given for each
                              13678                 :  * function, for example:
                              13679                 :  *     ROWS FROM (foo() AS (foo_res_a text, foo_res_b text),
                              13680                 :  *                bar() AS (bar_res_a text, bar_res_b text))
                              13681                 :  * It's also possible to attach a column definition list to the RangeFunction
 3426 tgl                     13682 ECB             :  * as a whole, but that's handled by the table_ref production.
                              13683                 :  */
                              13684                 : func_table: func_expr_windowless opt_ordinality
                              13685                 :                 {
 3426 tgl                     13686 CBC       29906 :                     RangeFunction *n = makeNode(RangeFunction);
                              13687                 : 
                              13688           29906 :                     n->lateral = false;
                              13689           29906 :                     n->ordinality = $2;
 3407 noah                    13690           29906 :                     n->is_rowsfrom = false;
 3426 tgl                     13691 GIC       29906 :                     n->functions = list_make1(list_make2($1, NIL));
                              13692                 :                     /* alias and coldeflist are set by table_ref production */
                              13693           29906 :                     $$ = (Node *) n;
 3426 tgl                     13694 ECB             :                 }
                              13695                 :             | ROWS FROM '(' rowsfrom_list ')' opt_ordinality
                              13696                 :                 {
 3426 tgl                     13697 CBC          66 :                     RangeFunction *n = makeNode(RangeFunction);
  331 peter                   13698 ECB             : 
 3426 tgl                     13699 GIC          66 :                     n->lateral = false;
 3407 noah                    13700              66 :                     n->ordinality = $6;
                              13701              66 :                     n->is_rowsfrom = true;
                              13702              66 :                     n->functions = $4;
                              13703                 :                     /* alias and coldeflist are set by table_ref production */
 3426 tgl                     13704              66 :                     $$ = (Node *) n;
                              13705                 :                 }
                              13706                 :         ;
                              13707                 : 
 3407 noah                    13708 ECB             : rowsfrom_item: func_expr_windowless opt_col_def_list
 3426 tgl                     13709 GIC         159 :                 { $$ = list_make2($1, $2); }
                              13710                 :         ;
 3426 tgl                     13711 ECB             : 
 3407 noah                    13712                 : rowsfrom_list:
 3407 noah                    13713 CBC          66 :             rowsfrom_item                       { $$ = list_make1($1); }
                              13714              93 :             | rowsfrom_list ',' rowsfrom_item   { $$ = lappend($1, $3); }
 3426 tgl                     13715 ECB             :         ;
                              13716                 : 
 3426 tgl                     13717 GIC          27 : opt_col_def_list: AS '(' TableFuncElementList ')'   { $$ = $3; }
                              13718             132 :             | /*EMPTY*/                             { $$ = NIL; }
                              13719                 :         ;
 3426 tgl                     13720 ECB             : 
 2966 tgl                     13721 CBC         308 : opt_ordinality: WITH_LA ORDINALITY                  { $$ = true; }
 3426 tgl                     13722 GIC       29664 :             | /*EMPTY*/                             { $$ = false; }
                              13723                 :         ;
                              13724                 : 
                              13725                 : 
                              13726                 : where_clause:
 7601 bruce                   13727          121785 :             WHERE a_expr                            { $$ = $2; }
 7600                         13728          156058 :             | /*EMPTY*/                             { $$ = NULL; }
                              13729                 :         ;
                              13730                 : 
                              13731                 : /* variant for UPDATE and DELETE */
                              13732                 : where_or_current_clause:
 5781 tgl                     13733            7298 :             WHERE a_expr                            { $$ = $2; }
                              13734                 :             | WHERE CURRENT_P OF cursor_name
                              13735                 :                 {
                              13736             127 :                     CurrentOfExpr *n = makeNode(CurrentOfExpr);
                              13737                 : 
 5781 tgl                     13738 ECB             :                     /* cvarno is filled in by parse analysis */
 5781 tgl                     13739 GIC         127 :                     n->cursor_name = $4;
 5781 tgl                     13740 CBC         127 :                     n->cursor_param = 0;
                              13741             127 :                     $$ = (Node *) n;
 5781 tgl                     13742 ECB             :                 }
 5781 tgl                     13743 CBC        2310 :             | /*EMPTY*/                             { $$ = NULL; }
                              13744                 :         ;
 5781 tgl                     13745 ECB             : 
                              13746                 : 
                              13747                 : OptTableFuncElementList:
 4578 peter_e                 13748 GIC         312 :             TableFuncElementList                { $$ = $1; }
 4578 peter_e                 13749 CBC           3 :             | /*EMPTY*/                         { $$ = NIL; }
                              13750                 :         ;
 4578 peter_e                 13751 ECB             : 
 7552 tgl                     13752                 : TableFuncElementList:
 7528                         13753                 :             TableFuncElement
 7553 bruce                   13754                 :                 {
 6888 neilc                   13755 GIC         684 :                     $$ = list_make1($1);
 7553 bruce                   13756 ECB             :                 }
                              13757                 :             | TableFuncElementList ',' TableFuncElement
                              13758                 :                 {
 7528 tgl                     13759 GIC         902 :                     $$ = lappend($1, $3);
                              13760                 :                 }
 7553 bruce                   13761 ECB             :         ;
                              13762                 : 
                              13763                 : TableFuncElement:   ColId Typename opt_collate_clause
                              13764                 :                 {
 7553 bruce                   13765 CBC        1618 :                     ColumnDef *n = makeNode(ColumnDef);
  331 peter                   13766 ECB             : 
 7553 bruce                   13767 GIC        1618 :                     n->colname = $1;
 5015 peter_e                 13768            1618 :                     n->typeName = $2;
 4414 tgl                     13769 CBC        1618 :                     n->inhcount = 0;
 7504                         13770            1618 :                     n->is_local = true;
 4414 tgl                     13771 GIC        1618 :                     n->is_not_null = false;
                              13772            1618 :                     n->is_from_type = false;
 4414 tgl                     13773 CBC        1618 :                     n->storage = 0;
                              13774            1618 :                     n->raw_default = NULL;
 4414 tgl                     13775 GIC        1618 :                     n->cooked_default = NULL;
                              13776            1618 :                     n->collClause = (CollateClause *) $3;
                              13777            1618 :                     n->collOid = InvalidOid;
                              13778            1618 :                     n->constraints = NIL;
 3426 tgl                     13779 CBC        1618 :                     n->location = @1;
  331 peter                   13780            1618 :                     $$ = (Node *) n;
                              13781                 :                 }
                              13782                 :         ;
                              13783                 : 
                              13784                 : /*
 2223 alvherre                13785 ECB             :  * XMLTABLE
                              13786                 :  */
                              13787                 : xmltable:
                              13788                 :             XMLTABLE '(' c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
                              13789                 :                 {
 2223 alvherre                13790 GIC          97 :                     RangeTableFunc *n = makeNode(RangeTableFunc);
  331 peter                   13791 ECB             : 
 2223 alvherre                13792 CBC          97 :                     n->rowexpr = $3;
                              13793              97 :                     n->docexpr = $4;
 2223 alvherre                13794 GIC          97 :                     n->columns = $6;
 2223 alvherre                13795 CBC          97 :                     n->namespaces = NIL;
 2223 alvherre                13796 GIC          97 :                     n->location = @1;
  331 peter                   13797              97 :                     $$ = (Node *) n;
                              13798                 :                 }
                              13799                 :             | XMLTABLE '(' XMLNAMESPACES '(' xml_namespace_list ')' ','
 2223 alvherre                13800 ECB             :                 c_expr xmlexists_argument COLUMNS xmltable_column_list ')'
                              13801                 :                 {
 2223 alvherre                13802 GIC          10 :                     RangeTableFunc *n = makeNode(RangeTableFunc);
                              13803                 : 
                              13804              10 :                     n->rowexpr = $8;
                              13805              10 :                     n->docexpr = $9;
                              13806              10 :                     n->columns = $11;
 2223 alvherre                13807 CBC          10 :                     n->namespaces = $5;
 2223 alvherre                13808 GIC          10 :                     n->location = @1;
  331 peter                   13809              10 :                     $$ = (Node *) n;
                              13810                 :                 }
 2223 alvherre                13811 ECB             :         ;
                              13812                 : 
 2223 alvherre                13813 GIC         107 : xmltable_column_list: xmltable_column_el                    { $$ = list_make1($1); }
                              13814             262 :             | xmltable_column_list ',' xmltable_column_el   { $$ = lappend($1, $3); }
                              13815                 :         ;
                              13816                 : 
 2223 alvherre                13817 ECB             : xmltable_column_el:
                              13818                 :             ColId Typename
                              13819                 :                 {
  331 peter                   13820 CBC          93 :                     RangeTableFuncCol *fc = makeNode(RangeTableFuncCol);
 2223 alvherre                13821 ECB             : 
 2223 alvherre                13822 CBC          93 :                     fc->colname = $1;
                              13823              93 :                     fc->for_ordinality = false;
                              13824              93 :                     fc->typeName = $2;
                              13825              93 :                     fc->is_not_null = false;
                              13826              93 :                     fc->colexpr = NULL;
                              13827              93 :                     fc->coldefexpr = NULL;
                              13828              93 :                     fc->location = @1;
 2223 alvherre                13829 ECB             : 
 2223 alvherre                13830 CBC          93 :                     $$ = (Node *) fc;
 2223 alvherre                13831 ECB             :                 }
                              13832                 :             | ColId Typename xmltable_column_option_list
                              13833                 :                 {
  331 peter                   13834 GIC         245 :                     RangeTableFuncCol *fc = makeNode(RangeTableFuncCol);
                              13835                 :                     ListCell   *option;
                              13836             245 :                     bool        nullability_seen = false;
                              13837                 : 
 2223 alvherre                13838             245 :                     fc->colname = $1;
                              13839             245 :                     fc->typeName = $2;
                              13840             245 :                     fc->for_ordinality = false;
                              13841             245 :                     fc->is_not_null = false;
 2223 alvherre                13842 CBC         245 :                     fc->colexpr = NULL;
 2223 alvherre                13843 GIC         245 :                     fc->coldefexpr = NULL;
 2223 alvherre                13844 CBC         245 :                     fc->location = @1;
 2223 alvherre                13845 ECB             : 
 2223 alvherre                13846 CBC         546 :                     foreach(option, $3)
 2223 alvherre                13847 ECB             :                     {
 2223 alvherre                13848 CBC         301 :                         DefElem   *defel = (DefElem *) lfirst(option);
 2223 alvherre                13849 ECB             : 
 2223 alvherre                13850 GIC         301 :                         if (strcmp(defel->defname, "default") == 0)
                              13851                 :                         {
                              13852              28 :                             if (fc->coldefexpr != NULL)
 2223 alvherre                13853 UIC           0 :                                 ereport(ERROR,
 2223 alvherre                13854 ECB             :                                         (errcode(ERRCODE_SYNTAX_ERROR),
                              13855                 :                                          errmsg("only one DEFAULT value is allowed"),
                              13856                 :                                          parser_errposition(defel->location)));
 2223 alvherre                13857 CBC          28 :                             fc->coldefexpr = defel->arg;
 2223 alvherre                13858 ECB             :                         }
 2223 alvherre                13859 CBC         273 :                         else if (strcmp(defel->defname, "path") == 0)
 2223 alvherre                13860 ECB             :                         {
 2223 alvherre                13861 CBC         245 :                             if (fc->colexpr != NULL)
 2223 alvherre                13862 UIC           0 :                                 ereport(ERROR,
                              13863                 :                                         (errcode(ERRCODE_SYNTAX_ERROR),
                              13864                 :                                          errmsg("only one PATH value per column is allowed"),
 2223 alvherre                13865 ECB             :                                          parser_errposition(defel->location)));
 2223 alvherre                13866 CBC         245 :                             fc->colexpr = defel->arg;
                              13867                 :                         }
 2223 alvherre                13868 GIC          28 :                         else if (strcmp(defel->defname, "is_not_null") == 0)
                              13869                 :                         {
                              13870              28 :                             if (nullability_seen)
 2223 alvherre                13871 UIC           0 :                                 ereport(ERROR,
 2223 alvherre                13872 ECB             :                                         (errcode(ERRCODE_SYNTAX_ERROR),
                              13873                 :                                          errmsg("conflicting or redundant NULL / NOT NULL declarations for column \"%s\"", fc->colname),
                              13874                 :                                          parser_errposition(defel->location)));
  450 peter                   13875 CBC          28 :                             fc->is_not_null = boolVal(defel->arg);
 2223 alvherre                13876              28 :                             nullability_seen = true;
 2223 alvherre                13877 ECB             :                         }
                              13878                 :                         else
                              13879                 :                         {
 2223 alvherre                13880 LBC           0 :                             ereport(ERROR,
                              13881                 :                                     (errcode(ERRCODE_SYNTAX_ERROR),
 2223 alvherre                13882 ECB             :                                      errmsg("unrecognized column option \"%s\"",
                              13883                 :                                             defel->defname),
                              13884                 :                                      parser_errposition(defel->location)));
                              13885                 :                         }
                              13886                 :                     }
 2223 alvherre                13887 GIC         245 :                     $$ = (Node *) fc;
 2223 alvherre                13888 ECB             :                 }
                              13889                 :             | ColId FOR ORDINALITY
                              13890                 :                 {
  331 peter                   13891 CBC          31 :                     RangeTableFuncCol *fc = makeNode(RangeTableFuncCol);
 2223 alvherre                13892 ECB             : 
 2223 alvherre                13893 CBC          31 :                     fc->colname = $1;
                              13894              31 :                     fc->for_ordinality = true;
 2223 alvherre                13895 ECB             :                     /* other fields are ignored, initialized by makeNode */
 2223 alvherre                13896 CBC          31 :                     fc->location = @1;
                              13897                 : 
                              13898              31 :                     $$ = (Node *) fc;
                              13899                 :                 }
 2223 alvherre                13900 ECB             :         ;
                              13901                 : 
                              13902                 : xmltable_column_option_list:
                              13903                 :             xmltable_column_option_el
 2223 alvherre                13904 CBC         245 :                 { $$ = list_make1($1); }
 2223 alvherre                13905 EUB             :             | xmltable_column_option_list xmltable_column_option_el
 2223 alvherre                13906 GIC          56 :                 { $$ = lappend($1, $2); }
                              13907                 :         ;
                              13908                 : 
 2223 alvherre                13909 ECB             : xmltable_column_option_el:
                              13910                 :             IDENT b_expr
 2223 alvherre                13911 CBC         245 :                 { $$ = makeDefElem($1, $2, @1); }
                              13912                 :             | DEFAULT b_expr
                              13913              28 :                 { $$ = makeDefElem("default", $2, @1); }
 2223 alvherre                13914 EUB             :             | NOT NULL_P
  450 peter                   13915 GIC          28 :                 { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(true), @1); }
                              13916                 :             | NULL_P
  450 peter                   13917 UIC           0 :                 { $$ = makeDefElem("is_not_null", (Node *) makeBoolean(false), @1); }
 2223 alvherre                13918 ECB             :         ;
                              13919                 : 
                              13920                 : xml_namespace_list:
                              13921                 :             xml_namespace_el
 2223 alvherre                13922 CBC          10 :                 { $$ = list_make1($1); }
 2223 alvherre                13923 EUB             :             | xml_namespace_list ',' xml_namespace_el
 2223 alvherre                13924 UIC           0 :                 { $$ = lappend($1, $3); }
                              13925                 :         ;
                              13926                 : 
 2223 alvherre                13927 ECB             : xml_namespace_el:
                              13928                 :             b_expr AS ColLabel
                              13929                 :                 {
 2223 alvherre                13930 GIC           7 :                     $$ = makeNode(ResTarget);
                              13931               7 :                     $$->name = $3;
 2223 alvherre                13932 GBC           7 :                     $$->indirection = NIL;
 2223 alvherre                13933 GIC           7 :                     $$->val = $1;
                              13934               7 :                     $$->location = @1;
                              13935                 :                 }
                              13936                 :             | DEFAULT b_expr
                              13937                 :                 {
                              13938               3 :                     $$ = makeNode(ResTarget);
 2223 alvherre                13939 CBC           3 :                     $$->name = NULL;
 2223 alvherre                13940 GIC           3 :                     $$->indirection = NIL;
                              13941               3 :                     $$->val = $2;
                              13942               3 :                     $$->location = @1;
 2223 alvherre                13943 ECB             :                 }
                              13944                 :         ;
                              13945                 : 
 9297 lockhart                13946                 : /*****************************************************************************
                              13947                 :  *
                              13948                 :  *  Type syntax
                              13949                 :  *      SQL introduces a large amount of type-specific syntax.
                              13950                 :  *      Define individual clauses to handle these cases, and use
                              13951                 :  *       the generic case to handle regular type-extensible Postgres syntax.
                              13952                 :  *      - thomas 1997-10-10
                              13953                 :  *
                              13954                 :  *****************************************************************************/
                              13955                 : 
 7601 bruce                   13956                 : Typename:   SimpleTypename opt_array_bounds
                              13957                 :                 {
 9297 lockhart                13958 CBC      529583 :                     $$ = $1;
 9297 lockhart                13959 GIC      529583 :                     $$->arrayBounds = $2;
                              13960                 :                 }
                              13961                 :             | SETOF SimpleTypename opt_array_bounds
                              13962                 :                 {
 9297 lockhart                13963 CBC        3563 :                     $$ = $2;
 7368 tgl                     13964 GIC        3563 :                     $$->arrayBounds = $3;
 2062 peter_e                 13965 CBC        3563 :                     $$->setof = true;
                              13966                 :                 }
 5275 peter_e                 13967 ECB             :             /* SQL standard syntax, currently only one-dimensional */
                              13968                 :             | SimpleTypename ARRAY '[' Iconst ']'
 7306 tgl                     13969 EUB             :                 {
 7306 tgl                     13970 GIC           3 :                     $$ = $1;
 6888 neilc                   13971               3 :                     $$->arrayBounds = list_make1(makeInteger($4));
                              13972                 :                 }
                              13973                 :             | SETOF SimpleTypename ARRAY '[' Iconst ']'
 7306 tgl                     13974 ECB             :                 {
 7306 tgl                     13975 UIC           0 :                     $$ = $2;
 6888 neilc                   13976 UBC           0 :                     $$->arrayBounds = list_make1(makeInteger($5));
 2062 peter_e                 13977 UIC           0 :                     $$->setof = true;
                              13978                 :                 }
                              13979                 :             | SimpleTypename ARRAY
                              13980                 :                 {
 5275                         13981               0 :                     $$ = $1;
 5275 peter_e                 13982 LBC           0 :                     $$->arrayBounds = list_make1(makeInteger(-1));
 5275 peter_e                 13983 ECB             :                 }
                              13984                 :             | SETOF SimpleTypename ARRAY
                              13985                 :                 {
 5275 peter_e                 13986 LBC           0 :                     $$ = $2;
 5275 peter_e                 13987 UIC           0 :                     $$->arrayBounds = list_make1(makeInteger(-1));
 2062                         13988               0 :                     $$->setof = true;
                              13989                 :                 }
 9344 bruce                   13990 ECB             :         ;
                              13991                 : 
 7601                         13992                 : opt_array_bounds:
                              13993                 :             opt_array_bounds '[' ']'
 7601 bruce                   13994 CBC        9712 :                     {  $$ = lappend($1, makeInteger(-1)); }
                              13995                 :             | opt_array_bounds '[' Iconst ']'
 7601 bruce                   13996 GIC          26 :                     {  $$ = lappend($1, makeInteger($3)); }
                              13997                 :             | /*EMPTY*/
                              13998          533146 :                     {  $$ = NIL; }
                              13999                 :         ;
                              14000                 : 
                              14001                 : SimpleTypename:
 7553 lockhart                14002          452361 :             GenericType                             { $$ = $1; }
                              14003           60745 :             | Numeric                               { $$ = $1; }
                              14004            1187 :             | Bit                                   { $$ = $1; }
                              14005            1826 :             | Character                             { $$ = $1; }
                              14006           10306 :             | ConstDatetime                         { $$ = $1; }
                              14007                 :             | ConstInterval opt_interval
                              14008                 :                 {
 7843                         14009            6909 :                     $$ = $1;
 5323 tgl                     14010 CBC        6909 :                     $$->typmods = $2;
 7843 lockhart                14011 ECB             :                 }
                              14012                 :             | ConstInterval '(' Iconst ')'
                              14013                 :                 {
 7843 lockhart                14014 UIC           0 :                     $$ = $1;
 3095 bruce                   14015 LBC           0 :                     $$->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
 3095 bruce                   14016 ECB             :                                              makeIntConst($3, @3));
 7681 tgl                     14017                 :                 }
                              14018                 :         ;
                              14019                 : 
                              14020                 : /* We have a separate ConstTypename to allow defaulting fixed-length
                              14021                 :  * types such as CHAR() and BIT() to an unspecified length.
 7553 lockhart                14022                 :  * SQL9x requires that these default to a length of one, but this
                              14023                 :  * makes no sense for constructs like CHAR 'hi' and BIT '0101',
                              14024                 :  * where there is an obvious better choice to make.
                              14025                 :  * Note that ConstInterval is not included here since it must
                              14026                 :  * be pushed up higher in the rules to accommodate the postfix
 5944 tgl                     14027 EUB             :  * options (e.g. INTERVAL '1' YEAR). Likewise, we have to handle
 1378 michael                 14028                 :  * the generic-type-name case in AexprConst to avoid premature
 5944 tgl                     14029                 :  * reduce/reduce conflicts against function names.
                              14030                 :  */
                              14031                 : ConstTypename:
 5944 tgl                     14032 GIC          39 :             Numeric                                 { $$ = $1; }
 7553 lockhart                14033 UBC           0 :             | ConstBit                              { $$ = $1; }
 7553 lockhart                14034 GBC          16 :             | ConstCharacter                        { $$ = $1; }
 7553 lockhart                14035 GIC        1084 :             | ConstDatetime                         { $$ = $1; }
                              14036                 :         ;
                              14037                 : 
 5944 tgl                     14038 EUB             : /*
                              14039                 :  * GenericType covers all type names that don't have special syntax mandated
                              14040                 :  * by the standard, including qualified names.  We also allow type modifiers.
                              14041                 :  * To avoid parsing conflicts against function invocations, the modifiers
                              14042                 :  * have to be shown as expr_list here, but parse analysis will only accept
                              14043                 :  * constants for them.
                              14044                 :  */
                              14045                 : GenericType:
 5944 tgl                     14046 ECB             :             type_function_name opt_type_modifiers
                              14047                 :                 {
 7646 tgl                     14048 CBC      420883 :                     $$ = makeTypeName($1);
 5944 tgl                     14049 GIC      420883 :                     $$->typmods = $2;
 5944 tgl                     14050 CBC      420883 :                     $$->location = @1;
                              14051                 :                 }
                              14052                 :             | type_function_name attrs opt_type_modifiers
                              14053                 :                 {
                              14054           31478 :                     $$ = makeTypeNameFromNameList(lcons(makeString($1), $2));
                              14055           31478 :                     $$->typmods = $3;
 6235                         14056           31478 :                     $$->location = @1;
 9297 lockhart                14057 ECB             :                 }
                              14058                 :         ;
                              14059                 : 
 5944 tgl                     14060 GIC         661 : opt_type_modifiers: '(' expr_list ')'               { $$ = $2; }
 5944 tgl                     14061 CBC      456875 :                     | /* EMPTY */                   { $$ = NIL; }
 5944 tgl                     14062 ECB             :         ;
                              14063                 : 
                              14064                 : /*
                              14065                 :  * SQL numeric data types
 9297 lockhart                14066 EUB             :  */
 7269 bruce                   14067                 : Numeric:    INT_P
                              14068                 :                 {
 7646 tgl                     14069 GIC       17527 :                     $$ = SystemTypeName("int4");
 5944                         14070           17527 :                     $$->location = @1;
                              14071                 :                 }
                              14072                 :             | INTEGER
                              14073                 :                 {
 7646                         14074           11181 :                     $$ = SystemTypeName("int4");
 5944                         14075           11181 :                     $$->location = @1;
                              14076                 :                 }
                              14077                 :             | SMALLINT
                              14078                 :                 {
 7646                         14079             812 :                     $$ = SystemTypeName("int2");
 5944                         14080             812 :                     $$->location = @1;
                              14081                 :                 }
                              14082                 :             | BIGINT
                              14083                 :                 {
 7646 tgl                     14084 CBC        6690 :                     $$ = SystemTypeName("int8");
 5944 tgl                     14085 GBC        6690 :                     $$->location = @1;
 7646 tgl                     14086 ECB             :                 }
 7601 bruce                   14087                 :             | REAL
                              14088                 :                 {
 7646 tgl                     14089 GIC          59 :                     $$ = SystemTypeName("float4");
 5944                         14090              59 :                     $$->location = @1;
                              14091                 :                 }
                              14092                 :             | FLOAT_P opt_float
                              14093                 :                 {
 7646                         14094             221 :                     $$ = $2;
 5944                         14095             221 :                     $$->location = @1;
                              14096                 :                 }
                              14097                 :             | DOUBLE_P PRECISION
                              14098                 :                 {
 7646                         14099             768 :                     $$ = SystemTypeName("float8");
 5944 tgl                     14100 CBC         768 :                     $$->location = @1;
 9188 lockhart                14101 ECB             :                 }
 5944 tgl                     14102                 :             | DECIMAL_P opt_type_modifiers
                              14103                 :                 {
 7646 tgl                     14104 GIC          16 :                     $$ = SystemTypeName("numeric");
 5944                         14105              16 :                     $$->typmods = $2;
 5944 tgl                     14106 CBC          16 :                     $$->location = @1;
 8454 lockhart                14107 ECB             :                 }
 5944 tgl                     14108                 :             | DEC opt_type_modifiers
                              14109                 :                 {
 7646 tgl                     14110 UIC           0 :                     $$ = SystemTypeName("numeric");
 5944                         14111               0 :                     $$->typmods = $2;
 5944 tgl                     14112 LBC           0 :                     $$->location = @1;
 9297 lockhart                14113 ECB             :                 }
                              14114                 :             | NUMERIC opt_type_modifiers
                              14115                 :                 {
 7646 tgl                     14116 GIC        5159 :                     $$ = SystemTypeName("numeric");
 5944                         14117            5159 :                     $$->typmods = $2;
                              14118            5159 :                     $$->location = @1;
                              14119                 :                 }
                              14120                 :             | BOOLEAN_P
 7646 tgl                     14121 ECB             :                 {
 7646 tgl                     14122 CBC       18351 :                     $$ = SystemTypeName("bool");
 5944 tgl                     14123 GIC       18351 :                     $$->location = @1;
                              14124                 :                 }
                              14125                 :         ;
 9344 bruce                   14126 ECB             : 
 7601                         14127                 : opt_float:  '(' Iconst ')'
                              14128                 :                 {
                              14129                 :                     /*
                              14130                 :                      * Check FLOAT() precision limits assuming IEEE floating
 5944 tgl                     14131                 :                      * types - thomas 1997-09-18
                              14132                 :                      */
 9297 lockhart                14133 GIC           1 :                     if ($2 < 1)
 7204 tgl                     14134 UIC           0 :                         ereport(ERROR,
                              14135                 :                                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
 5333 tgl                     14136 ECB             :                                  errmsg("precision for type float must be at least 1 bit"),
 5018                         14137                 :                                  parser_errposition(@2)));
 7236 tgl                     14138 GIC           1 :                     else if ($2 <= 24)
 7646                         14139               1 :                         $$ = SystemTypeName("float4");
 7236 tgl                     14140 UIC           0 :                     else if ($2 <= 53)
 7646 tgl                     14141 LBC           0 :                         $$ = SystemTypeName("float8");
 9297 lockhart                14142 ECB             :                     else
 7204 tgl                     14143 UIC           0 :                         ereport(ERROR,
                              14144                 :                                 (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                              14145                 :                                  errmsg("precision for type float must be less than 54 bits"),
 5018 tgl                     14146 ECB             :                                  parser_errposition(@2)));
 9297 lockhart                14147                 :                 }
                              14148                 :             | /*EMPTY*/
                              14149                 :                 {
 7646 tgl                     14150 GIC         220 :                     $$ = SystemTypeName("float8");
 9297 lockhart                14151 ECB             :                 }
                              14152                 :         ;
                              14153                 : 
                              14154                 : /*
                              14155                 :  * SQL bit-field data types
 8419                         14156                 :  * The following implements BIT() and BIT VARYING().
                              14157                 :  */
 7553                         14158                 : Bit:        BitWithLength
                              14159                 :                 {
 7553 lockhart                14160 GIC         837 :                     $$ = $1;
                              14161                 :                 }
 7553 lockhart                14162 EUB             :             | BitWithoutLength
                              14163                 :                 {
 7553 lockhart                14164 GBC         350 :                     $$ = $1;
                              14165                 :                 }
                              14166                 :         ;
                              14167                 : 
 7368 tgl                     14168 ECB             : /* ConstBit is like Bit except "BIT" defaults to unspecified length */
                              14169                 : /* See notes for ConstCharacter, which addresses same issue for "CHAR" */
 7553 lockhart                14170                 : ConstBit:   BitWithLength
                              14171                 :                 {
 7553 lockhart                14172 UIC           0 :                     $$ = $1;
                              14173                 :                 }
 7553 lockhart                14174 ECB             :             | BitWithoutLength
                              14175                 :                 {
 7553 lockhart                14176 UIC           0 :                     $$ = $1;
 5944 tgl                     14177               0 :                     $$->typmods = NIL;
                              14178                 :                 }
                              14179                 :         ;
                              14180                 : 
                              14181                 : BitWithLength:
                              14182                 :             BIT opt_varying '(' expr_list ')'
                              14183                 :                 {
                              14184                 :                     char *typname;
 7646 tgl                     14185 ECB             : 
 7646 tgl                     14186 GBC         837 :                     typname = $2 ? "varbit" : "bit";
 7646 tgl                     14187 GIC         837 :                     $$ = SystemTypeName(typname);
 5944                         14188             837 :                     $$->typmods = $4;
                              14189             837 :                     $$->location = @1;
 8419 lockhart                14190 ECB             :                 }
 7553                         14191                 :         ;
 7553 lockhart                14192 EUB             : 
                              14193                 : BitWithoutLength:
                              14194                 :             BIT opt_varying
 8419                         14195                 :                 {
                              14196                 :                     /* bit defaults to bit(1), varbit to no limit */
 7646 tgl                     14197 GIC         350 :                     if ($2)
                              14198                 :                     {
                              14199               9 :                         $$ = SystemTypeName("varbit");
                              14200                 :                     }
                              14201                 :                     else
 7646 tgl                     14202 ECB             :                     {
 7646 tgl                     14203 GIC         341 :                         $$ = SystemTypeName("bit");
 5337                         14204             341 :                         $$->typmods = list_make1(makeIntConst(1, -1));
                              14205                 :                     }
 5944                         14206             350 :                     $$->location = @1;
                              14207                 :                 }
                              14208                 :         ;
                              14209                 : 
                              14210                 : 
                              14211                 : /*
 3641 peter_e                 14212 ECB             :  * SQL character data types
                              14213                 :  * The following implements CHAR() and VARCHAR().
                              14214                 :  */
                              14215                 : Character:  CharacterWithLength
 7553 lockhart                14216                 :                 {
 7553 lockhart                14217 GIC         967 :                     $$ = $1;
                              14218                 :                 }
                              14219                 :             | CharacterWithoutLength
                              14220                 :                 {
                              14221             859 :                     $$ = $1;
                              14222                 :                 }
                              14223                 :         ;
 7553 lockhart                14224 EUB             : 
                              14225                 : ConstCharacter:  CharacterWithLength
                              14226                 :                 {
 7553 lockhart                14227 GIC           6 :                     $$ = $1;
 7553 lockhart                14228 EUB             :                 }
                              14229                 :             | CharacterWithoutLength
                              14230                 :                 {
                              14231                 :                     /* Length was not specified so allow to be unrestricted.
                              14232                 :                      * This handles problems with fixed-length (bpchar) strings
                              14233                 :                      * which in column definitions must default to a length
                              14234                 :                      * of one, but should not be constrained if the length
                              14235                 :                      * was not specified.
                              14236                 :                      */
 7553 lockhart                14237 GIC          10 :                     $$ = $1;
 5944 tgl                     14238 CBC          10 :                     $$->typmods = NIL;
 7553 lockhart                14239 ECB             :                 }
                              14240                 :         ;
                              14241                 : 
                              14242                 : CharacterWithLength:  character '(' Iconst ')'
                              14243                 :                 {
 7646 tgl                     14244 GIC         973 :                     $$ = SystemTypeName($1);
 5337                         14245             973 :                     $$->typmods = list_make1(makeIntConst($3, @3));
 5944                         14246             973 :                     $$->location = @1;
                              14247                 :                 }
                              14248                 :         ;
 7553 lockhart                14249 ECB             : 
                              14250                 : CharacterWithoutLength:  character
 9328                         14251                 :                 {
 7646 tgl                     14252 GIC         869 :                     $$ = SystemTypeName($1);
                              14253                 :                     /* char defaults to char(1), varchar to no limit */
 7818                         14254             869 :                     if (strcmp($1, "bpchar") == 0)
 5337 tgl                     14255 CBC         122 :                         $$->typmods = list_make1(makeIntConst(1, -1));
 5944                         14256             869 :                     $$->location = @1;
                              14257                 :                 }
 7858 lockhart                14258 ECB             :         ;
                              14259                 : 
                              14260                 : character:  CHARACTER opt_varying
 7601 bruce                   14261 GIC         779 :                                         { $$ = $2 ? "varchar": "bpchar"; }
                              14262                 :             | CHAR_P opt_varying
                              14263             486 :                                         { $$ = $2 ? "varchar": "bpchar"; }
                              14264                 :             | VARCHAR
                              14265             576 :                                         { $$ = "varchar"; }
                              14266                 :             | NATIONAL CHARACTER opt_varying
 7601 bruce                   14267 UIC           0 :                                         { $$ = $3 ? "varchar": "bpchar"; }
                              14268                 :             | NATIONAL CHAR_P opt_varying
 7601 bruce                   14269 LBC           0 :                                         { $$ = $3 ? "varchar": "bpchar"; }
                              14270                 :             | NCHAR opt_varying
 7601 bruce                   14271 GIC           1 :                                         { $$ = $2 ? "varchar": "bpchar"; }
                              14272                 :         ;
 9297 lockhart                14273 ECB             : 
                              14274                 : opt_varying:
 2062 peter_e                 14275 GIC         728 :             VARYING                                 { $$ = true; }
                              14276            1725 :             | /*EMPTY*/                             { $$ = false; }
                              14277                 :         ;
                              14278                 : 
 5944 tgl                     14279 ECB             : /*
                              14280                 :  * SQL date/time types
                              14281                 :  */
                              14282                 : ConstDatetime:
                              14283                 :             TIMESTAMP '(' Iconst ')' opt_timezone
                              14284                 :                 {
 7858 lockhart                14285 GIC         319 :                     if ($5)
 7646 tgl                     14286             310 :                         $$ = SystemTypeName("timestamptz");
                              14287                 :                     else
                              14288               9 :                         $$ = SystemTypeName("timestamp");
 5337 tgl                     14289 CBC         319 :                     $$->typmods = list_make1(makeIntConst($3, @3));
 5944                         14290             319 :                     $$->location = @1;
                              14291                 :                 }
                              14292                 :             | TIMESTAMP opt_timezone
                              14293                 :                 {
 7863 lockhart                14294 GIC        6589 :                     if ($2)
 7646 tgl                     14295             886 :                         $$ = SystemTypeName("timestamptz");
 7863 lockhart                14296 ECB             :                     else
 7646 tgl                     14297 CBC        5703 :                         $$ = SystemTypeName("timestamp");
 5944                         14298            6589 :                     $$->location = @1;
                              14299                 :                 }
                              14300                 :             | TIME '(' Iconst ')' opt_timezone
                              14301                 :                 {
 7858 lockhart                14302 GIC          11 :                     if ($5)
 7646 tgl                     14303               4 :                         $$ = SystemTypeName("timetz");
 7858 lockhart                14304 ECB             :                     else
 7646 tgl                     14305 GIC           7 :                         $$ = SystemTypeName("time");
 5337 tgl                     14306 CBC          11 :                     $$->typmods = list_make1(makeIntConst($3, @3));
 5944                         14307              11 :                     $$->location = @1;
 9297 lockhart                14308 ECB             :                 }
                              14309                 :             | TIME opt_timezone
                              14310                 :                 {
 8426 lockhart                14311 GIC        4471 :                     if ($2)
 7646 tgl                     14312             133 :                         $$ = SystemTypeName("timetz");
 8426 lockhart                14313 ECB             :                     else
 7646 tgl                     14314 GIC        4338 :                         $$ = SystemTypeName("time");
 5944 tgl                     14315 CBC        4471 :                     $$->location = @1;
                              14316                 :                 }
 8304 lockhart                14317 ECB             :         ;
                              14318                 : 
 7601 bruce                   14319 EUB             : ConstInterval:
                              14320                 :             INTERVAL
 5944 tgl                     14321                 :                 {
 5944 tgl                     14322 GIC        8087 :                     $$ = SystemTypeName("interval");
 5944 tgl                     14323 CBC        8087 :                     $$->location = @1;
                              14324                 :                 }
                              14325                 :         ;
                              14326                 : 
 7601 bruce                   14327 ECB             : opt_timezone:
 2062 peter_e                 14328 CBC        1333 :             WITH_LA TIME ZONE                       { $$ = true; }
    5 alvherre                14329 GNC         250 :             | WITHOUT_LA TIME ZONE                  { $$ = false; }
 2062 peter_e                 14330 GIC        9807 :             | /*EMPTY*/                             { $$ = false; }
                              14331                 :         ;
                              14332                 : 
                              14333                 : opt_interval:
                              14334                 :             YEAR_P
 5323 tgl                     14335               6 :                 { $$ = list_make1(makeIntConst(INTERVAL_MASK(YEAR), @1)); }
                              14336                 :             | MONTH_P
 5323 tgl                     14337 CBC           9 :                 { $$ = list_make1(makeIntConst(INTERVAL_MASK(MONTH), @1)); }
 5323 tgl                     14338 ECB             :             | DAY_P
 5323 tgl                     14339 GIC           9 :                 { $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY), @1)); }
 5323 tgl                     14340 ECB             :             | HOUR_P
 5323 tgl                     14341 CBC           6 :                 { $$ = list_make1(makeIntConst(INTERVAL_MASK(HOUR), @1)); }
 5323 tgl                     14342 ECB             :             | MINUTE_P
 5323 tgl                     14343 GIC           6 :                 { $$ = list_make1(makeIntConst(INTERVAL_MASK(MINUTE), @1)); }
                              14344                 :             | interval_second
                              14345              12 :                 { $$ = $1; }
 7600 bruce                   14346 ECB             :             | YEAR_P TO MONTH_P
 5323 tgl                     14347                 :                 {
 5323 tgl                     14348 GIC           9 :                     $$ = list_make1(makeIntConst(INTERVAL_MASK(YEAR) |
 5323 tgl                     14349 ECB             :                                                  INTERVAL_MASK(MONTH), @1));
                              14350                 :                 }
                              14351                 :             | DAY_P TO HOUR_P
                              14352                 :                 {
 5323 tgl                     14353 GIC          12 :                     $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY) |
 5323 tgl                     14354 ECB             :                                                  INTERVAL_MASK(HOUR), @1));
                              14355                 :                 }
                              14356                 :             | DAY_P TO MINUTE_P
                              14357                 :                 {
 5323 tgl                     14358 CBC          12 :                     $$ = list_make1(makeIntConst(INTERVAL_MASK(DAY) |
 5323 tgl                     14359 ECB             :                                                  INTERVAL_MASK(HOUR) |
                              14360                 :                                                  INTERVAL_MASK(MINUTE), @1));
                              14361                 :                 }
                              14362                 :             | DAY_P TO interval_second
                              14363                 :                 {
 5323 tgl                     14364 CBC          24 :                     $$ = $3;
 5323 tgl                     14365 GIC          24 :                     linitial($$) = makeIntConst(INTERVAL_MASK(DAY) |
 5323 tgl                     14366 ECB             :                                                 INTERVAL_MASK(HOUR) |
                              14367                 :                                                 INTERVAL_MASK(MINUTE) |
 5323 tgl                     14368 GIC          24 :                                                 INTERVAL_MASK(SECOND), @1);
                              14369                 :                 }
                              14370                 :             | HOUR_P TO MINUTE_P
                              14371                 :                 {
                              14372               9 :                     $$ = list_make1(makeIntConst(INTERVAL_MASK(HOUR) |
                              14373                 :                                                  INTERVAL_MASK(MINUTE), @1));
 5323 tgl                     14374 ECB             :                 }
                              14375                 :             | HOUR_P TO interval_second
                              14376                 :                 {
 5323 tgl                     14377 GIC          18 :                     $$ = $3;
                              14378              18 :                     linitial($$) = makeIntConst(INTERVAL_MASK(HOUR) |
                              14379                 :                                                 INTERVAL_MASK(MINUTE) |
 5323 tgl                     14380 CBC          18 :                                                 INTERVAL_MASK(SECOND), @1);
 5323 tgl                     14381 ECB             :                 }
                              14382                 :             | MINUTE_P TO interval_second
                              14383                 :                 {
 5323 tgl                     14384 GIC          33 :                     $$ = $3;
                              14385              33 :                     linitial($$) = makeIntConst(INTERVAL_MASK(MINUTE) |
                              14386              33 :                                                 INTERVAL_MASK(SECOND), @1);
 5323 tgl                     14387 ECB             :                 }
                              14388                 :             | /*EMPTY*/
 5323 tgl                     14389 CBC        7916 :                 { $$ = NIL; }
                              14390                 :         ;
 5323 tgl                     14391 ECB             : 
                              14392                 : interval_second:
                              14393                 :             SECOND_P
                              14394                 :                 {
 5323 tgl                     14395 CBC          51 :                     $$ = list_make1(makeIntConst(INTERVAL_MASK(SECOND), @1));
                              14396                 :                 }
 5323 tgl                     14397 ECB             :             | SECOND_P '(' Iconst ')'
                              14398                 :                 {
 5323 tgl                     14399 GIC          36 :                     $$ = list_make2(makeIntConst(INTERVAL_MASK(SECOND), @1),
 5323 tgl                     14400 ECB             :                                     makeIntConst($3, @3));
                              14401                 :                 }
                              14402                 :         ;
                              14403                 : 
                              14404                 : 
 9770 scrappy                 14405                 : /*****************************************************************************
                              14406                 :  *
                              14407                 :  *  expression grammar
                              14408                 :  *
                              14409                 :  *****************************************************************************/
                              14410                 : 
                              14411                 : /*
                              14412                 :  * General expressions
                              14413                 :  * This is the heart of the expression syntax.
                              14414                 :  *
                              14415                 :  * We have two expression types: a_expr is the unrestricted kind, and
 8541 tgl                     14416                 :  * b_expr is a subset that must be used in some places to avoid shift/reduce
                              14417                 :  * conflicts.  For example, we can't do BETWEEN as "BETWEEN a_expr AND a_expr"
                              14418                 :  * because that use of AND conflicts with AND as a boolean operator.  So,
                              14419                 :  * b_expr is used in BETWEEN and we remove boolean keywords from b_expr.
                              14420                 :  *
                              14421                 :  * Note that '(' a_expr ')' is a b_expr, so an unrestricted expression can
                              14422                 :  * always be used by surrounding it with parens.
                              14423                 :  *
 8454 lockhart                14424                 :  * c_expr is all the productions that are common to a_expr and b_expr;
                              14425                 :  * it's factored out just to eliminate redundant coding.
                              14426                 :  *
                              14427                 :  * Be careful of productions involving more than one terminal token.
                              14428                 :  * By default, bison will assign such productions the precedence of their
 2951 tgl                     14429                 :  * last terminal, but in nearly all cases you want it to be the precedence
                              14430                 :  * of the first terminal instead; otherwise you will not get the behavior
                              14431                 :  * you expect!  So we use %prec annotations freely to set precedences.
 9195 lockhart                14432                 :  */
 7601 bruce                   14433 GIC     3061214 : a_expr:     c_expr                                  { $$ = $1; }
                              14434                 :             | a_expr TYPECAST Typename
 5337 tgl                     14435          103868 :                     { $$ = makeTypeCast($1, $3, @2); }
 4414 tgl                     14436 ECB             :             | a_expr COLLATE any_name
                              14437                 :                 {
 4414 tgl                     14438 CBC        3643 :                     CollateClause *n = makeNode(CollateClause);
                              14439                 : 
 4412 tgl                     14440 GIC        3643 :                     n->arg = $1;
 4412 tgl                     14441 CBC        3643 :                     n->collname = $3;
 4414 tgl                     14442 GIC        3643 :                     n->location = @2;
                              14443            3643 :                     $$ = (Node *) n;
                              14444                 :                 }
                              14445                 :             | a_expr AT TIME ZONE a_expr            %prec AT
                              14446                 :                 {
 3569 rhaas                   14447 CBC         183 :                     $$ = (Node *) makeFuncCall(SystemFuncName("timezone"),
 3569 rhaas                   14448 GIC         183 :                                                list_make2($5, $1),
                              14449                 :                                                COERCE_SQL_SYNTAX,
                              14450             183 :                                                @2);
 8189 lockhart                14451 ECB             :                 }
                              14452                 :         /*
                              14453                 :          * These operators must be called out explicitly in order to make use
                              14454                 :          * of bison's automatic operator-precedence handling.  All other
                              14455                 :          * operator names are handled by the generic productions using "Op",
                              14456                 :          * below; and all those operators will have the same precedence.
                              14457                 :          *
                              14458                 :          * If you add more explicitly-known operators, be sure to add them
                              14459                 :          * also to b_expr and to the MathOp list below.
                              14460                 :          */
                              14461                 :             | '+' a_expr                    %prec UMINUS
 6235 tgl                     14462 GIC           6 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
                              14463                 :             | '-' a_expr                    %prec UMINUS
                              14464            8882 :                 { $$ = doNegate($2, @1); }
                              14465                 :             | a_expr '+' a_expr
                              14466           12925 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3, @2); }
                              14467                 :             | a_expr '-' a_expr
                              14468            5148 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3, @2); }
                              14469                 :             | a_expr '*' a_expr
                              14470            4841 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3, @2); }
                              14471                 :             | a_expr '/' a_expr
                              14472            1725 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3, @2); }
                              14473                 :             | a_expr '%' a_expr
                              14474            1261 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3, @2); }
                              14475                 :             | a_expr '^' a_expr
                              14476             490 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3, @2); }
                              14477                 :             | a_expr '<' a_expr
                              14478            5289 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3, @2); }
                              14479                 :             | a_expr '>' a_expr
                              14480           10427 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3, @2); }
                              14481                 :             | a_expr '=' a_expr
                              14482          294145 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3, @2); }
                              14483                 :             | a_expr LESS_EQUALS a_expr
 2951                         14484            2217 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $3, @2); }
 2951 tgl                     14485 ECB             :             | a_expr GREATER_EQUALS a_expr
 2951 tgl                     14486 GIC        2511 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3, @2); }
 2951 tgl                     14487 ECB             :             | a_expr NOT_EQUALS a_expr
 2951 tgl                     14488 GIC       21784 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, $3, @2); }
                              14489                 : 
 7601 bruce                   14490 ECB             :             | a_expr qual_Op a_expr             %prec Op
 6235 tgl                     14491 GIC       40860 :                 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
 7601 bruce                   14492 ECB             :             | qual_Op a_expr                    %prec Op
 6235 tgl                     14493 CBC          96 :                 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
 7601 bruce                   14494 ECB             : 
                              14495                 :             | a_expr AND a_expr
 3219 tgl                     14496 GIC      174289 :                 { $$ = makeAndExpr($1, $3, @2); }
                              14497                 :             | a_expr OR a_expr
                              14498           26248 :                 { $$ = makeOrExpr($1, $3, @2); }
 7601 bruce                   14499 ECB             :             | NOT a_expr
 3219 tgl                     14500 CBC       15115 :                 { $$ = makeNotExpr($2, @1); }
                              14501                 :             | NOT_LA a_expr                     %prec NOT
 2951 tgl                     14502 LBC           0 :                 { $$ = makeNotExpr($2, @1); }
                              14503                 : 
                              14504                 :             | a_expr LIKE a_expr
                              14505                 :                 {
 2967 tgl                     14506 GIC        1144 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "~~",
                              14507            1144 :                                                    $1, $3, @2);
                              14508                 :                 }
                              14509                 :             | a_expr LIKE a_expr ESCAPE a_expr                  %prec LIKE
                              14510                 :                 {
  331 peter                   14511              48 :                     FuncCall   *n = makeFuncCall(SystemFuncName("like_escape"),
                              14512              48 :                                                  list_make2($3, $5),
                              14513                 :                                                  COERCE_EXPLICIT_CALL,
  331 peter                   14514 CBC          48 :                                                  @2);
 2967 tgl                     14515 GIC          48 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "~~",
 2967 tgl                     14516 CBC          48 :                                                    $1, (Node *) n, @2);
                              14517                 :                 }
 2951 tgl                     14518 ECB             :             | a_expr NOT_LA LIKE a_expr                         %prec NOT_LA
                              14519                 :                 {
 2967 tgl                     14520 CBC          96 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "!~~",
 2967 tgl                     14521 GIC          96 :                                                    $1, $4, @2);
 2967 tgl                     14522 ECB             :                 }
                              14523                 :             | a_expr NOT_LA LIKE a_expr ESCAPE a_expr           %prec NOT_LA
 8281 lockhart                14524                 :                 {
  331 peter                   14525 GIC          48 :                     FuncCall   *n = makeFuncCall(SystemFuncName("like_escape"),
  331 peter                   14526 CBC          48 :                                                  list_make2($4, $6),
                              14527                 :                                                  COERCE_EXPLICIT_CALL,
                              14528              48 :                                                  @2);
 2967 tgl                     14529 GIC          48 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_LIKE, "!~~",
 2967 tgl                     14530 CBC          48 :                                                    $1, (Node *) n, @2);
                              14531                 :                 }
 7601 bruce                   14532 ECB             :             | a_expr ILIKE a_expr
                              14533                 :                 {
 2967 tgl                     14534 CBC         111 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "~~*",
 2967 tgl                     14535 GIC         111 :                                                    $1, $3, @2);
 2967 tgl                     14536 ECB             :                 }
                              14537                 :             | a_expr ILIKE a_expr ESCAPE a_expr                 %prec ILIKE
 8281 lockhart                14538                 :                 {
  331 peter                   14539 UIC           0 :                     FuncCall   *n = makeFuncCall(SystemFuncName("like_escape"),
  331 peter                   14540 LBC           0 :                                                  list_make2($3, $5),
                              14541                 :                                                  COERCE_EXPLICIT_CALL,
  331 peter                   14542 UIC           0 :                                                  @2);
 2967 tgl                     14543 LBC           0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "~~*",
 2967 tgl                     14544 UIC           0 :                                                    $1, (Node *) n, @2);
 8281 lockhart                14545 ECB             :                 }
                              14546                 :             | a_expr NOT_LA ILIKE a_expr                        %prec NOT_LA
                              14547                 :                 {
 2967 tgl                     14548 CBC          15 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "!~~*",
 2967 tgl                     14549 GIC          15 :                                                    $1, $4, @2);
 2967 tgl                     14550 ECB             :                 }
                              14551                 :             | a_expr NOT_LA ILIKE a_expr ESCAPE a_expr          %prec NOT_LA
 8281 lockhart                14552                 :                 {
  331 peter                   14553 UIC           0 :                     FuncCall   *n = makeFuncCall(SystemFuncName("like_escape"),
  331 peter                   14554 UBC           0 :                                                  list_make2($4, $6),
                              14555                 :                                                  COERCE_EXPLICIT_CALL,
  331 peter                   14556 UIC           0 :                                                  @2);
 2967 tgl                     14557               0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_ILIKE, "!~~*",
 2967 tgl                     14558 LBC           0 :                                                    $1, (Node *) n, @2);
 8281 lockhart                14559 ECB             :                 }
                              14560                 : 
                              14561                 :             | a_expr SIMILAR TO a_expr                          %prec SIMILAR
                              14562                 :                 {
  331 peter                   14563 CBC          20 :                     FuncCall   *n = makeFuncCall(SystemFuncName("similar_to_escape"),
                              14564              20 :                                                  list_make1($4),
                              14565                 :                                                  COERCE_EXPLICIT_CALL,
                              14566              20 :                                                  @2);
 2967 tgl                     14567              20 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "~",
                              14568              20 :                                                    $1, (Node *) n, @2);
                              14569                 :                 }
                              14570                 :             | a_expr SIMILAR TO a_expr ESCAPE a_expr            %prec SIMILAR
                              14571                 :                 {
  331 peter                   14572              15 :                     FuncCall   *n = makeFuncCall(SystemFuncName("similar_to_escape"),
                              14573              15 :                                                  list_make2($4, $6),
                              14574                 :                                                  COERCE_EXPLICIT_CALL,
  331 peter                   14575 GIC          15 :                                                  @2);
 2967 tgl                     14576              15 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "~",
 2967 tgl                     14577 CBC          15 :                                                    $1, (Node *) n, @2);
 7607 lockhart                14578 ECB             :                 }
                              14579                 :             | a_expr NOT_LA SIMILAR TO a_expr                   %prec NOT_LA
 7504 tgl                     14580                 :                 {
  331 peter                   14581 LBC           0 :                     FuncCall   *n = makeFuncCall(SystemFuncName("similar_to_escape"),
                              14582               0 :                                                  list_make1($5),
                              14583                 :                                                  COERCE_EXPLICIT_CALL,
  331 peter                   14584 UIC           0 :                                                  @2);
 2967 tgl                     14585               0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "!~",
 2967 tgl                     14586 LBC           0 :                                                    $1, (Node *) n, @2);
 7504 tgl                     14587 ECB             :                 }
                              14588                 :             | a_expr NOT_LA SIMILAR TO a_expr ESCAPE a_expr     %prec NOT_LA
                              14589                 :                 {
  331 peter                   14590 UIC           0 :                     FuncCall   *n = makeFuncCall(SystemFuncName("similar_to_escape"),
  331 peter                   14591 UBC           0 :                                                  list_make2($5, $7),
  331 peter                   14592 EUB             :                                                  COERCE_EXPLICIT_CALL,
  331 peter                   14593 UIC           0 :                                                  @2);
 2967 tgl                     14594 UBC           0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_SIMILAR, "!~",
                              14595               0 :                                                    $1, (Node *) n, @2);
 7607 lockhart                14596 EUB             :                 }
                              14597                 : 
                              14598                 :             /* NullTest clause
                              14599                 :              * Define SQL-style Null test clause.
 7601 bruce                   14600 ECB             :              * Allow two forms described in the standard:
                              14601                 :              *  a IS NULL
                              14602                 :              *  a IS NOT NULL
                              14603                 :              * Allow two SQL extensions
                              14604                 :              *  a ISNULL
 7601 bruce                   14605 EUB             :              *  a NOTNULL
                              14606                 :              */
                              14607                 :             | a_expr IS NULL_P                          %prec IS
 7964 tgl                     14608                 :                 {
  331 peter                   14609 GBC        3386 :                     NullTest   *n = makeNode(NullTest);
  331 peter                   14610 EUB             : 
 6037 tgl                     14611 GIC        3386 :                     n->arg = (Expr *) $1;
                              14612            3386 :                     n->nulltesttype = IS_NULL;
 2968                         14613            3386 :                     n->location = @2;
  331 peter                   14614            3386 :                     $$ = (Node *) n;
 7964 tgl                     14615 ECB             :                 }
 6037                         14616                 :             | a_expr ISNULL
                              14617                 :                 {
  331 peter                   14618 CBC          48 :                     NullTest   *n = makeNode(NullTest);
  331 peter                   14619 ECB             : 
 6037 tgl                     14620 CBC          48 :                     n->arg = (Expr *) $1;
 6037 tgl                     14621 GIC          48 :                     n->nulltesttype = IS_NULL;
 2968                         14622              48 :                     n->location = @2;
  331 peter                   14623              48 :                     $$ = (Node *) n;
 7964 tgl                     14624 ECB             :                 }
 4357                         14625                 :             | a_expr IS NOT NULL_P                      %prec IS
                              14626                 :                 {
  331 peter                   14627 CBC       11349 :                     NullTest   *n = makeNode(NullTest);
  331 peter                   14628 ECB             : 
 6037 tgl                     14629 CBC       11349 :                     n->arg = (Expr *) $1;
 6037 tgl                     14630 GIC       11349 :                     n->nulltesttype = IS_NOT_NULL;
 2968                         14631           11349 :                     n->location = @2;
  331 peter                   14632           11349 :                     $$ = (Node *) n;
 6037 tgl                     14633 EUB             :                 }
                              14634                 :             | a_expr NOTNULL
                              14635                 :                 {
  331 peter                   14636 GBC           3 :                     NullTest   *n = makeNode(NullTest);
  331 peter                   14637 EUB             : 
 6037 tgl                     14638 GBC           3 :                     n->arg = (Expr *) $1;
 6037 tgl                     14639 GIC           3 :                     n->nulltesttype = IS_NOT_NULL;
 2968                         14640               3 :                     n->location = @2;
  331 peter                   14641               3 :                     $$ = (Node *) n;
 6908 tgl                     14642 EUB             :                 }
                              14643                 :             | row OVERLAPS row
                              14644                 :                 {
 3337 tgl                     14645 GBC        2778 :                     if (list_length($1) != 2)
 3337 tgl                     14646 UBC           0 :                         ereport(ERROR,
 3337 tgl                     14647 EUB             :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                              14648                 :                                  errmsg("wrong number of parameters on left side of OVERLAPS expression"),
                              14649                 :                                  parser_errposition(@1)));
 3337 tgl                     14650 GIC        2778 :                     if (list_length($3) != 2)
 3337 tgl                     14651 UIC           0 :                         ereport(ERROR,
                              14652                 :                                 (errcode(ERRCODE_SYNTAX_ERROR),
                              14653                 :                                  errmsg("wrong number of parameters on right side of OVERLAPS expression"),
                              14654                 :                                  parser_errposition(@3)));
 3337 tgl                     14655 GIC        2778 :                     $$ = (Node *) makeFuncCall(SystemFuncName("overlaps"),
                              14656            2778 :                                                list_concat($1, $3),
                              14657                 :                                                COERCE_SQL_SYNTAX,
                              14658            2778 :                                                @2);
                              14659                 :                 }
                              14660                 :             | a_expr IS TRUE_P                          %prec IS
 9297 lockhart                14661 ECB             :                 {
 7964 tgl                     14662 GIC         139 :                     BooleanTest *b = makeNode(BooleanTest);
  331 peter                   14663 ECB             : 
 7423 tgl                     14664 CBC         139 :                     b->arg = (Expr *) $1;
 7964                         14665             139 :                     b->booltesttype = IS_TRUE;
 2968                         14666             139 :                     b->location = @2;
  331 peter                   14667 GIC         139 :                     $$ = (Node *) b;
                              14668                 :                 }
                              14669                 :             | a_expr IS NOT TRUE_P                      %prec IS
 9297 lockhart                14670 ECB             :                 {
 7964 tgl                     14671 GIC          21 :                     BooleanTest *b = makeNode(BooleanTest);
  331 peter                   14672 ECB             : 
 7423 tgl                     14673 CBC          21 :                     b->arg = (Expr *) $1;
 7964                         14674              21 :                     b->booltesttype = IS_NOT_TRUE;
 2968                         14675              21 :                     b->location = @2;
  331 peter                   14676 GIC          21 :                     $$ = (Node *) b;
                              14677                 :                 }
                              14678                 :             | a_expr IS FALSE_P                         %prec IS
 9297 lockhart                14679 ECB             :                 {
 7964 tgl                     14680 GIC          22 :                     BooleanTest *b = makeNode(BooleanTest);
  331 peter                   14681 ECB             : 
 7423 tgl                     14682 CBC          22 :                     b->arg = (Expr *) $1;
 7964                         14683              22 :                     b->booltesttype = IS_FALSE;
 2968                         14684              22 :                     b->location = @2;
  331 peter                   14685 GIC          22 :                     $$ = (Node *) b;
                              14686                 :                 }
                              14687                 :             | a_expr IS NOT FALSE_P                     %prec IS
 9297 lockhart                14688 ECB             :                 {
 7964 tgl                     14689 GIC          15 :                     BooleanTest *b = makeNode(BooleanTest);
  331 peter                   14690 ECB             : 
 7423 tgl                     14691 CBC          15 :                     b->arg = (Expr *) $1;
 7964                         14692              15 :                     b->booltesttype = IS_NOT_FALSE;
 2968                         14693              15 :                     b->location = @2;
  331 peter                   14694 GIC          15 :                     $$ = (Node *) b;
                              14695                 :                 }
                              14696                 :             | a_expr IS UNKNOWN                         %prec IS
 7964 tgl                     14697 ECB             :                 {
 7964 tgl                     14698 GBC           8 :                     BooleanTest *b = makeNode(BooleanTest);
                              14699                 : 
 7423 tgl                     14700 GIC           8 :                     b->arg = (Expr *) $1;
 7964                         14701               8 :                     b->booltesttype = IS_UNKNOWN;
 2968 tgl                     14702 CBC           8 :                     b->location = @2;
  331 peter                   14703 GBC           8 :                     $$ = (Node *) b;
                              14704                 :                 }
                              14705                 :             | a_expr IS NOT UNKNOWN                     %prec IS
                              14706                 :                 {
 7964 tgl                     14707 CBC           6 :                     BooleanTest *b = makeNode(BooleanTest);
  331 peter                   14708 ECB             : 
 7423 tgl                     14709 GIC           6 :                     b->arg = (Expr *) $1;
 7964 tgl                     14710 CBC           6 :                     b->booltesttype = IS_NOT_UNKNOWN;
 2968 tgl                     14711 GIC           6 :                     b->location = @2;
  331 peter                   14712               6 :                     $$ = (Node *) b;
                              14713                 :                 }
 7521 tgl                     14714 ECB             :             | a_expr IS DISTINCT FROM a_expr            %prec IS
                              14715                 :                 {
 6235 tgl                     14716 CBC         371 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5, @2);
 6908 tgl                     14717 ECB             :                 }
 6328 neilc                   14718                 :             | a_expr IS NOT DISTINCT FROM a_expr        %prec IS
                              14719                 :                 {
 2446 tgl                     14720 GIC          31 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_DISTINCT, "=", $1, $6, @2);
                              14721                 :                 }
                              14722                 :             | a_expr BETWEEN opt_asymmetric b_expr AND a_expr       %prec BETWEEN
 9344 bruce                   14723 ECB             :                 {
 2968 tgl                     14724 GIC         226 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_BETWEEN,
 2968 tgl                     14725 ECB             :                                                    "BETWEEN",
 2968 tgl                     14726 CBC         226 :                                                    $1,
                              14727             226 :                                                    (Node *) list_make2($4, $6),
                              14728             226 :                                                    @2);
                              14729                 :                 }
                              14730                 :             | a_expr NOT_LA BETWEEN opt_asymmetric b_expr AND a_expr %prec NOT_LA
                              14731                 :                 {
                              14732               6 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_BETWEEN,
                              14733                 :                                                    "NOT BETWEEN",
                              14734               6 :                                                    $1,
                              14735               6 :                                                    (Node *) list_make2($5, $7),
                              14736               6 :                                                    @2);
 9344 bruce                   14737 ECB             :                 }
                              14738                 :             | a_expr BETWEEN SYMMETRIC b_expr AND a_expr            %prec BETWEEN
                              14739                 :                 {
 2968 tgl                     14740 GIC           6 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_BETWEEN_SYM,
 2968 tgl                     14741 ECB             :                                                    "BETWEEN SYMMETRIC",
 2968 tgl                     14742 GIC           6 :                                                    $1,
 2968 tgl                     14743 CBC           6 :                                                    (Node *) list_make2($4, $6),
                              14744               6 :                                                    @2);
 6508 bruce                   14745 ECB             :                 }
 2951 tgl                     14746                 :             | a_expr NOT_LA BETWEEN SYMMETRIC b_expr AND a_expr     %prec NOT_LA
                              14747                 :                 {
 2968 tgl                     14748 GIC           6 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_BETWEEN_SYM,
                              14749                 :                                                    "NOT BETWEEN SYMMETRIC",
 2968 tgl                     14750 CBC           6 :                                                    $1,
 2968 tgl                     14751 GIC           6 :                                                    (Node *) list_make2($5, $7),
 2968 tgl                     14752 CBC           6 :                                                    @2);
 6508 bruce                   14753 ECB             :                 }
 7601                         14754                 :             | a_expr IN_P in_expr
 9213                         14755                 :                 {
                              14756                 :                     /* in_expr returns a SubLink or a list of a_exprs */
 8119 tgl                     14757 GIC       30070 :                     if (IsA($3, SubLink))
                              14758                 :                     {
 6341 tgl                     14759 ECB             :                         /* generate foo = ANY (subquery) */
  331 peter                   14760 GIC        3936 :                         SubLink    *n = (SubLink *) $3;
  331 peter                   14761 ECB             : 
 6341 tgl                     14762 CBC        3936 :                         n->subLinkType = ANY_SUBLINK;
 3217                         14763            3936 :                         n->subLinkId = 0;
 6311                         14764            3936 :                         n->testexpr = $1;
 2967 tgl                     14765 GIC        3936 :                         n->operName = NIL;       /* show it's IN not = ANY */
 5337                         14766            3936 :                         n->location = @2;
  331 peter                   14767            3936 :                         $$ = (Node *) n;
 9213 bruce                   14768 ECB             :                     }
                              14769                 :                     else
                              14770                 :                     {
                              14771                 :                         /* generate scalar IN expression */
 6235 tgl                     14772 CBC       26134 :                         $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "=", $1, $3, @2);
                              14773                 :                     }
                              14774                 :                 }
                              14775                 :             | a_expr NOT_LA IN_P in_expr                        %prec NOT_LA
 9213 bruce                   14776 ECB             :                 {
                              14777                 :                     /* in_expr returns a SubLink or a list of a_exprs */
 8119 tgl                     14778 CBC        2808 :                     if (IsA($4, SubLink))
 9213 bruce                   14779 ECB             :                     {
 6341 tgl                     14780                 :                         /* generate NOT (foo = ANY (subquery)) */
                              14781                 :                         /* Make an = ANY node */
  331 peter                   14782 GIC          60 :                         SubLink    *n = (SubLink *) $4;
                              14783                 : 
 7395 tgl                     14784 CBC          60 :                         n->subLinkType = ANY_SUBLINK;
 3217 tgl                     14785 GIC          60 :                         n->subLinkId = 0;
 6311 tgl                     14786 CBC          60 :                         n->testexpr = $1;
 2967                         14787              60 :                         n->operName = NIL;       /* show it's IN not = ANY */
                              14788              60 :                         n->location = @2;
                              14789                 :                         /* Stick a NOT on top; must have same parse location */
 3219 tgl                     14790 GIC          60 :                         $$ = makeNotExpr((Node *) n, @2);
                              14791                 :                     }
 8656 tgl                     14792 ECB             :                     else
                              14793                 :                     {
 6341                         14794                 :                         /* generate scalar NOT IN expression */
 6235 tgl                     14795 CBC        2748 :                         $$ = (Node *) makeSimpleA_Expr(AEXPR_IN, "<>", $1, $4, @2);
 9213 bruce                   14796 ECB             :                     }
                              14797                 :                 }
                              14798                 :             | a_expr subquery_Op sub_type select_with_parens    %prec Op
                              14799                 :                 {
  331 peter                   14800 CBC          81 :                     SubLink    *n = makeNode(SubLink);
                              14801                 : 
 8546 tgl                     14802              81 :                     n->subLinkType = $3;
 3217                         14803              81 :                     n->subLinkId = 0;
 6311                         14804              81 :                     n->testexpr = $1;
 7394 tgl                     14805 GIC          81 :                     n->operName = $2;
 8119                         14806              81 :                     n->subselect = $4;
 5337                         14807              81 :                     n->location = @2;
  331 peter                   14808              81 :                     $$ = (Node *) n;
 9196 bruce                   14809 ECB             :                 }
                              14810                 :             | a_expr subquery_Op sub_type '(' a_expr ')'        %prec Op
                              14811                 :                 {
 7224 tgl                     14812 CBC        7622 :                     if ($3 == ANY_SUBLINK)
 6235 tgl                     14813 GIC        7472 :                         $$ = (Node *) makeA_Expr(AEXPR_OP_ANY, $2, $1, $5, @2);
 7224 tgl                     14814 ECB             :                     else
 6235 tgl                     14815 CBC         150 :                         $$ = (Node *) makeA_Expr(AEXPR_OP_ALL, $2, $1, $5, @2);
 7224 tgl                     14816 ECB             :                 }
  430 peter                   14817                 :             | UNIQUE opt_unique_null_treatment select_with_parens
 7553 lockhart                14818                 :                 {
                              14819                 :                     /* Not sure how to get rid of the parentheses
                              14820                 :                      * but there are lots of shift/reduce errors without them.
                              14821                 :                      *
                              14822                 :                      * Should be able to implement this by plopping the entire
                              14823                 :                      * select into a node, then transforming the target expressions
                              14824                 :                      * from whatever they are into count(*), and testing the
                              14825                 :                      * entire result equal to one.
                              14826                 :                      * But, will probably implement a separate node in the executor.
                              14827                 :                      */
 7204 tgl                     14828 UIC           0 :                     ereport(ERROR,
                              14829                 :                             (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
 5333 tgl                     14830 ECB             :                              errmsg("UNIQUE predicate is not yet implemented"),
                              14831                 :                              parser_errposition(@1)));
                              14832                 :                 }
                              14833                 :             | a_expr IS DOCUMENT_P                  %prec IS
 5929 peter_e                 14834                 :                 {
 5337 tgl                     14835 GIC           9 :                     $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL,
 5337 tgl                     14836 CBC           9 :                                      list_make1($1), @2);
 5929 peter_e                 14837 ECB             :                 }
                              14838                 :             | a_expr IS NOT DOCUMENT_P              %prec IS
                              14839                 :                 {
 3219 tgl                     14840 CBC           9 :                     $$ = makeNotExpr(makeXmlExpr(IS_DOCUMENT, NULL, NIL,
 3219 tgl                     14841 GIC           9 :                                                  list_make1($1), @2),
 3219 tgl                     14842 CBC           9 :                                      @2);
                              14843                 :                 }
                              14844                 :             | a_expr IS NORMALIZED                              %prec IS
                              14845                 :                 {
  886 tgl                     14846 GIC           6 :                     $$ = (Node *) makeFuncCall(SystemFuncName("is_normalized"),
  886 tgl                     14847 CBC           6 :                                                list_make1($1),
                              14848                 :                                                COERCE_SQL_SYNTAX,
  886 tgl                     14849 GIC           6 :                                                @2);
                              14850                 :                 }
                              14851                 :             | a_expr IS unicode_normal_form NORMALIZED          %prec IS
 1109 peter                   14852 ECB             :                 {
  886 tgl                     14853 GIC          18 :                     $$ = (Node *) makeFuncCall(SystemFuncName("is_normalized"),
  886 tgl                     14854 CBC          18 :                                                list_make2($1, makeStringConst($3, @3)),
  886 tgl                     14855 ECB             :                                                COERCE_SQL_SYNTAX,
  886 tgl                     14856 CBC          18 :                                                @2);
 1109 peter                   14857 ECB             :                 }
                              14858                 :             | a_expr IS NOT NORMALIZED                          %prec IS
                              14859                 :                 {
  886 tgl                     14860 LBC           0 :                     $$ = makeNotExpr((Node *) makeFuncCall(SystemFuncName("is_normalized"),
  886 tgl                     14861 UIC           0 :                                                            list_make1($1),
                              14862                 :                                                            COERCE_SQL_SYNTAX,
                              14863               0 :                                                            @2),
  886 tgl                     14864 LBC           0 :                                      @2);
 1109 peter                   14865 ECB             :                 }
                              14866                 :             | a_expr IS NOT unicode_normal_form NORMALIZED      %prec IS
                              14867                 :                 {
  886 tgl                     14868 UIC           0 :                     $$ = makeNotExpr((Node *) makeFuncCall(SystemFuncName("is_normalized"),
                              14869               0 :                                                            list_make2($1, makeStringConst($4, @4)),
                              14870                 :                                                            COERCE_SQL_SYNTAX,
                              14871               0 :                                                            @2),
                              14872               0 :                                      @2);
                              14873                 :                 }
                              14874                 :             | a_expr IS json_predicate_type_constraint
                              14875                 :                     json_key_uniqueness_constraint_opt      %prec IS
                              14876                 :                 {
    9 alvherre                14877 GNC         142 :                     JsonFormat *format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
                              14878                 : 
                              14879             142 :                     $$ = makeJsonIsPredicate($1, format, $3, $4, @1);
                              14880                 :                 }
                              14881                 :             /*
                              14882                 :              * Required by SQL/JSON, but there are conflicts
                              14883                 :             | a_expr
                              14884                 :                 FORMAT_LA JSON json_encoding_clause_opt
                              14885                 :                 IS  json_predicate_type_constraint
                              14886                 :                     json_key_uniqueness_constraint_opt      %prec IS
                              14887                 :                 {
                              14888                 :                     $3.location = @2;
                              14889                 :                     $$ = makeJsonIsPredicate($1, $3, $5, $6, @1);
                              14890                 :                 }
                              14891                 :             */
                              14892                 :             | a_expr IS NOT
                              14893                 :                     json_predicate_type_constraint
                              14894                 :                     json_key_uniqueness_constraint_opt      %prec IS
                              14895                 :                 {
                              14896              22 :                     JsonFormat *format = makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
                              14897                 : 
                              14898              22 :                     $$ = makeNotExpr(makeJsonIsPredicate($1, format, $4, $5, @1), @1);
                              14899                 :                 }
                              14900                 :             /*
                              14901                 :              * Required by SQL/JSON, but there are conflicts
                              14902                 :             | a_expr
                              14903                 :                 FORMAT_LA JSON json_encoding_clause_opt
                              14904                 :                 IS NOT
                              14905                 :                     json_predicate_type_constraint
                              14906                 :                     json_key_uniqueness_constraint_opt      %prec IS
                              14907                 :                 {
                              14908                 :                     $3.location = @2;
                              14909                 :                     $$ = makeNotExpr(makeJsonIsPredicate($1, $3, $6, $7, @1), @1);
                              14910                 :                 }
                              14911                 :             */
                              14912                 :             | DEFAULT
                              14913                 :                 {
                              14914                 :                     /*
                              14915                 :                      * The SQL spec only allows DEFAULT in "contextually typed
                              14916                 :                      * expressions", but for us, it's easier to allow it in
                              14917                 :                      * any a_expr and then throw error during parse analysis
 2329 tgl                     14918 EUB             :                      * if it's in an inappropriate context.  This way also
                              14919                 :                      * lets us say something smarter than "syntax error".
                              14920                 :                      */
 2329 tgl                     14921 GIC         661 :                     SetToDefault *n = makeNode(SetToDefault);
                              14922                 : 
                              14923                 :                     /* parse analysis will fill in the rest */
                              14924             661 :                     n->location = @1;
  331 peter                   14925 CBC         661 :                     $$ = (Node *) n;
 2329 tgl                     14926 ECB             :                 }
                              14927                 :         ;
                              14928                 : 
                              14929                 : /*
 8541                         14930                 :  * Restricted expressions
                              14931                 :  *
                              14932                 :  * b_expr is a subset of the complete expression syntax defined by a_expr.
                              14933                 :  *
                              14934                 :  * Presently, AND, NOT, IS, and IN are the a_expr keywords that would
                              14935                 :  * cause trouble in the places where b_expr is used.  For simplicity, we
                              14936                 :  * just eliminate all the boolean-keyword-operator productions from b_expr.
 9195 lockhart                14937                 :  */
                              14938                 : b_expr:     c_expr
 7601 bruce                   14939 CBC        2495 :                 { $$ = $1; }
                              14940                 :             | b_expr TYPECAST Typename
 5337 tgl                     14941 GIC          67 :                 { $$ = makeTypeCast($1, $3, @2); }
                              14942                 :             | '+' b_expr                    %prec UMINUS
 6235 tgl                     14943 LBC           0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", NULL, $2, @1); }
 7601 bruce                   14944 ECB             :             | '-' b_expr                    %prec UMINUS
 6235 tgl                     14945 GIC          33 :                 { $$ = doNegate($2, @1); }
 7601 bruce                   14946 ECB             :             | b_expr '+' b_expr
 6235 tgl                     14947 GIC          15 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "+", $1, $3, @2); }
                              14948                 :             | b_expr '-' b_expr
                              14949               6 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "-", $1, $3, @2); }
 7601 bruce                   14950 EUB             :             | b_expr '*' b_expr
 6235 tgl                     14951 GBC           6 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "*", $1, $3, @2); }
                              14952                 :             | b_expr '/' b_expr
 6235 tgl                     14953 UBC           0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "/", $1, $3, @2); }
 7601 bruce                   14954 EUB             :             | b_expr '%' b_expr
 6235 tgl                     14955 UIC           0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "%", $1, $3, @2); }
                              14956                 :             | b_expr '^' b_expr
 6235 tgl                     14957 GIC           3 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "^", $1, $3, @2); }
 7601 bruce                   14958 EUB             :             | b_expr '<' b_expr
 6235 tgl                     14959 UBC           0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<", $1, $3, @2); }
                              14960                 :             | b_expr '>' b_expr
                              14961               0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">", $1, $3, @2); }
 7601 bruce                   14962 EUB             :             | b_expr '=' b_expr
 6235 tgl                     14963 UIC           0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "=", $1, $3, @2); }
                              14964                 :             | b_expr LESS_EQUALS b_expr
 2951                         14965               0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<=", $1, $3, @2); }
                              14966                 :             | b_expr GREATER_EQUALS b_expr
 2951 tgl                     14967 LBC           0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, ">=", $1, $3, @2); }
                              14968                 :             | b_expr NOT_EQUALS b_expr
                              14969               0 :                 { $$ = (Node *) makeSimpleA_Expr(AEXPR_OP, "<>", $1, $3, @2); }
                              14970                 :             | b_expr qual_Op b_expr             %prec Op
 6235 tgl                     14971 GIC           6 :                 { $$ = (Node *) makeA_Expr(AEXPR_OP, $2, $1, $3, @2); }
                              14972                 :             | qual_Op b_expr                    %prec Op
 6235 tgl                     14973 UIC           0 :                 { $$ = (Node *) makeA_Expr(AEXPR_OP, $1, NULL, $2, @1); }
                              14974                 :             | b_expr IS DISTINCT FROM b_expr        %prec IS
                              14975                 :                 {
                              14976               0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_DISTINCT, "=", $1, $5, @2);
                              14977                 :                 }
                              14978                 :             | b_expr IS NOT DISTINCT FROM b_expr    %prec IS
                              14979                 :                 {
 2446                         14980               0 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_NOT_DISTINCT, "=", $1, $6, @2);
                              14981                 :                 }
                              14982                 :             | b_expr IS DOCUMENT_P                  %prec IS
                              14983                 :                 {
 5337                         14984               0 :                     $$ = makeXmlExpr(IS_DOCUMENT, NULL, NIL,
                              14985               0 :                                      list_make1($1), @2);
 5929 peter_e                 14986 ECB             :                 }
                              14987                 :             | b_expr IS NOT DOCUMENT_P              %prec IS
                              14988                 :                 {
 3219 tgl                     14989 UIC           0 :                     $$ = makeNotExpr(makeXmlExpr(IS_DOCUMENT, NULL, NIL,
                              14990               0 :                                                  list_make1($1), @2),
                              14991               0 :                                      @2);
                              14992                 :                 }
                              14993                 :         ;
                              14994                 : 
                              14995                 : /*
                              14996                 :  * Productions that can be used in both a_expr and b_expr.
                              14997                 :  *
                              14998                 :  * Note: productions that refer recursively to a_expr or b_expr mostly
                              14999                 :  * cannot appear here.  However, it's OK to refer to a_exprs that occur
                              15000                 :  * inside parentheses, such as function arguments; that cannot introduce
                              15001                 :  * ambiguity to the b_expr syntax.
                              15002                 :  */
 6878 tgl                     15003 GIC     1358101 : c_expr:     columnref                               { $$ = $1; }
 7601 bruce                   15004          882201 :             | AexprConst                            { $$ = $1; }
                              15005                 :             | PARAM opt_indirection
                              15006                 :                 {
  331 peter                   15007          135122 :                     ParamRef   *p = makeNode(ParamRef);
                              15008                 : 
 6878 tgl                     15009          135122 :                     p->number = $1;
 5337                         15010          135122 :                     p->location = @1;
 6878 tgl                     15011 CBC      135122 :                     if ($2)
                              15012                 :                     {
 6878 tgl                     15013 GIC        2465 :                         A_Indirection *n = makeNode(A_Indirection);
  331 peter                   15014 ECB             : 
 6878 tgl                     15015 CBC        2465 :                         n->arg = (Node *) p;
 5018 tgl                     15016 GIC        2465 :                         n->indirection = check_indirection($2, yyscanner);
 6878                         15017            2465 :                         $$ = (Node *) n;
                              15018                 :                     }
                              15019                 :                     else
                              15020          132657 :                         $$ = (Node *) p;
                              15021                 :                 }
                              15022                 :             | '(' a_expr ')' opt_indirection
                              15023                 :                 {
 7306                         15024          107029 :                     if ($4)
                              15025                 :                     {
 6878                         15026           34076 :                         A_Indirection *n = makeNode(A_Indirection);
                              15027                 : 
 7306                         15028           34076 :                         n->arg = $2;
 5018 tgl                     15029 CBC       34076 :                         n->indirection = check_indirection($4, yyscanner);
  331 peter                   15030 GIC       34076 :                         $$ = (Node *) n;
 7306 tgl                     15031 ECB             :                     }
                              15032                 :                     else
 7306 tgl                     15033 GBC       72953 :                         $$ = $2;
                              15034                 :                 }
 7601 bruce                   15035 ECB             :             | case_expr
 7601 bruce                   15036 GIC       50079 :                 { $$ = $1; }
 6766 tgl                     15037 ECB             :             | func_expr
 6766 tgl                     15038 GIC      497078 :                 { $$ = $1; }
 6766 tgl                     15039 ECB             :             | select_with_parens            %prec UMINUS
                              15040                 :                 {
  331 peter                   15041 CBC       17015 :                     SubLink    *n = makeNode(SubLink);
                              15042                 : 
 6766 tgl                     15043 GBC       17015 :                     n->subLinkType = EXPR_SUBLINK;
 3217 tgl                     15044 GIC       17015 :                     n->subLinkId = 0;
 6311 tgl                     15045 GBC       17015 :                     n->testexpr = NULL;
 6766 tgl                     15046 GIC       17015 :                     n->operName = NIL;
 6766 tgl                     15047 CBC       17015 :                     n->subselect = $1;
 5337 tgl                     15048 GIC       17015 :                     n->location = @1;
  331 peter                   15049 GBC       17015 :                     $$ = (Node *) n;
                              15050                 :                 }
 3721 tgl                     15051 EUB             :             | select_with_parens indirection
                              15052                 :                 {
                              15053                 :                     /*
                              15054                 :                      * Because the select_with_parens nonterminal is designed
                              15055                 :                      * to "eat" as many levels of parens as possible, the
                              15056                 :                      * '(' a_expr ')' opt_indirection production above will
                              15057                 :                      * fail to match a sub-SELECT with indirection decoration;
                              15058                 :                      * the sub-SELECT won't be regarded as an a_expr as long
                              15059                 :                      * as there are parens around it.  To support applying
                              15060                 :                      * subscripting or field selection to a sub-SELECT result,
 3721 tgl                     15061 ECB             :                      * we need this redundant-looking production.
                              15062                 :                      */
  331 peter                   15063 GBC           9 :                     SubLink    *n = makeNode(SubLink);
 3721 tgl                     15064 GIC           9 :                     A_Indirection *a = makeNode(A_Indirection);
                              15065                 : 
 3721 tgl                     15066 GBC           9 :                     n->subLinkType = EXPR_SUBLINK;
 3217 tgl                     15067 GIC           9 :                     n->subLinkId = 0;
 3721                         15068               9 :                     n->testexpr = NULL;
                              15069               9 :                     n->operName = NIL;
 3721 tgl                     15070 GBC           9 :                     n->subselect = $1;
 3721 tgl                     15071 GIC           9 :                     n->location = @1;
  331 peter                   15072               9 :                     a->arg = (Node *) n;
 3721 tgl                     15073               9 :                     a->indirection = check_indirection($2, yyscanner);
  331 peter                   15074 GBC           9 :                     $$ = (Node *) a;
 3721 tgl                     15075 EUB             :                 }
                              15076                 :             | EXISTS select_with_parens
                              15077                 :                 {
  331 peter                   15078 GIC        4114 :                     SubLink    *n = makeNode(SubLink);
  331 peter                   15079 EUB             : 
 6766 tgl                     15080 GBC        4114 :                     n->subLinkType = EXISTS_SUBLINK;
 3217                         15081            4114 :                     n->subLinkId = 0;
 6311 tgl                     15082 GIC        4114 :                     n->testexpr = NULL;
 6766                         15083            4114 :                     n->operName = NIL;
                              15084            4114 :                     n->subselect = $2;
 5337                         15085            4114 :                     n->location = @1;
  331 peter                   15086            4114 :                     $$ = (Node *) n;
                              15087                 :                 }
                              15088                 :             | ARRAY select_with_parens
                              15089                 :                 {
                              15090            3918 :                     SubLink    *n = makeNode(SubLink);
                              15091                 : 
 6766 tgl                     15092            3918 :                     n->subLinkType = ARRAY_SUBLINK;
 3217 tgl                     15093 CBC        3918 :                     n->subLinkId = 0;
 6311                         15094            3918 :                     n->testexpr = NULL;
 6766 tgl                     15095 GIC        3918 :                     n->operName = NIL;
                              15096            3918 :                     n->subselect = $2;
 5337 tgl                     15097 CBC        3918 :                     n->location = @1;
  331 peter                   15098 GIC        3918 :                     $$ = (Node *) n;
 6766 tgl                     15099 ECB             :                 }
                              15100                 :             | ARRAY array_expr
 5337                         15101                 :                 {
 2238 peter_e                 15102 GIC        3412 :                     A_ArrayExpr *n = castNode(A_ArrayExpr, $2);
  331 peter                   15103 ECB             : 
                              15104                 :                     /* point outermost A_ArrayExpr to the ARRAY keyword */
 5337 tgl                     15105 CBC        3412 :                     n->location = @1;
  331 peter                   15106            3412 :                     $$ = (Node *) n;
 5337 tgl                     15107 ECB             :                 }
                              15108                 :             | explicit_row
                              15109                 :                 {
  331 peter                   15110 CBC        1832 :                     RowExpr    *r = makeNode(RowExpr);
                              15111                 : 
 2885 andres                  15112 GIC        1832 :                     r->args = $1;
                              15113            1832 :                     r->row_typeid = InvalidOid;  /* not analyzed yet */
 2885 andres                  15114 CBC        1832 :                     r->colnames = NIL;   /* to be filled in during analysis */
 2885 andres                  15115 GIC        1832 :                     r->row_format = COERCE_EXPLICIT_CALL; /* abuse */
 2885 andres                  15116 CBC        1832 :                     r->location = @1;
  331 peter                   15117 GIC        1832 :                     $$ = (Node *) r;
 2885 andres                  15118 ECB             :                 }
                              15119                 :             | implicit_row
 6766 tgl                     15120                 :                 {
  331 peter                   15121 GIC        3959 :                     RowExpr    *r = makeNode(RowExpr);
                              15122                 : 
 6766 tgl                     15123 CBC        3959 :                     r->args = $1;
 6766 tgl                     15124 GIC        3959 :                     r->row_typeid = InvalidOid;  /* not analyzed yet */
 4072                         15125            3959 :                     r->colnames = NIL;   /* to be filled in during analysis */
 2885 andres                  15126 CBC        3959 :                     r->row_format = COERCE_IMPLICIT_CAST; /* abuse */
 5337 tgl                     15127 GIC        3959 :                     r->location = @1;
  331 peter                   15128 CBC        3959 :                     $$ = (Node *) r;
                              15129                 :                 }
                              15130                 :             | GROUPING '(' expr_list ')'
 2885 andres                  15131 ECB             :               {
 2885 andres                  15132 GIC         157 :                   GroupingFunc *g = makeNode(GroupingFunc);
  331 peter                   15133 ECB             : 
 2885 andres                  15134 CBC         157 :                   g->args = $3;
                              15135             157 :                   g->location = @1;
  331 peter                   15136             157 :                   $$ = (Node *) g;
 2885 andres                  15137 ECB             :               }
 6766 tgl                     15138                 :         ;
                              15139                 : 
                              15140                 : func_application: func_name '(' ')'
                              15141                 :                 {
  886 tgl                     15142 GIC       61653 :                     $$ = (Node *) makeFuncCall($1, NIL,
                              15143                 :                                                COERCE_EXPLICIT_CALL,
                              15144           61653 :                                                @1);
                              15145                 :                 }
                              15146                 :             | func_name '(' func_arg_list opt_sort_clause ')'
                              15147                 :                 {
  331 peter                   15148          242684 :                     FuncCall   *n = makeFuncCall($1, $3,
                              15149                 :                                                  COERCE_EXPLICIT_CALL,
                              15150          242684 :                                                  @1);
                              15151                 : 
 3394 tgl                     15152          242684 :                     n->agg_order = $4;
  331 peter                   15153 CBC      242684 :                     $$ = (Node *) n;
 5380 tgl                     15154 ECB             :                 }
                              15155                 :             | func_name '(' VARIADIC func_arg_expr opt_sort_clause ')'
                              15156                 :                 {
  331 peter                   15157 CBC         269 :                     FuncCall   *n = makeFuncCall($1, list_make1($4),
  331 peter                   15158 ECB             :                                                  COERCE_EXPLICIT_CALL,
  331 peter                   15159 CBC         269 :                                                  @1);
  331 peter                   15160 ECB             : 
 2062 peter_e                 15161 CBC         269 :                     n->func_variadic = true;
 3394 tgl                     15162             269 :                     n->agg_order = $5;
  331 peter                   15163             269 :                     $$ = (Node *) n;
 5380 tgl                     15164 ECB             :                 }
                              15165                 :             | func_name '(' func_arg_list ',' VARIADIC func_arg_expr opt_sort_clause ')'
                              15166                 :                 {
  331 peter                   15167 GIC          60 :                     FuncCall   *n = makeFuncCall($1, lappend($3, $6),
  331 peter                   15168 ECB             :                                                  COERCE_EXPLICIT_CALL,
  331 peter                   15169 GIC          60 :                                                  @1);
  331 peter                   15170 ECB             : 
 2062 peter_e                 15171 CBC          60 :                     n->func_variadic = true;
 3394 tgl                     15172              60 :                     n->agg_order = $7;
  331 peter                   15173              60 :                     $$ = (Node *) n;
 4863 tgl                     15174 ECB             :                 }
 3572 rhaas                   15175                 :             | func_name '(' ALL func_arg_list opt_sort_clause ')'
 8450 tgl                     15176                 :                 {
  331 peter                   15177 UIC           0 :                     FuncCall   *n = makeFuncCall($1, $4,
                              15178                 :                                                  COERCE_EXPLICIT_CALL,
                              15179               0 :                                                  @1);
  331 peter                   15180 ECB             : 
 4863 tgl                     15181 UIC           0 :                     n->agg_order = $5;
 8450 tgl                     15182 ECB             :                     /* Ideally we'd mark the FuncCall node to indicate
                              15183                 :                      * "must be an aggregate", but there's no provision
                              15184                 :                      * for that in FuncCall at the moment.
                              15185                 :                      */
  331 peter                   15186 LBC           0 :                     $$ = (Node *) n;
 8450 tgl                     15187 ECB             :                 }
 3572 rhaas                   15188                 :             | func_name '(' DISTINCT func_arg_list opt_sort_clause ')'
                              15189                 :                 {
  331 peter                   15190 GIC         251 :                     FuncCall   *n = makeFuncCall($1, $4,
                              15191                 :                                                  COERCE_EXPLICIT_CALL,
  331 peter                   15192 CBC         251 :                                                  @1);
                              15193                 : 
 4863 tgl                     15194 GIC         251 :                     n->agg_order = $5;
 2062 peter_e                 15195 CBC         251 :                     n->agg_distinct = true;
  331 peter                   15196             251 :                     $$ = (Node *) n;
                              15197                 :                 }
                              15198                 :             | func_name '(' '*' ')'
                              15199                 :                 {
 8541 tgl                     15200 ECB             :                     /*
                              15201                 :                      * We consider AGGREGATE(*) to invoke a parameterless
 6100                         15202                 :                      * aggregate.  This does the right thing for COUNT(*),
 3641 peter_e                 15203                 :                      * and there are no other aggregates in SQL that accept
 8541 tgl                     15204                 :                      * '*' as parameter.
                              15205                 :                      *
 8521                         15206                 :                      * The FuncCall node is also marked agg_star = true,
                              15207                 :                      * so that later processing can detect what the argument
                              15208                 :                      * really was.
                              15209                 :                      */
  331 peter                   15210 GIC        5500 :                     FuncCall   *n = makeFuncCall($1, NIL,
  331 peter                   15211 ECB             :                                                  COERCE_EXPLICIT_CALL,
  331 peter                   15212 GIC        5500 :                                                  @1);
  331 peter                   15213 ECB             : 
 2062 peter_e                 15214 CBC        5500 :                     n->agg_star = true;
  331 peter                   15215            5500 :                     $$ = (Node *) n;
 8541 tgl                     15216 ECB             :                 }
 3437 peter_e                 15217                 :         ;
 3572 rhaas                   15218                 : 
                              15219                 : 
                              15220                 : /*
                              15221                 :  * func_expr and its cousin func_expr_windowless are split out from c_expr just
 3437 peter_e                 15222                 :  * so that we have classifications for "everything that is a function call or
                              15223                 :  * looks like one".  This isn't very important, but it saves us having to
 3426 tgl                     15224                 :  * document which variants are legal in places like "FROM function()" or the
                              15225                 :  * backwards-compatible functional-index syntax for CREATE INDEX.
 3572 rhaas                   15226                 :  * (Note that many of the special SQL functions wouldn't actually make any
                              15227                 :  * sense as functional index entries, but we ignore that consideration here.)
                              15228                 :  */
                              15229                 : func_expr: func_application within_group_clause filter_clause over_clause
                              15230                 :                 {
  331 peter                   15231 GIC      279933 :                     FuncCall   *n = (FuncCall *) $1;
  331 peter                   15232 ECB             : 
                              15233                 :                     /*
 3394 tgl                     15234                 :                      * The order clause for WITHIN GROUP and the one for
                              15235                 :                      * plain-aggregate ORDER BY share a field, so we have to
                              15236                 :                      * check here that at most one is present.  We also check
                              15237                 :                      * for DISTINCT and VARIADIC here to give a better error
                              15238                 :                      * location.  Other consistency checks are deferred to
                              15239                 :                      * parse analysis.
                              15240                 :                      */
 3394 tgl                     15241 GIC      279933 :                     if ($2 != NIL)
 3394 tgl                     15242 ECB             :                     {
 3394 tgl                     15243 CBC         174 :                         if (n->agg_order != NIL)
 3394 tgl                     15244 GIC           3 :                             ereport(ERROR,
                              15245                 :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              15246                 :                                      errmsg("cannot use multiple ORDER BY clauses with WITHIN GROUP"),
 3394 tgl                     15247 ECB             :                                      parser_errposition(@2)));
 3394 tgl                     15248 GIC         171 :                         if (n->agg_distinct)
 3394 tgl                     15249 LBC           0 :                             ereport(ERROR,
                              15250                 :                                     (errcode(ERRCODE_SYNTAX_ERROR),
 3394 tgl                     15251 ECB             :                                      errmsg("cannot use DISTINCT with WITHIN GROUP"),
                              15252                 :                                      parser_errposition(@2)));
 3394 tgl                     15253 CBC         171 :                         if (n->func_variadic)
 3394 tgl                     15254 UIC           0 :                             ereport(ERROR,
                              15255                 :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              15256                 :                                      errmsg("cannot use VARIADIC with WITHIN GROUP"),
 3394 tgl                     15257 ECB             :                                      parser_errposition(@2)));
 3394 tgl                     15258 GIC         171 :                         n->agg_order = $2;
 2062 peter_e                 15259 CBC         171 :                         n->agg_within_group = true;
                              15260                 :                     }
 3394 tgl                     15261          279930 :                     n->agg_filter = $3;
                              15262          279930 :                     n->over = $4;
                              15263          279930 :                     $$ = (Node *) n;
                              15264                 :                 }
                              15265                 :             | json_aggregate_func filter_clause over_clause
                              15266                 :                 {
   11 alvherre                15267 GNC         270 :                     JsonAggConstructor *n = IsA($1, JsonObjectAgg) ?
                              15268             135 :                         ((JsonObjectAgg *) $1)->constructor :
                              15269              75 :                         ((JsonArrayAgg *) $1)->constructor;
                              15270                 : 
                              15271             135 :                     n->agg_filter = $2;
                              15272             135 :                     n->over = $3;
                              15273             135 :                     $$ = (Node *) $1;
                              15274                 :                 }
                              15275                 :             | func_expr_common_subexpr
 3572 rhaas                   15276 GIC      217013 :                 { $$ = $1; }
 3572 rhaas                   15277 EUB             :         ;
                              15278                 : 
 3437 peter_e                 15279                 : /*
                              15280                 :  * As func_expr but does not accept WINDOW functions directly
 3365 tgl                     15281                 :  * (but they can still be contained in arguments for functions etc).
                              15282                 :  * Use this when window expressions are not allowed, where needed to
                              15283                 :  * disambiguate the grammar (e.g. in CREATE INDEX).
                              15284                 :  */
                              15285                 : func_expr_windowless:
 3572 rhaas                   15286 GBC       30232 :             func_application                        { $$ = $1; }
 3437 peter_e                 15287 GIC          72 :             | func_expr_common_subexpr              { $$ = $1; }
   11 alvherre                15288 UNC           0 :             | json_aggregate_func                   { $$ = $1; }
                              15289                 :         ;
                              15290                 : 
 3572 rhaas                   15291 ECB             : /*
                              15292                 :  * Special expressions that are considered to be functions.
                              15293                 :  */
                              15294                 : func_expr_common_subexpr:
                              15295                 :             COLLATION FOR '(' a_expr ')'
 4055 peter_e                 15296                 :                 {
 3569 rhaas                   15297 CBC          15 :                     $$ = (Node *) makeFuncCall(SystemFuncName("pg_collation_for"),
 3569 rhaas                   15298 GIC          15 :                                                list_make1($4),
                              15299                 :                                                COERCE_SQL_SYNTAX,
                              15300              15 :                                                @1);
                              15301                 :                 }
                              15302                 :             | CURRENT_DATE
                              15303                 :                 {
  139 michael                 15304 GNC         634 :                     $$ = (Node *) makeFuncCall(SystemFuncName("current_date"),
                              15305                 :                                                NIL,
                              15306                 :                                                COERCE_SQL_SYNTAX,
                              15307                 :                                                @1);
                              15308                 :                 }
                              15309                 :             | CURRENT_TIME
                              15310                 :                 {
                              15311              12 :                     $$ = (Node *) makeFuncCall(SystemFuncName("current_time"),
                              15312                 :                                                NIL,
                              15313                 :                                                COERCE_SQL_SYNTAX,
                              15314                 :                                                @1);
                              15315                 :                 }
                              15316                 :             | CURRENT_TIME '(' Iconst ')'
 9195 lockhart                15317 ECB             :                 {
  139 michael                 15318 GNC          12 :                     $$ = (Node *) makeFuncCall(SystemFuncName("current_time"),
                              15319              12 :                                                list_make1(makeIntConst($3, @3)),
                              15320                 :                                                COERCE_SQL_SYNTAX,
                              15321              12 :                                                @1);
 9195 lockhart                15322 ECB             :                 }
                              15323                 :             | CURRENT_TIMESTAMP
                              15324                 :                 {
  139 michael                 15325 GNC         139 :                     $$ = (Node *) makeFuncCall(SystemFuncName("current_timestamp"),
                              15326                 :                                                NIL,
                              15327                 :                                                COERCE_SQL_SYNTAX,
                              15328                 :                                                @1);
                              15329                 :                 }
                              15330                 :             | CURRENT_TIMESTAMP '(' Iconst ')'
                              15331                 :                 {
                              15332             318 :                     $$ = (Node *) makeFuncCall(SystemFuncName("current_timestamp"),
                              15333             318 :                                                list_make1(makeIntConst($3, @3)),
                              15334                 :                                                COERCE_SQL_SYNTAX,
                              15335             318 :                                                @1);
                              15336                 :                 }
                              15337                 :             | LOCALTIME
                              15338                 :                 {
                              15339              12 :                     $$ = (Node *) makeFuncCall(SystemFuncName("localtime"),
                              15340                 :                                                NIL,
                              15341                 :                                                COERCE_SQL_SYNTAX,
                              15342                 :                                                @1);
                              15343                 :                 }
                              15344                 :             | LOCALTIME '(' Iconst ')'
                              15345                 :                 {
                              15346              12 :                     $$ = (Node *) makeFuncCall(SystemFuncName("localtime"),
                              15347              12 :                                                list_make1(makeIntConst($3, @3)),
                              15348                 :                                                COERCE_SQL_SYNTAX,
                              15349              12 :                                                @1);
                              15350                 :                 }
                              15351                 :             | LOCALTIMESTAMP
                              15352                 :                 {
                              15353              18 :                     $$ = (Node *) makeFuncCall(SystemFuncName("localtimestamp"),
                              15354                 :                                                NIL,
                              15355                 :                                                COERCE_SQL_SYNTAX,
                              15356                 :                                                @1);
                              15357                 :                 }
                              15358                 :             | LOCALTIMESTAMP '(' Iconst ')'
                              15359                 :                 {
                              15360              12 :                     $$ = (Node *) makeFuncCall(SystemFuncName("localtimestamp"),
                              15361              12 :                                                list_make1(makeIntConst($3, @3)),
                              15362                 :                                                COERCE_SQL_SYNTAX,
                              15363              12 :                                                @1);
                              15364                 :                 }
                              15365                 :             | CURRENT_ROLE
                              15366                 :                 {
  140                         15367              34 :                     $$ = (Node *) makeFuncCall(SystemFuncName("current_role"),
                              15368                 :                                                NIL,
                              15369                 :                                                COERCE_SQL_SYNTAX,
                              15370                 :                                                @1);
                              15371                 :                 }
 7601 bruce                   15372 ECB             :             | CURRENT_USER
                              15373                 :                 {
  140 michael                 15374 GNC        1463 :                     $$ = (Node *) makeFuncCall(SystemFuncName("current_user"),
                              15375                 :                                                NIL,
                              15376                 :                                                COERCE_SQL_SYNTAX,
                              15377                 :                                                @1);
 9195 lockhart                15378 ECB             :                 }
                              15379                 :             | SESSION_USER
                              15380                 :                 {
  140 michael                 15381 GNC          53 :                     $$ = (Node *) makeFuncCall(SystemFuncName("session_user"),
                              15382                 :                                                NIL,
                              15383                 :                                                COERCE_SQL_SYNTAX,
                              15384                 :                                                @1);
                              15385                 :                 }
                              15386                 :             | SYSTEM_USER
                              15387                 :                 {
  192                         15388              12 :                     $$ = (Node *) makeFuncCall(SystemFuncName("system_user"),
                              15389                 :                                                NIL,
                              15390                 :                                                COERCE_SQL_SYNTAX,
                              15391                 :                                                @1);
  192 michael                 15392 ECB             :                 }
 7601 bruce                   15393 EUB             :             | USER
                              15394                 :                 {
  140 michael                 15395 GNC          12 :                     $$ = (Node *) makeFuncCall(SystemFuncName("user"),
                              15396                 :                                                NIL,
                              15397                 :                                                COERCE_SQL_SYNTAX,
                              15398                 :                                                @1);
                              15399                 :                 }
 5277 peter_e                 15400 ECB             :             | CURRENT_CATALOG
 5277 peter_e                 15401 EUB             :                 {
  140 michael                 15402 GNC          15 :                     $$ = (Node *) makeFuncCall(SystemFuncName("current_catalog"),
                              15403                 :                                                NIL,
                              15404                 :                                                COERCE_SQL_SYNTAX,
                              15405                 :                                                @1);
                              15406                 :                 }
                              15407                 :             | CURRENT_SCHEMA
 5277 peter_e                 15408 ECB             :                 {
  140 michael                 15409 GNC          15 :                     $$ = (Node *) makeFuncCall(SystemFuncName("current_schema"),
                              15410                 :                                                NIL,
                              15411                 :                                                COERCE_SQL_SYNTAX,
                              15412                 :                                                @1);
                              15413                 :                 }
 7584 lockhart                15414 ECB             :             | CAST '(' a_expr AS Typename ')'
 5337 tgl                     15415 CBC      201838 :                 { $$ = makeTypeCast($3, $5, @1); }
 7601 bruce                   15416 ECB             :             | EXTRACT '(' extract_list ')'
                              15417                 :                 {
  733 peter                   15418 GIC        1636 :                     $$ = (Node *) makeFuncCall(SystemFuncName("extract"),
  886 tgl                     15419            1636 :                                                $3,
  886 tgl                     15420 ECB             :                                                COERCE_SQL_SYNTAX,
  886 tgl                     15421 CBC        1636 :                                                @1);
 8541 tgl                     15422 ECB             :                 }
                              15423                 :             | NORMALIZE '(' a_expr ')'
 1109 peter                   15424                 :                 {
  886 tgl                     15425 CBC           9 :                     $$ = (Node *) makeFuncCall(SystemFuncName("normalize"),
                              15426               9 :                                                list_make1($3),
                              15427                 :                                                COERCE_SQL_SYNTAX,
  886 tgl                     15428 GIC           9 :                                                @1);
 1109 peter                   15429 ECB             :                 }
                              15430                 :             | NORMALIZE '(' a_expr ',' unicode_normal_form ')'
                              15431                 :                 {
  886 tgl                     15432 GIC          18 :                     $$ = (Node *) makeFuncCall(SystemFuncName("normalize"),
                              15433              18 :                                                list_make2($3, makeStringConst($5, @5)),
                              15434                 :                                                COERCE_SQL_SYNTAX,
                              15435              18 :                                                @1);
                              15436                 :                 }
                              15437                 :             | OVERLAY '(' overlay_list ')'
                              15438                 :                 {
  886 tgl                     15439 CBC          41 :                     $$ = (Node *) makeFuncCall(SystemFuncName("overlay"),
                              15440              41 :                                                $3,
  886 tgl                     15441 EUB             :                                                COERCE_SQL_SYNTAX,
  886 tgl                     15442 GIC          41 :                                                @1);
                              15443                 :                 }
                              15444                 :             | OVERLAY '(' func_arg_list_opt ')'
                              15445                 :                 {
                              15446                 :                     /*
                              15447                 :                      * allow functions named overlay() to be called without
                              15448                 :                      * special syntax
                              15449                 :                      */
  886 tgl                     15450 LBC           0 :                     $$ = (Node *) makeFuncCall(list_make1(makeString("overlay")),
                              15451               0 :                                                $3,
                              15452                 :                                                COERCE_EXPLICIT_CALL,
                              15453               0 :                                                @1);
                              15454                 :                 }
                              15455                 :             | POSITION '(' position_list ')'
                              15456                 :                 {
  886 tgl                     15457 ECB             :                     /*
                              15458                 :                      * position(A in B) is converted to position(B, A)
                              15459                 :                      *
                              15460                 :                      * We deliberately don't offer a "plain syntax" option
                              15461                 :                      * for position(), because the reversal of the arguments
                              15462                 :                      * creates too much risk of confusion.
                              15463                 :                      */
  886 tgl                     15464 CBC         440 :                     $$ = (Node *) makeFuncCall(SystemFuncName("position"),
  886 tgl                     15465 GIC         440 :                                                $3,
                              15466                 :                                                COERCE_SQL_SYNTAX,
                              15467             440 :                                                @1);
                              15468                 :                 }
                              15469                 :             | SUBSTRING '(' substr_list ')'
                              15470                 :                 {
 8195 peter_e                 15471 ECB             :                     /* substring(A from B for C) is converted to
 8162 lockhart                15472                 :                      * substring(A, B, C) - thomas 2000-11-28
                              15473                 :                      */
  886 tgl                     15474 CBC        1678 :                     $$ = (Node *) makeFuncCall(SystemFuncName("substring"),
  886 tgl                     15475 GIC        1678 :                                                $3,
                              15476                 :                                                COERCE_SQL_SYNTAX,
                              15477            1678 :                                                @1);
  886 tgl                     15478 ECB             :                 }
                              15479                 :             | SUBSTRING '(' func_arg_list_opt ')'
                              15480                 :                 {
                              15481                 :                     /*
                              15482                 :                      * allow functions named substring() to be called without
                              15483                 :                      * special syntax
                              15484                 :                      */
  886 tgl                     15485 CBC         359 :                     $$ = (Node *) makeFuncCall(list_make1(makeString("substring")),
                              15486             359 :                                                $3,
                              15487                 :                                                COERCE_EXPLICIT_CALL,
                              15488             359 :                                                @1);
                              15489                 :                 }
                              15490                 :             | TREAT '(' a_expr AS Typename ')'
                              15491                 :                 {
 7584 lockhart                15492 ECB             :                     /* TREAT(expr AS target) converts expr of a particular type to target,
                              15493                 :                      * which is defined to be a subtype of the original expression.
                              15494                 :                      * In SQL99, this is intended for use with structured UDTs,
                              15495                 :                      * but let's make this a generally useful form allowing stronger
                              15496                 :                      * coercions than are handled by implicit casting.
                              15497                 :                      *
                              15498                 :                      * Convert SystemTypeName() to SystemFuncName() even though
                              15499                 :                      * at the moment they result in the same thing.
                              15500                 :                      */
  857 peter                   15501 UIC           0 :                     $$ = (Node *) makeFuncCall(SystemFuncName(strVal(llast($5->names))),
  886 tgl                     15502 LBC           0 :                                                list_make1($3),
                              15503                 :                                                COERCE_EXPLICIT_CALL,
  886 tgl                     15504 UIC           0 :                                                @1);
                              15505                 :                 }
 7601 bruce                   15506 ECB             :             | TRIM '(' BOTH trim_list ')'
                              15507                 :                 {
                              15508                 :                     /* various trim expressions are defined in SQL
                              15509                 :                      * - thomas 1997-07-19
                              15510                 :                      */
  886 tgl                     15511 GIC           6 :                     $$ = (Node *) makeFuncCall(SystemFuncName("btrim"),
                              15512               6 :                                                $4,
  886 tgl                     15513 ECB             :                                                COERCE_SQL_SYNTAX,
  886 tgl                     15514 CBC           6 :                                                @1);
                              15515                 :                 }
 7601 bruce                   15516 ECB             :             | TRIM '(' LEADING trim_list ')'
                              15517                 :                 {
  886 tgl                     15518 GIC          12 :                     $$ = (Node *) makeFuncCall(SystemFuncName("ltrim"),
                              15519              12 :                                                $4,
  886 tgl                     15520 ECB             :                                                COERCE_SQL_SYNTAX,
  886 tgl                     15521 GIC          12 :                                                @1);
                              15522                 :                 }
                              15523                 :             | TRIM '(' TRAILING trim_list ')'
                              15524                 :                 {
                              15525             530 :                     $$ = (Node *) makeFuncCall(SystemFuncName("rtrim"),
                              15526             530 :                                                $4,
  886 tgl                     15527 ECB             :                                                COERCE_SQL_SYNTAX,
  886 tgl                     15528 GIC         530 :                                                @1);
                              15529                 :                 }
                              15530                 :             | TRIM '(' trim_list ')'
                              15531                 :                 {
                              15532              49 :                     $$ = (Node *) makeFuncCall(SystemFuncName("btrim"),
                              15533              49 :                                                $3,
  886 tgl                     15534 ECB             :                                                COERCE_SQL_SYNTAX,
  886 tgl                     15535 GIC          49 :                                                @1);
                              15536                 :                 }
                              15537                 :             | NULLIF '(' a_expr ',' a_expr ')'
                              15538                 :                 {
 6235                         15539             400 :                     $$ = (Node *) makeSimpleA_Expr(AEXPR_NULLIF, "=", $3, $5, @1);
                              15540                 :                 }
 6765 tgl                     15541 ECB             :             | COALESCE '(' expr_list ')'
                              15542                 :                 {
 6765 tgl                     15543 GIC        6385 :                     CoalesceExpr *c = makeNode(CoalesceExpr);
                              15544                 : 
                              15545            6385 :                     c->args = $3;
 5337                         15546            6385 :                     c->location = @1;
  331 peter                   15547            6385 :                     $$ = (Node *) c;
 6765 tgl                     15548 ECB             :                 }
                              15549                 :             | GREATEST '(' expr_list ')'
                              15550                 :                 {
 6496 tgl                     15551 GIC          80 :                     MinMaxExpr *v = makeNode(MinMaxExpr);
                              15552                 : 
                              15553              80 :                     v->args = $3;
                              15554              80 :                     v->op = IS_GREATEST;
 5337 tgl                     15555 CBC          80 :                     v->location = @1;
  331 peter                   15556 GIC          80 :                     $$ = (Node *) v;
                              15557                 :                 }
                              15558                 :             | LEAST '(' expr_list ')'
                              15559                 :                 {
 6496 tgl                     15560              71 :                     MinMaxExpr *v = makeNode(MinMaxExpr);
                              15561                 : 
 6496 tgl                     15562 CBC          71 :                     v->args = $3;
 6496 tgl                     15563 GIC          71 :                     v->op = IS_LEAST;
 5337                         15564              71 :                     v->location = @1;
  331 peter                   15565              71 :                     $$ = (Node *) v;
                              15566                 :                 }
                              15567                 :             | XMLCONCAT '(' expr_list ')'
 5944 tgl                     15568 ECB             :                 {
 5337 tgl                     15569 GIC          31 :                     $$ = makeXmlExpr(IS_XMLCONCAT, NULL, NIL, $3, @1);
                              15570                 :                 }
 5950 tgl                     15571 ECB             :             | XMLELEMENT '(' NAME_P ColLabel ')'
 5953 peter_e                 15572                 :                 {
 5337 tgl                     15573 GIC           3 :                     $$ = makeXmlExpr(IS_XMLELEMENT, $4, NIL, NIL, @1);
 5953 peter_e                 15574 ECB             :                 }
                              15575                 :             | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ')'
                              15576                 :                 {
 5337 tgl                     15577 GIC          18 :                     $$ = makeXmlExpr(IS_XMLELEMENT, $4, $6, NIL, @1);
 5953 peter_e                 15578 ECB             :                 }
 5950 tgl                     15579                 :             | XMLELEMENT '(' NAME_P ColLabel ',' expr_list ')'
                              15580                 :                 {
 5337 tgl                     15581 CBC          58 :                     $$ = makeXmlExpr(IS_XMLELEMENT, $4, NIL, $6, @1);
                              15582                 :                 }
                              15583                 :             | XMLELEMENT '(' NAME_P ColLabel ',' xml_attributes ',' expr_list ')'
                              15584                 :                 {
                              15585              10 :                     $$ = makeXmlExpr(IS_XMLELEMENT, $4, $6, $8, @1);
 5953 peter_e                 15586 ECB             :                 }
                              15587                 :             | XMLEXISTS '(' c_expr xmlexists_argument ')'
 4630                         15588                 :                 {
                              15589                 :                     /* xmlexists(A PASSING [BY REF] B [BY REF]) is
                              15590                 :                      * converted to xmlexists(A, B)*/
  886 tgl                     15591 GIC          27 :                     $$ = (Node *) makeFuncCall(SystemFuncName("xmlexists"),
  886 tgl                     15592 CBC          27 :                                                list_make2($3, $4),
  886 tgl                     15593 ECB             :                                                COERCE_SQL_SYNTAX,
  886 tgl                     15594 GIC          27 :                                                @1);
 4630 peter_e                 15595 ECB             :                 }
                              15596                 :             | XMLFOREST '(' xml_attribute_list ')'
                              15597                 :                 {
 5337 tgl                     15598 GIC          16 :                     $$ = makeXmlExpr(IS_XMLFOREST, NULL, $3, NIL, @1);
                              15599                 :                 }
                              15600                 :             | XMLPARSE '(' document_or_content a_expr xml_whitespace_option ')'
                              15601                 :                 {
                              15602                 :                     XmlExpr *x = (XmlExpr *)
 5337 tgl                     15603 GBC          70 :                         makeXmlExpr(IS_XMLPARSE, NULL, NIL,
                              15604              70 :                                     list_make2($4, makeBoolAConst($5, -1)),
 5337 tgl                     15605 GIC          70 :                                     @1);
  331 peter                   15606 EUB             : 
 5909 peter_e                 15607 GIC          70 :                     x->xmloption = $3;
  331 peter                   15608              70 :                     $$ = (Node *) x;
                              15609                 :                 }
                              15610                 :             | XMLPI '(' NAME_P ColLabel ')'
                              15611                 :                 {
 5337 tgl                     15612              15 :                     $$ = makeXmlExpr(IS_XMLPI, $4, NULL, NIL, @1);
                              15613                 :                 }
                              15614                 :             | XMLPI '(' NAME_P ColLabel ',' a_expr ')'
                              15615                 :                 {
                              15616              25 :                     $$ = makeXmlExpr(IS_XMLPI, $4, NULL, list_make1($6), @1);
 5953 peter_e                 15617 ECB             :                 }
                              15618                 :             | XMLROOT '(' a_expr ',' xml_root_version opt_xml_root_standalone ')'
                              15619                 :                 {
 5950 tgl                     15620 CBC          34 :                     $$ = makeXmlExpr(IS_XMLROOT, NULL, NIL,
 5337 tgl                     15621 GIC          34 :                                      list_make3($3, $5, $6), @1);
                              15622                 :                 }
                              15623                 :             | XMLSERIALIZE '(' document_or_content a_expr AS SimpleTypename xml_indent_option ')'
                              15624                 :                 {
 5909 peter_e                 15625              95 :                     XmlSerialize *n = makeNode(XmlSerialize);
                              15626                 : 
 5909 peter_e                 15627 CBC          95 :                     n->xmloption = $3;
                              15628              95 :                     n->expr = $4;
 5015 peter_e                 15629 GIC          95 :                     n->typeName = $6;
   25 tgl                     15630 GNC          95 :                     n->indent = $7;
 5337                         15631              95 :                     n->location = @1;
  331 peter                   15632              95 :                     $$ = (Node *) n;
                              15633                 :                 }
                              15634                 :             | JSON_OBJECT '(' func_arg_list ')'
                              15635                 :                 {
                              15636                 :                     /* Support for legacy (non-standard) json_object() */
   11 alvherre                15637              45 :                     $$ = (Node *) makeFuncCall(SystemFuncName("json_object"),
                              15638              45 :                                                $3, COERCE_EXPLICIT_CALL, @1);
                              15639                 :                 }
                              15640                 :             | JSON_OBJECT '(' json_name_and_value_list
                              15641                 :                 json_object_constructor_null_clause_opt
                              15642                 :                 json_key_uniqueness_constraint_opt
                              15643                 :                 json_output_clause_opt ')'
                              15644                 :                 {
                              15645             141 :                     JsonObjectConstructor *n = makeNode(JsonObjectConstructor);
                              15646                 : 
                              15647             141 :                     n->exprs = $3;
                              15648             141 :                     n->absent_on_null = $4;
                              15649             141 :                     n->unique = $5;
                              15650             141 :                     n->output = (JsonOutput *) $6;
                              15651             141 :                     n->location = @1;
                              15652             141 :                     $$ = (Node *) n;
                              15653                 :                 }
                              15654                 :             | JSON_OBJECT '(' json_output_clause_opt ')'
                              15655                 :                 {
                              15656              41 :                     JsonObjectConstructor *n = makeNode(JsonObjectConstructor);
                              15657                 : 
                              15658              41 :                     n->exprs = NULL;
                              15659              41 :                     n->absent_on_null = false;
                              15660              41 :                     n->unique = false;
                              15661              41 :                     n->output = (JsonOutput *) $3;
                              15662              41 :                     n->location = @1;
                              15663              41 :                     $$ = (Node *) n;
                              15664                 :                 }
                              15665                 :             | JSON_ARRAY '('
                              15666                 :                 json_value_expr_list
                              15667                 :                 json_array_constructor_null_clause_opt
                              15668                 :                 json_output_clause_opt
                              15669                 :             ')'
                              15670                 :                 {
                              15671              48 :                     JsonArrayConstructor *n = makeNode(JsonArrayConstructor);
                              15672                 : 
                              15673              48 :                     n->exprs = $3;
                              15674              48 :                     n->absent_on_null = $4;
                              15675              48 :                     n->output = (JsonOutput *) $5;
                              15676              48 :                     n->location = @1;
                              15677              48 :                     $$ = (Node *) n;
                              15678                 :                 }
                              15679                 :             | JSON_ARRAY '('
                              15680                 :                 select_no_parens
                              15681                 :                 json_format_clause_opt
                              15682                 :                 /* json_array_constructor_null_clause_opt */
                              15683                 :                 json_output_clause_opt
                              15684                 :             ')'
                              15685                 :                 {
                              15686              27 :                     JsonArrayQueryConstructor *n = makeNode(JsonArrayQueryConstructor);
                              15687                 : 
                              15688              27 :                     n->query = $3;
                              15689              27 :                     n->format = (JsonFormat *) $4;
                              15690              27 :                     n->absent_on_null = true;    /* XXX */
                              15691              27 :                     n->output = (JsonOutput *) $5;
                              15692              27 :                     n->location = @1;
                              15693              27 :                     $$ = (Node *) n;
                              15694                 :                 }
                              15695                 :             | JSON_ARRAY '('
                              15696                 :                 json_output_clause_opt
                              15697                 :             ')'
                              15698                 :                 {
                              15699              41 :                     JsonArrayConstructor *n = makeNode(JsonArrayConstructor);
                              15700                 : 
                              15701              41 :                     n->exprs = NIL;
                              15702              41 :                     n->absent_on_null = true;
                              15703              41 :                     n->output = (JsonOutput *) $3;
   11 alvherre                15704 CBC          41 :                     n->location = @1;
   11 alvherre                15705 GIC          41 :                     $$ = (Node *) n;
                              15706                 :                 }
                              15707                 :         ;
                              15708                 : 
                              15709                 : /*
                              15710                 :  * SQL/XML support
                              15711                 :  */
 5950 tgl                     15712 ECB             : xml_root_version: VERSION_P a_expr
 5950 tgl                     15713 CBC          12 :                 { $$ = $2; }
                              15714                 :             | VERSION_P NO VALUE_P
 5337                         15715              22 :                 { $$ = makeNullAConst(-1); }
                              15716                 :         ;
                              15717                 : 
                              15718                 : opt_xml_root_standalone: ',' STANDALONE_P YES_P
 5337 tgl                     15719 GIC          13 :                 { $$ = makeIntConst(XML_STANDALONE_YES, -1); }
                              15720                 :             | ',' STANDALONE_P NO
                              15721               6 :                 { $$ = makeIntConst(XML_STANDALONE_NO, -1); }
                              15722                 :             | ',' STANDALONE_P NO VALUE_P
                              15723               6 :                 { $$ = makeIntConst(XML_STANDALONE_NO_VALUE, -1); }
                              15724                 :             | /*EMPTY*/
                              15725               9 :                 { $$ = makeIntConst(XML_STANDALONE_OMITTED, -1); }
                              15726                 :         ;
                              15727                 : 
 5950 tgl                     15728 GBC          28 : xml_attributes: XMLATTRIBUTES '(' xml_attribute_list ')'    { $$ = $3; }
 5953 peter_e                 15729 EUB             :         ;
                              15730                 : 
 5953 peter_e                 15731 GBC          44 : xml_attribute_list: xml_attribute_el                    { $$ = list_make1($1); }
 5953 peter_e                 15732 GIC          72 :             | xml_attribute_list ',' xml_attribute_el   { $$ = lappend($1, $3); }
                              15733                 :         ;
                              15734                 : 
                              15735                 : xml_attribute_el: a_expr AS ColLabel
                              15736                 :                 {
                              15737              53 :                     $$ = makeNode(ResTarget);
 5953 peter_e                 15738 CBC          53 :                     $$->name = $3;
 5335 tgl                     15739              53 :                     $$->indirection = NIL;
 5953 peter_e                 15740 GIC          53 :                     $$->val = (Node *) $1;
 5950 tgl                     15741 CBC          53 :                     $$->location = @1;
                              15742                 :                 }
                              15743                 :             | a_expr
                              15744                 :                 {
 5953 peter_e                 15745              63 :                     $$ = makeNode(ResTarget);
                              15746              63 :                     $$->name = NULL;
 5335 tgl                     15747 GIC          63 :                     $$->indirection = NIL;
 5944 tgl                     15748 CBC          63 :                     $$->val = (Node *) $1;
 5950 tgl                     15749 GIC          63 :                     $$->location = @1;
                              15750                 :                 }
                              15751                 :         ;
 5953 peter_e                 15752 ECB             : 
 5909 peter_e                 15753 CBC          81 : document_or_content: DOCUMENT_P                     { $$ = XMLOPTION_DOCUMENT; }
 5909 peter_e                 15754 GIC          90 :             | CONTENT_P                             { $$ = XMLOPTION_CONTENT; }
 5953 peter_e                 15755 ECB             :         ;
                              15756                 : 
   25 tgl                     15757 GNC          60 : xml_indent_option: INDENT                           { $$ = true; }
                              15758              12 :             | NO INDENT                             { $$ = false; }
                              15759              23 :             | /*EMPTY*/                             { $$ = false; }
                              15760                 :         ;
                              15761                 : 
 2062 peter_e                 15762 UIC           0 : xml_whitespace_option: PRESERVE WHITESPACE_P        { $$ = true; }
 2062 peter_e                 15763 GIC           1 :             | STRIP_P WHITESPACE_P                  { $$ = false; }
 2062 peter_e                 15764 CBC          69 :             | /*EMPTY*/                             { $$ = false; }
 9195 lockhart                15765 ECB             :         ;
                              15766                 : 
 4630 peter_e                 15767                 : /* We allow several variants for SQL and other compatibility. */
                              15768                 : xmlexists_argument:
                              15769                 :             PASSING c_expr
                              15770                 :                 {
 4630 peter_e                 15771 CBC         110 :                     $$ = $2;
                              15772                 :                 }
                              15773                 :             | PASSING c_expr xml_passing_mech
                              15774                 :                 {
 4630 peter_e                 15775 LBC           0 :                     $$ = $2;
                              15776                 :                 }
 1494 alvherre                15777 ECB             :             | PASSING xml_passing_mech c_expr
 4630 peter_e                 15778                 :                 {
 1494 alvherre                15779 CBC          21 :                     $$ = $3;
                              15780                 :                 }
                              15781                 :             | PASSING xml_passing_mech c_expr xml_passing_mech
                              15782                 :                 {
                              15783               3 :                     $$ = $3;
                              15784                 :                 }
 4630 peter_e                 15785 ECB             :         ;
                              15786                 : 
 1494 alvherre                15787                 : xml_passing_mech:
  175 tgl                     15788                 :             BY REF_P
                              15789                 :             | BY VALUE_P
                              15790                 :         ;
                              15791                 : 
 4630 peter_e                 15792                 : 
                              15793                 : /*
 3394 tgl                     15794                 :  * Aggregate decoration clauses
                              15795                 :  */
                              15796                 : within_group_clause:
 3394 tgl                     15797 CBC         174 :             WITHIN GROUP_P '(' sort_clause ')'      { $$ = $4; }
 3394 tgl                     15798 GIC      279762 :             | /*EMPTY*/                             { $$ = NIL; }
                              15799                 :         ;
                              15800                 : 
 3394 tgl                     15801 ECB             : filter_clause:
 3394 tgl                     15802 GIC         360 :             FILTER '(' WHERE a_expr ')'             { $$ = $4; }
                              15803          279711 :             | /*EMPTY*/                             { $$ = NULL; }
                              15804                 :         ;
 3394 tgl                     15805 ECB             : 
                              15806                 : 
                              15807                 : /*
                              15808                 :  * Window Definitions
 5215                         15809                 :  */
                              15810                 : window_clause:
 5215 tgl                     15811 GIC         189 :             WINDOW window_definition_list           { $$ = $2; }
                              15812          268275 :             | /*EMPTY*/                             { $$ = NIL; }
 5215 tgl                     15813 ECB             :         ;
                              15814                 : 
                              15815                 : window_definition_list:
 5215 tgl                     15816 GIC         189 :             window_definition                       { $$ = list_make1($1); }
 5215 tgl                     15817 ECB             :             | window_definition_list ',' window_definition
 5215 tgl                     15818 GIC           6 :                                                     { $$ = lappend($1, $3); }
                              15819                 :         ;
                              15820                 : 
                              15821                 : window_definition:
                              15822                 :             ColId AS window_specification
 5215 tgl                     15823 ECB             :                 {
  331 peter                   15824 CBC         195 :                     WindowDef  *n = $3;
                              15825                 : 
 5215 tgl                     15826             195 :                     n->name = $1;
 5215 tgl                     15827 GIC         195 :                     $$ = n;
                              15828                 :                 }
                              15829                 :         ;
 5215 tgl                     15830 ECB             : 
                              15831                 : over_clause: OVER window_specification
 5215 tgl                     15832 GIC        1419 :                 { $$ = $2; }
                              15833                 :             | OVER ColId
                              15834                 :                 {
  331 peter                   15835 CBC         321 :                     WindowDef  *n = makeNode(WindowDef);
  331 peter                   15836 ECB             : 
 5212 tgl                     15837 CBC         321 :                     n->name = $2;
 5212 tgl                     15838 GIC         321 :                     n->refname = NULL;
 5215 tgl                     15839 CBC         321 :                     n->partitionClause = NIL;
                              15840             321 :                     n->orderClause = NIL;
 5212 tgl                     15841 GIC         321 :                     n->frameOptions = FRAMEOPTION_DEFAULTS;
 4804                         15842             321 :                     n->startOffset = NULL;
                              15843             321 :                     n->endOffset = NULL;
 5215 tgl                     15844 CBC         321 :                     n->location = @2;
 5215 tgl                     15845 GIC         321 :                     $$ = n;
                              15846                 :                 }
                              15847                 :             | /*EMPTY*/
 5215 tgl                     15848 CBC      278328 :                 { $$ = NULL; }
                              15849                 :         ;
                              15850                 : 
                              15851                 : window_specification: '(' opt_existing_window_name opt_partition_clause
 5212 tgl                     15852 ECB             :                         opt_sort_clause opt_frame_clause ')'
 5215                         15853                 :                 {
  331 peter                   15854 GIC        1614 :                     WindowDef  *n = makeNode(WindowDef);
                              15855                 : 
 5215 tgl                     15856            1614 :                     n->name = NULL;
 5215 tgl                     15857 CBC        1614 :                     n->refname = $2;
 5215 tgl                     15858 GIC        1614 :                     n->partitionClause = $3;
 5215 tgl                     15859 CBC        1614 :                     n->orderClause = $4;
 4804 tgl                     15860 ECB             :                     /* copy relevant fields of opt_frame_clause */
 4804 tgl                     15861 CBC        1614 :                     n->frameOptions = $5->frameOptions;
                              15862            1614 :                     n->startOffset = $5->startOffset;
                              15863            1614 :                     n->endOffset = $5->endOffset;
 5215                         15864            1614 :                     n->location = @1;
 5215 tgl                     15865 GIC        1614 :                     $$ = n;
                              15866                 :                 }
                              15867                 :         ;
                              15868                 : 
 5215 tgl                     15869 ECB             : /*
 1887                         15870                 :  * If we see PARTITION, RANGE, ROWS or GROUPS as the first token after the '('
                              15871                 :  * of a window_specification, we want the assumption to be that there is
                              15872                 :  * no existing_window_name; but those keywords are unreserved and so could
                              15873                 :  * be ColIds.  We fix this by making them have the same precedence as IDENT
                              15874                 :  * and giving the empty production here a slightly higher precedence, so
                              15875                 :  * that the shift/reduce conflict is resolved in favor of reducing the rule.
                              15876                 :  * These keywords are thus precluded from being an existing_window_name but
 5215                         15877                 :  * are not reserved for any other purpose.
                              15878                 :  */
 5215 tgl                     15879 CBC          15 : opt_existing_window_name: ColId                     { $$ = $1; }
                              15880            1602 :             | /*EMPTY*/             %prec Op        { $$ = NULL; }
 5215 tgl                     15881 ECB             :         ;
                              15882                 : 
 5215 tgl                     15883 CBC         672 : opt_partition_clause: PARTITION BY expr_list        { $$ = $3; }
                              15884             942 :             | /*EMPTY*/                             { $$ = NIL; }
                              15885                 :         ;
                              15886                 : 
                              15887                 : /*
 4804 tgl                     15888 ECB             :  * For frame clauses, we return a WindowDef, but only some fields are used:
                              15889                 :  * frameOptions, startOffset, and endOffset.
 5212                         15890                 :  */
                              15891                 : opt_frame_clause:
 1887                         15892                 :             RANGE frame_extent opt_window_exclusion_clause
 5212                         15893                 :                 {
  331 peter                   15894 CBC         320 :                     WindowDef  *n = $2;
  331 peter                   15895 ECB             : 
 4804 tgl                     15896 GIC         320 :                     n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_RANGE;
 1887                         15897             320 :                     n->frameOptions |= $3;
 4804                         15898             320 :                     $$ = n;
                              15899                 :                 }
                              15900                 :             | ROWS frame_extent opt_window_exclusion_clause
                              15901                 :                 {
  331 peter                   15902             285 :                     WindowDef  *n = $2;
  331 peter                   15903 ECB             : 
 4804 tgl                     15904 GIC         285 :                     n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_ROWS;
 1887 tgl                     15905 CBC         285 :                     n->frameOptions |= $3;
                              15906             285 :                     $$ = n;
 1887 tgl                     15907 ECB             :                 }
                              15908                 :             | GROUPS frame_extent opt_window_exclusion_clause
                              15909                 :                 {
  331 peter                   15910 GIC         102 :                     WindowDef  *n = $2;
                              15911                 : 
 1887 tgl                     15912             102 :                     n->frameOptions |= FRAMEOPTION_NONDEFAULT | FRAMEOPTION_GROUPS;
                              15913             102 :                     n->frameOptions |= $3;
 4804                         15914             102 :                     $$ = n;
                              15915                 :                 }
                              15916                 :             | /*EMPTY*/
                              15917                 :                 {
  331 peter                   15918 CBC         907 :                     WindowDef  *n = makeNode(WindowDef);
                              15919                 : 
 4804 tgl                     15920             907 :                     n->frameOptions = FRAMEOPTION_DEFAULTS;
                              15921             907 :                     n->startOffset = NULL;
                              15922             907 :                     n->endOffset = NULL;
                              15923             907 :                     $$ = n;
 4804 tgl                     15924 ECB             :                 }
 5212                         15925                 :         ;
                              15926                 : 
                              15927                 : frame_extent: frame_bound
                              15928                 :                 {
  331 peter                   15929 GIC           3 :                     WindowDef  *n = $1;
                              15930                 : 
 5212 tgl                     15931 ECB             :                     /* reject invalid cases */
 4804 tgl                     15932 GIC           3 :                     if (n->frameOptions & FRAMEOPTION_START_UNBOUNDED_FOLLOWING)
 5212 tgl                     15933 LBC           0 :                         ereport(ERROR,
 5212 tgl                     15934 ECB             :                                 (errcode(ERRCODE_WINDOWING_ERROR),
                              15935                 :                                  errmsg("frame start cannot be UNBOUNDED FOLLOWING"),
 5018                         15936                 :                                  parser_errposition(@1)));
 1887 tgl                     15937 CBC           3 :                     if (n->frameOptions & FRAMEOPTION_START_OFFSET_FOLLOWING)
 5212 tgl                     15938 UIC           0 :                         ereport(ERROR,
                              15939                 :                                 (errcode(ERRCODE_WINDOWING_ERROR),
                              15940                 :                                  errmsg("frame starting from following row cannot end with current row"),
                              15941                 :                                  parser_errposition(@1)));
 4804 tgl                     15942 GIC           3 :                     n->frameOptions |= FRAMEOPTION_END_CURRENT_ROW;
                              15943               3 :                     $$ = n;
                              15944                 :                 }
 5212 tgl                     15945 ECB             :             | BETWEEN frame_bound AND frame_bound
                              15946                 :                 {
  331 peter                   15947 CBC         704 :                     WindowDef  *n1 = $2;
  331 peter                   15948 GIC         704 :                     WindowDef  *n2 = $4;
                              15949                 : 
                              15950                 :                     /* form merged options */
 4804 tgl                     15951 CBC         704 :                     int     frameOptions = n1->frameOptions;
                              15952                 :                     /* shift converts START_ options to END_ options */
                              15953             704 :                     frameOptions |= n2->frameOptions << 1;
 4804 tgl                     15954 GIC         704 :                     frameOptions |= FRAMEOPTION_BETWEEN;
 5212 tgl                     15955 ECB             :                     /* reject invalid cases */
 4804 tgl                     15956 GIC         704 :                     if (frameOptions & FRAMEOPTION_START_UNBOUNDED_FOLLOWING)
 5212 tgl                     15957 LBC           0 :                         ereport(ERROR,
                              15958                 :                                 (errcode(ERRCODE_WINDOWING_ERROR),
                              15959                 :                                  errmsg("frame start cannot be UNBOUNDED FOLLOWING"),
 5018 tgl                     15960 ECB             :                                  parser_errposition(@2)));
 4804 tgl                     15961 GIC         704 :                     if (frameOptions & FRAMEOPTION_END_UNBOUNDED_PRECEDING)
 5212 tgl                     15962 UIC           0 :                         ereport(ERROR,
 5212 tgl                     15963 ECB             :                                 (errcode(ERRCODE_WINDOWING_ERROR),
                              15964                 :                                  errmsg("frame end cannot be UNBOUNDED PRECEDING"),
                              15965                 :                                  parser_errposition(@4)));
 4804 tgl                     15966 GIC         704 :                     if ((frameOptions & FRAMEOPTION_START_CURRENT_ROW) &&
 1887                         15967             218 :                         (frameOptions & FRAMEOPTION_END_OFFSET_PRECEDING))
 4804 tgl                     15968 UIC           0 :                         ereport(ERROR,
 4804 tgl                     15969 ECB             :                                 (errcode(ERRCODE_WINDOWING_ERROR),
                              15970                 :                                  errmsg("frame starting from current row cannot have preceding rows"),
                              15971                 :                                  parser_errposition(@4)));
 1887 tgl                     15972 CBC         704 :                     if ((frameOptions & FRAMEOPTION_START_OFFSET_FOLLOWING) &&
                              15973              54 :                         (frameOptions & (FRAMEOPTION_END_OFFSET_PRECEDING |
                              15974                 :                                          FRAMEOPTION_END_CURRENT_ROW)))
 4804 tgl                     15975 UIC           0 :                         ereport(ERROR,
                              15976                 :                                 (errcode(ERRCODE_WINDOWING_ERROR),
 4804 tgl                     15977 ECB             :                                  errmsg("frame starting from following row cannot have preceding rows"),
                              15978                 :                                  parser_errposition(@4)));
 4804 tgl                     15979 CBC         704 :                     n1->frameOptions = frameOptions;
                              15980             704 :                     n1->endOffset = n2->startOffset;
                              15981             704 :                     $$ = n1;
                              15982                 :                 }
                              15983                 :         ;
                              15984                 : 
 5212 tgl                     15985 ECB             : /*
                              15986                 :  * This is used for both frame start and frame end, with output set up on
                              15987                 :  * the assumption it's frame start; the frame_extent productions must reject
                              15988                 :  * invalid cases.
                              15989                 :  */
                              15990                 : frame_bound:
                              15991                 :             UNBOUNDED PRECEDING
                              15992                 :                 {
  331 peter                   15993 GIC          90 :                     WindowDef  *n = makeNode(WindowDef);
  331 peter                   15994 EUB             : 
 4804 tgl                     15995 CBC          90 :                     n->frameOptions = FRAMEOPTION_START_UNBOUNDED_PRECEDING;
                              15996              90 :                     n->startOffset = NULL;
 4804 tgl                     15997 GIC          90 :                     n->endOffset = NULL;
                              15998              90 :                     $$ = n;
                              15999                 :                 }
                              16000                 :             | UNBOUNDED FOLLOWING
                              16001                 :                 {
  331 peter                   16002             182 :                     WindowDef  *n = makeNode(WindowDef);
  331 peter                   16003 ECB             : 
 4804 tgl                     16004 GIC         182 :                     n->frameOptions = FRAMEOPTION_START_UNBOUNDED_FOLLOWING;
                              16005             182 :                     n->startOffset = NULL;
                              16006             182 :                     n->endOffset = NULL;
 4804 tgl                     16007 GBC         182 :                     $$ = n;
                              16008                 :                 }
                              16009                 :             | CURRENT_P ROW
                              16010                 :                 {
  331 peter                   16011 CBC         284 :                     WindowDef  *n = makeNode(WindowDef);
                              16012                 : 
 4804 tgl                     16013 GIC         284 :                     n->frameOptions = FRAMEOPTION_START_CURRENT_ROW;
                              16014             284 :                     n->startOffset = NULL;
 4804 tgl                     16015 CBC         284 :                     n->endOffset = NULL;
 4804 tgl                     16016 GIC         284 :                     $$ = n;
                              16017                 :                 }
                              16018                 :             | a_expr PRECEDING
                              16019                 :                 {
  331 peter                   16020             384 :                     WindowDef  *n = makeNode(WindowDef);
                              16021                 : 
 1887 tgl                     16022             384 :                     n->frameOptions = FRAMEOPTION_START_OFFSET_PRECEDING;
 4804                         16023             384 :                     n->startOffset = $1;
                              16024             384 :                     n->endOffset = NULL;
                              16025             384 :                     $$ = n;
                              16026                 :                 }
                              16027                 :             | a_expr FOLLOWING
                              16028                 :                 {
  331 peter                   16029 CBC         471 :                     WindowDef  *n = makeNode(WindowDef);
  331 peter                   16030 ECB             : 
 1887 tgl                     16031 GIC         471 :                     n->frameOptions = FRAMEOPTION_START_OFFSET_FOLLOWING;
 4804                         16032             471 :                     n->startOffset = $1;
                              16033             471 :                     n->endOffset = NULL;
 4804 tgl                     16034 CBC         471 :                     $$ = n;
 5212 tgl                     16035 ECB             :                 }
                              16036                 :         ;
                              16037                 : 
                              16038                 : opt_window_exclusion_clause:
 1887 tgl                     16039 GIC          42 :             EXCLUDE CURRENT_P ROW   { $$ = FRAMEOPTION_EXCLUDE_CURRENT_ROW; }
                              16040              48 :             | EXCLUDE GROUP_P       { $$ = FRAMEOPTION_EXCLUDE_GROUP; }
                              16041              75 :             | EXCLUDE TIES          { $$ = FRAMEOPTION_EXCLUDE_TIES; }
                              16042               9 :             | EXCLUDE NO OTHERS     { $$ = 0; }
 1887 tgl                     16043 CBC         533 :             | /*EMPTY*/             { $$ = 0; }
 1887 tgl                     16044 ECB             :         ;
                              16045                 : 
                              16046                 : 
                              16047                 : /*
 8541                         16048                 :  * Supporting nonterminals for expressions.
                              16049                 :  */
                              16050                 : 
                              16051                 : /* Explicit row production.
                              16052                 :  *
                              16053                 :  * SQL99 allows an optional ROW keyword, so we can now do single-element rows
                              16054                 :  * without conflicting with the parenthesized a_expr production.  Without the
                              16055                 :  * ROW keyword, there must be more than one a_expr inside the parens.
 6908                         16056                 :  */
 6908 tgl                     16057 UIC           0 : row:        ROW '(' expr_list ')'                   { $$ = $3; }
 6908 tgl                     16058 LBC           0 :             | ROW '(' ')'                           { $$ = NIL; }
 6908 tgl                     16059 CBC        5556 :             | '(' expr_list ',' a_expr ')'          { $$ = lappend($2, $4); }
                              16060                 :         ;
                              16061                 : 
 2885 andres                  16062 GIC        1817 : explicit_row:   ROW '(' expr_list ')'               { $$ = $3; }
                              16063              15 :             | ROW '(' ')'                           { $$ = NIL; }
 2885 andres                  16064 ECB             :         ;
                              16065                 : 
 2885 andres                  16066 GIC        3959 : implicit_row:   '(' expr_list ',' a_expr ')'        { $$ = lappend($2, $4); }
 2885 andres                  16067 ECB             :         ;
                              16068                 : 
 6908 tgl                     16069 CBC        7541 : sub_type:   ANY                                     { $$ = ANY_SUBLINK; }
 6908 tgl                     16070 LBC           0 :             | SOME                                  { $$ = ANY_SUBLINK; }
 6908 tgl                     16071 CBC         162 :             | ALL                                   { $$ = ALL_SUBLINK; }
 6908 tgl                     16072 ECB             :         ;
                              16073                 : 
 6908 tgl                     16074 CBC        4512 : all_Op:     Op                                      { $$ = $1; }
                              16075           12692 :             | MathOp                                { $$ = $1; }
 6908 tgl                     16076 ECB             :         ;
                              16077                 : 
 6908 tgl                     16078 GIC         325 : MathOp:      '+'                                    { $$ = "+"; }
                              16079             329 :             | '-'                                   { $$ = "-"; }
 6908 tgl                     16080 CBC           6 :             | '*'                                   { $$ = "*"; }
 6908 tgl                     16081 UIC           0 :             | '/'                                   { $$ = "/"; }
 6908 tgl                     16082 GIC           4 :             | '%'                                   { $$ = "%"; }
 6908 tgl                     16083 UIC           0 :             | '^'                                   { $$ = "^"; }
 6908 tgl                     16084 GIC         367 :             | '<'                                    { $$ = "<"; }
                              16085             288 :             | '>'                                    { $$ = ">"; }
 6908 tgl                     16086 CBC       10562 :             | '='                                   { $$ = "="; }
 2951 tgl                     16087 GIC         299 :             | LESS_EQUALS                           { $$ = "<="; }
 2951 tgl                     16088 CBC         295 :             | GREATER_EQUALS                        { $$ = ">="; }
                              16089             217 :             | NOT_EQUALS                            { $$ = "<>"; }
 6908 tgl                     16090 ECB             :         ;
                              16091                 : 
                              16092                 : qual_Op:    Op
 6888 neilc                   16093 CBC       34422 :                     { $$ = list_make1(makeString($1)); }
 6908 tgl                     16094 ECB             :             | OPERATOR '(' any_operator ')'
 6908 tgl                     16095 CBC        6543 :                     { $$ = $3; }
 6908 tgl                     16096 ECB             :         ;
                              16097                 : 
                              16098                 : qual_all_Op:
                              16099                 :             all_Op
 6888 neilc                   16100 GIC         677 :                     { $$ = list_make1(makeString($1)); }
                              16101                 :             | OPERATOR '(' any_operator ')'
 6908 tgl                     16102              17 :                     { $$ = $3; }
                              16103                 :         ;
                              16104                 : 
                              16105                 : subquery_Op:
                              16106                 :             all_Op
 6888 neilc                   16107            7607 :                     { $$ = list_make1(makeString($1)); }
                              16108                 :             | OPERATOR '(' any_operator ')'
 6908 tgl                     16109              79 :                     { $$ = $3; }
                              16110                 :             | LIKE
 6888 neilc                   16111 CBC          12 :                     { $$ = list_make1(makeString("~~")); }
 2951 tgl                     16112 ECB             :             | NOT_LA LIKE
 6888 neilc                   16113 GIC           6 :                     { $$ = list_make1(makeString("!~~")); }
                              16114                 :             | ILIKE
 6888 neilc                   16115 CBC           6 :                     { $$ = list_make1(makeString("~~*")); }
 2951 tgl                     16116 ECB             :             | NOT_LA ILIKE
 6888 neilc                   16117 UIC           0 :                     { $$ = list_make1(makeString("!~~*")); }
                              16118                 : /* cannot put SIMILAR TO here, because SIMILAR TO is a hack.
                              16119                 :  * the regular expression is preprocessed by a function (similar_to_escape),
                              16120                 :  * and the ~ operator for posix regular expressions is used.
                              16121                 :  *        x SIMILAR TO y     ->    x ~ similar_to_escape(y)
                              16122                 :  * this transformation is made on the fly by the parser upwards.
                              16123                 :  * however the SubLink structure which handles any/some/all stuff
                              16124                 :  * is not ready for such a thing.
                              16125                 :  */
 6908 tgl                     16126 ECB             :             ;
                              16127                 : 
 7170                         16128                 : expr_list:  a_expr
                              16129                 :                 {
 6886 tgl                     16130 CBC      185898 :                     $$ = list_make1($1);
                              16131                 :                 }
                              16132                 :             | expr_list ',' a_expr
                              16133                 :                 {
                              16134          146500 :                     $$ = lappend($1, $3);
                              16135                 :                 }
 9344 bruce                   16136 ECB             :         ;
 9351 lockhart                16137                 : 
 4931 tgl                     16138                 : /* function arguments can have names */
                              16139                 : func_arg_list:  func_arg_expr
                              16140                 :                 {
 4931 tgl                     16141 GIC      243399 :                     $$ = list_make1($1);
 4931 tgl                     16142 ECB             :                 }
                              16143                 :             | func_arg_list ',' func_arg_expr
                              16144                 :                 {
 4931 tgl                     16145 CBC      152330 :                     $$ = lappend($1, $3);
 4931 tgl                     16146 ECB             :                 }
                              16147                 :         ;
                              16148                 : 
                              16149                 : func_arg_expr:  a_expr
                              16150                 :                 {
 4931 tgl                     16151 GIC      378711 :                     $$ = $1;
 4931 tgl                     16152 ECB             :                 }
 4697                         16153                 :             | param_name COLON_EQUALS a_expr
 4931                         16154                 :                 {
 4931 tgl                     16155 CBC       16951 :                     NamedArgExpr *na = makeNode(NamedArgExpr);
                              16156                 : 
 4697 tgl                     16157 GIC       16951 :                     na->name = $1;
                              16158           16951 :                     na->arg = (Expr *) $3;
 4931                         16159           16951 :                     na->argnumber = -1;      /* until determined */
 4697                         16160           16951 :                     na->location = @1;
 4931 tgl                     16161 CBC       16951 :                     $$ = (Node *) na;
                              16162                 :                 }
                              16163                 :             | param_name EQUALS_GREATER a_expr
 2952 rhaas                   16164 ECB             :                 {
 2952 rhaas                   16165 GBC         396 :                     NamedArgExpr *na = makeNode(NamedArgExpr);
                              16166                 : 
 2952 rhaas                   16167 GIC         396 :                     na->name = $1;
                              16168             396 :                     na->arg = (Expr *) $3;
 2952 rhaas                   16169 CBC         396 :                     na->argnumber = -1;      /* until determined */
 2952 rhaas                   16170 GBC         396 :                     na->location = @1;
 2952 rhaas                   16171 GIC         396 :                     $$ = (Node *) na;
                              16172                 :                 }
                              16173                 :         ;
 4931 tgl                     16174 ECB             : 
  886 tgl                     16175 CBC         359 : func_arg_list_opt:  func_arg_list                   { $$ = $1; }
  886 tgl                     16176 UIC           0 :             | /*EMPTY*/                             { $$ = NIL; }
                              16177                 :         ;
                              16178                 : 
 5920 tgl                     16179 CBC         799 : type_list:  Typename                                { $$ = list_make1($1); }
                              16180             165 :             | type_list ',' Typename                { $$ = lappend($1, $3); }
                              16181                 :         ;
                              16182                 : 
 7306 tgl                     16183 ECB             : array_expr: '[' expr_list ']'
                              16184                 :                 {
 5337 tgl                     16185 CBC        3533 :                     $$ = makeAArrayExpr($2, @1);
 7306 tgl                     16186 ECB             :                 }
                              16187                 :             | '[' array_expr_list ']'
                              16188                 :                 {
 5337 tgl                     16189 GBC         203 :                     $$ = makeAArrayExpr($2, @1);
                              16190                 :                 }
                              16191                 :             | '[' ']'
                              16192                 :                 {
 5337 tgl                     16193 CBC          44 :                     $$ = makeAArrayExpr(NIL, @1);
 5498 tgl                     16194 EUB             :                 }
                              16195                 :         ;
                              16196                 : 
 5498 tgl                     16197 GIC         203 : array_expr_list: array_expr                         { $$ = list_make1($1); }
 5498 tgl                     16198 CBC         165 :             | array_expr_list ',' array_expr        { $$ = lappend($1, $3); }
 5498 tgl                     16199 ECB             :         ;
 5498 tgl                     16200 EUB             : 
                              16201                 : 
                              16202                 : extract_list:
                              16203                 :             extract_arg FROM a_expr
 5498 tgl                     16204 ECB             :                 {
 5337 tgl                     16205 CBC        1636 :                     $$ = list_make2(makeStringConst($1, @1), $3);
                              16206                 :                 }
 7306 tgl                     16207 EUB             :         ;
                              16208                 : 
                              16209                 : /* Allow delimited string Sconst in extract_arg as an SQL extension.
                              16210                 :  * - thomas 2001-04-12
 8013 lockhart                16211 ECB             :  */
 7601 bruce                   16212                 : extract_arg:
 7601 bruce                   16213 CBC        1531 :             IDENT                                   { $$ = $1; }
 7601 bruce                   16214 GIC          27 :             | YEAR_P                                { $$ = "year"; }
                              16215              18 :             | MONTH_P                               { $$ = "month"; }
                              16216              24 :             | DAY_P                                 { $$ = "day"; }
                              16217              12 :             | HOUR_P                                { $$ = "hour"; }
                              16218              12 :             | MINUTE_P                              { $$ = "minute"; }
                              16219              12 :             | SECOND_P                              { $$ = "second"; }
 5261 meskes                  16220 UIC           0 :             | Sconst                                { $$ = $1; }
                              16221                 :         ;
                              16222                 : 
                              16223                 : unicode_normal_form:
  886 tgl                     16224 GIC          12 :             NFC                                     { $$ = "NFC"; }
  886 tgl                     16225 CBC           6 :             | NFD                                   { $$ = "NFD"; }
  886 tgl                     16226 GIC           9 :             | NFKC                                  { $$ = "NFKC"; }
  886 tgl                     16227 CBC           9 :             | NFKD                                  { $$ = "NFKD"; }
 1109 peter                   16228 ECB             :         ;
                              16229                 : 
 1014                         16230                 : /* OVERLAY() arguments */
                              16231                 : overlay_list:
                              16232                 :             a_expr PLACING a_expr FROM a_expr FOR a_expr
                              16233                 :                 {
                              16234                 :                     /* overlay(A PLACING B FROM C FOR D) is converted to overlay(A, B, C, D) */
 1014 peter                   16235 GIC          17 :                     $$ = list_make4($1, $3, $5, $7);
 7607 lockhart                16236 ECB             :                 }
 1014 peter                   16237                 :             | a_expr PLACING a_expr FROM a_expr
 7607 lockhart                16238                 :                 {
 1014 peter                   16239                 :                     /* overlay(A PLACING B FROM C) is converted to overlay(A, B, C) */
 1014 peter                   16240 GIC          24 :                     $$ = list_make3($1, $3, $5);
                              16241                 :                 }
                              16242                 :         ;
 7607 lockhart                16243 ECB             : 
                              16244                 : /* position_list uses b_expr not a_expr to avoid conflict with general IN */
 7601 bruce                   16245                 : position_list:
 6888 neilc                   16246 CBC         440 :             b_expr IN_P b_expr                      { $$ = list_make2($3, $1); }
 9344 bruce                   16247 ECB             :         ;
 9351 lockhart                16248                 : 
                              16249                 : /*
                              16250                 :  * SUBSTRING() arguments
                              16251                 :  *
 1014 peter                   16252                 :  * Note that SQL:1999 has both
                              16253                 :  *     text FROM int FOR int
                              16254                 :  * and
                              16255                 :  *     text FROM pattern FOR escape
                              16256                 :  *
                              16257                 :  * In the parser we map them both to a call to the substring() function and
                              16258                 :  * rely on type resolution to pick the right one.
                              16259                 :  *
                              16260                 :  * In SQL:2003, the second variant was changed to
                              16261                 :  *     text SIMILAR pattern ESCAPE escape
                              16262                 :  * We could in theory map that to a different function internally, but
  886 tgl                     16263                 :  * since we still support the SQL:1999 version, we don't.  However,
                              16264                 :  * ruleutils.c will reverse-list the call in the newer style.
 1014 peter                   16265                 :  */
 7601 bruce                   16266                 : substr_list:
                              16267                 :             a_expr FROM a_expr FOR a_expr
                              16268                 :                 {
 1014 peter                   16269 GIC          61 :                     $$ = list_make3($1, $3, $5);
                              16270                 :                 }
 1014 peter                   16271 ECB             :             | a_expr FOR a_expr FROM a_expr
 8162 lockhart                16272                 :                 {
 1014 peter                   16273                 :                     /* not legal per SQL, but might as well allow it */
 1014 peter                   16274 LBC           0 :                     $$ = list_make3($1, $5, $3);
 8162 lockhart                16275 ECB             :                 }
                              16276                 :             | a_expr FROM a_expr
                              16277                 :                 {
                              16278                 :                     /*
                              16279                 :                      * Because we aren't restricting data types here, this
                              16280                 :                      * syntax can end up resolving to textregexsubstr().
                              16281                 :                      * We've historically allowed that to happen, so continue
                              16282                 :                      * to accept it.  However, ruleutils.c will reverse-list
                              16283                 :                      * such a call in regular function call syntax.
                              16284                 :                      */
 1014 peter                   16285 GIC        1253 :                     $$ = list_make2($1, $3);
                              16286                 :                 }
                              16287                 :             | a_expr FOR a_expr
                              16288                 :                 {
 1014 peter                   16289 EUB             :                     /* not legal per SQL */
                              16290                 : 
 6356 tgl                     16291 ECB             :                     /*
                              16292                 :                      * Since there are no cases where this syntax allows
                              16293                 :                      * a textual FOR value, we forcibly cast the argument
 5710                         16294                 :                      * to int4.  The possible matches in pg_proc are
                              16295                 :                      * substring(text,int4) and substring(text,text),
                              16296                 :                      * and we don't want the parser to choose the latter,
                              16297                 :                      * which it is likely to do if the second argument
                              16298                 :                      * is unknown or doesn't have an implicit cast to int4.
                              16299                 :                      */
 5337 tgl                     16300 GIC          18 :                     $$ = list_make3($1, makeIntConst(1, -1),
 1014 peter                   16301 ECB             :                                     makeTypeCast($3,
 5337 tgl                     16302 EUB             :                                                  SystemTypeName("int4"), -1));
 8162 lockhart                16303 ECB             :                 }
                              16304                 :             | a_expr SIMILAR a_expr ESCAPE a_expr
                              16305                 :                 {
 1014 peter                   16306 CBC         346 :                     $$ = list_make3($1, $3, $5);
 1014 peter                   16307 ECB             :                 }
                              16308                 :         ;
                              16309                 : 
 7601 bruce                   16310 CBC         542 : trim_list:  a_expr FROM expr_list                   { $$ = lappend($3, $1); }
                              16311              12 :             | FROM expr_list                        { $$ = $2; }
                              16312              43 :             | expr_list                             { $$ = $1; }
 9344 bruce                   16313 EUB             :         ;
 9770 scrappy                 16314 ECB             : 
 7601 bruce                   16315 EUB             : in_expr:    select_with_parens
 9297 lockhart                16316 ECB             :                 {
  331 peter                   16317 CBC        3996 :                     SubLink    *n = makeNode(SubLink);
  331 peter                   16318 ECB             : 
 9213 bruce                   16319 CBC        3996 :                     n->subselect = $1;
 7394 tgl                     16320 ECB             :                     /* other fields will be filled later */
  331 peter                   16321 CBC        3996 :                     $$ = (Node *) n;
                              16322                 :                 }
  331 peter                   16323 GIC       28882 :             | '(' expr_list ')'                     { $$ = (Node *) $2; }
                              16324                 :         ;
 9626 bruce                   16325 ECB             : 
                              16326                 : /*
 3641 peter_e                 16327                 :  * Define SQL-style CASE clause.
                              16328                 :  * - Full specification
                              16329                 :  *  CASE WHEN a = b THEN c ... ELSE d END
                              16330                 :  * - Implicit argument
                              16331                 :  *  CASE a WHEN b THEN c ... ELSE d END
 8892 lockhart                16332                 :  */
                              16333                 : case_expr:  CASE case_arg when_clause_list case_default END_P
                              16334                 :                 {
  331 peter                   16335 GIC       50079 :                     CaseExpr   *c = makeNode(CaseExpr);
                              16336                 : 
 6962 tgl                     16337           50079 :                     c->casetype = InvalidOid; /* not analyzed yet */
 7423                         16338           50079 :                     c->arg = (Expr *) $2;
 8892 lockhart                16339 CBC       50079 :                     c->args = $3;
 7423 tgl                     16340 GIC       50079 :                     c->defresult = (Expr *) $4;
 5337 tgl                     16341 CBC       50079 :                     c->location = @1;
  331 peter                   16342 GIC       50079 :                     $$ = (Node *) c;
 8892 lockhart                16343 ECB             :                 }
                              16344                 :         ;
                              16345                 : 
                              16346                 : when_clause_list:
 7600 bruce                   16347                 :             /* There must be at least one */
 6888 neilc                   16348 GIC       50079 :             when_clause                             { $$ = list_make1($1); }
 7600 bruce                   16349 GBC       51599 :             | when_clause_list when_clause          { $$ = lappend($1, $2); }
                              16350                 :         ;
                              16351                 : 
                              16352                 : when_clause:
                              16353                 :             WHEN a_expr THEN a_expr
                              16354                 :                 {
  331 peter                   16355 GIC      101678 :                     CaseWhen   *w = makeNode(CaseWhen);
                              16356                 : 
 7423 tgl                     16357          101678 :                     w->expr = (Expr *) $2;
                              16358          101678 :                     w->result = (Expr *) $4;
 5337                         16359          101678 :                     w->location = @1;
  331 peter                   16360          101678 :                     $$ = (Node *) w;
                              16361                 :                 }
 8892 lockhart                16362 ECB             :         ;
                              16363                 : 
                              16364                 : case_default:
 7601 bruce                   16365 GIC       35158 :             ELSE a_expr                             { $$ = $2; }
 7601 bruce                   16366 CBC       14921 :             | /*EMPTY*/                             { $$ = NULL; }
                              16367                 :         ;
                              16368                 : 
 7601 bruce                   16369 GIC        8589 : case_arg:   a_expr                                  { $$ = $1; }
                              16370           41490 :             | /*EMPTY*/                             { $$ = NULL; }
                              16371                 :         ;
                              16372                 : 
 4903 tgl                     16373 ECB             : columnref:  ColId
                              16374                 :                 {
 5018 tgl                     16375 GIC      403292 :                     $$ = makeColumnRef($1, NIL, @1, yyscanner);
                              16376                 :                 }
 4903 tgl                     16377 ECB             :             | ColId indirection
                              16378                 :                 {
 5018 tgl                     16379 GIC      954809 :                     $$ = makeColumnRef($1, $2, @1, yyscanner);
                              16380                 :                 }
                              16381                 :         ;
                              16382                 : 
 6878 tgl                     16383 ECB             : indirection_el:
                              16384                 :             '.' attr_name
                              16385                 :                 {
 6878 tgl                     16386 GIC     1117706 :                     $$ = (Node *) makeString($2);
 6878 tgl                     16387 ECB             :                 }
                              16388                 :             | '.' '*'
                              16389                 :                 {
 5335 tgl                     16390 CBC        5082 :                     $$ = (Node *) makeNode(A_Star);
 6878 tgl                     16391 ECB             :                 }
                              16392                 :             | '[' a_expr ']'
                              16393                 :                 {
 6878 tgl                     16394 GIC        9644 :                     A_Indices *ai = makeNode(A_Indices);
                              16395                 : 
 2665                         16396            9644 :                     ai->is_slice = false;
 6878 tgl                     16397 CBC        9644 :                     ai->lidx = NULL;
 6878 tgl                     16398 GIC        9644 :                     ai->uidx = $2;
 6878 tgl                     16399 CBC        9644 :                     $$ = (Node *) ai;
 6878 tgl                     16400 ECB             :                 }
 2665                         16401                 :             | '[' opt_slice_bound ':' opt_slice_bound ']'
 6878                         16402                 :                 {
 6878 tgl                     16403 CBC         276 :                     A_Indices *ai = makeNode(A_Indices);
                              16404                 : 
 2665 tgl                     16405 GIC         276 :                     ai->is_slice = true;
 6878                         16406             276 :                     ai->lidx = $2;
 6878 tgl                     16407 CBC         276 :                     ai->uidx = $4;
 6878 tgl                     16408 GBC         276 :                     $$ = (Node *) ai;
                              16409                 :                 }
                              16410                 :         ;
 9344 bruce                   16411 ECB             : 
 2665 tgl                     16412                 : opt_slice_bound:
 2665 tgl                     16413 GIC         462 :             a_expr                                  { $$ = $1; }
                              16414              90 :             | /*EMPTY*/                             { $$ = NULL; }
                              16415                 :         ;
                              16416                 : 
 6878 tgl                     16417 ECB             : indirection:
 6878 tgl                     16418 GIC     1092203 :             indirection_el                          { $$ = list_make1($1); }
                              16419            1013 :             | indirection indirection_el            { $$ = lappend($1, $2); }
                              16420                 :         ;
 6878 tgl                     16421 ECB             : 
                              16422                 : opt_indirection:
 6878 tgl                     16423 GIC      279470 :             /*EMPTY*/                               { $$ = NIL; }
                              16424           39492 :             | opt_indirection indirection_el        { $$ = lappend($1, $2); }
 7689 tgl                     16425 ECB             :         ;
                              16426                 : 
                              16427                 : opt_asymmetric: ASYMMETRIC
                              16428                 :             | /*EMPTY*/
 6505                         16429                 :         ;
                              16430                 : 
                              16431                 : /* SQL/JSON support */
                              16432                 : json_value_expr:
                              16433                 :             a_expr json_format_clause_opt
                              16434                 :             {
   11 alvherre                16435 GNC         499 :                 $$ = (Node *) makeJsonValueExpr((Expr *) $1, castNode(JsonFormat, $2));
                              16436                 :             }
                              16437                 :         ;
                              16438                 : 
                              16439                 : json_format_clause_opt:
                              16440                 :             FORMAT_LA JSON json_encoding_clause_opt
                              16441                 :                 {
                              16442             116 :                     $$ = (Node *) makeJsonFormat(JS_FORMAT_JSON, $3, @1);
                              16443                 :                 }
                              16444                 :             | /* EMPTY */
                              16445                 :                 {
                              16446             631 :                     $$ = (Node *) makeJsonFormat(JS_FORMAT_DEFAULT, JS_ENC_DEFAULT, -1);
                              16447                 :                 }
                              16448                 :         ;
                              16449                 : 
                              16450                 : json_encoding_clause_opt:
                              16451              39 :             ENCODING name                   { $$ = makeJsonEncoding($2); }
                              16452              83 :             | /* EMPTY */                   { $$ = JS_ENC_DEFAULT; }
                              16453                 :         ;
                              16454                 : 
                              16455                 : json_output_clause_opt:
                              16456                 :             RETURNING Typename json_format_clause_opt
                              16457                 :                 {
                              16458             221 :                     JsonOutput *n = makeNode(JsonOutput);
                              16459                 : 
                              16460             221 :                     n->typeName = $2;
                              16461             221 :                     n->returning = makeNode(JsonReturning);
                              16462             221 :                     n->returning->format = (JsonFormat *) $3;
                              16463             221 :                     $$ = (Node *) n;
                              16464                 :                 }
                              16465             212 :             | /* EMPTY */                           { $$ = NULL; }
                              16466                 :         ;
                              16467                 : 
                              16468                 : json_predicate_type_constraint:
    9                         16469              94 :             JSON                                    { $$ = JS_TYPE_ANY; }
                              16470              13 :             | JSON VALUE_P                          { $$ = JS_TYPE_ANY; }
                              16471              19 :             | JSON ARRAY                            { $$ = JS_TYPE_ARRAY; }
                              16472              19 :             | JSON OBJECT_P                         { $$ = JS_TYPE_OBJECT; }
                              16473              19 :             | JSON SCALAR                           { $$ = JS_TYPE_SCALAR; }
                              16474                 :         ;
                              16475                 : 
                              16476                 : /* KEYS is a noise word here */
                              16477                 : json_key_uniqueness_constraint_opt:
                              16478              28 :             WITH UNIQUE KEYS                            { $$ = true; }
                              16479              40 :             | WITH UNIQUE                               { $$ = true; }
    5                         16480              14 :             | WITHOUT UNIQUE KEYS                       { $$ = false; }
                              16481               7 :             | WITHOUT UNIQUE                            { $$ = false; }
    9                         16482             276 :             | /* EMPTY */               %prec KEYS      { $$ = false; }
                              16483                 :         ;
                              16484                 : 
                              16485                 : json_name_and_value_list:
                              16486                 :             json_name_and_value
   11                         16487             141 :                 { $$ = list_make1($1); }
                              16488                 :             | json_name_and_value_list ',' json_name_and_value
                              16489             112 :                 { $$ = lappend($1, $3); }
                              16490                 :         ;
                              16491                 : 
                              16492                 : json_name_and_value:
                              16493                 : /* Supporting this syntax seems to require major surgery
                              16494                 :             KEY c_expr VALUE_P json_value_expr
                              16495                 :                 { $$ = makeJsonKeyValue($2, $4); }
                              16496                 :             |
                              16497                 : */
                              16498                 :             c_expr VALUE_P json_value_expr
                              16499              12 :                 { $$ = makeJsonKeyValue($1, $3); }
                              16500                 :             |
                              16501                 :             a_expr ':' json_value_expr
                              16502             301 :                 { $$ = makeJsonKeyValue($1, $3); }
                              16503                 :         ;
                              16504                 : 
                              16505                 : /* empty means false for objects, true for arrays */
                              16506                 : json_object_constructor_null_clause_opt:
                              16507              15 :             NULL_P ON NULL_P                    { $$ = false; }
                              16508              41 :             | ABSENT ON NULL_P                  { $$ = true; }
                              16509             145 :             | /* EMPTY */                       { $$ = false; }
                              16510                 :         ;
                              16511                 : 
                              16512                 : json_array_constructor_null_clause_opt:
                              16513              27 :             NULL_P ON NULL_P                        { $$ = false; }
                              16514              18 :             | ABSENT ON NULL_P                      { $$ = true; }
                              16515              78 :             | /* EMPTY */                           { $$ = true; }
                              16516                 :         ;
                              16517                 : 
                              16518                 : json_value_expr_list:
                              16519              48 :             json_value_expr                             { $$ = list_make1($1); }
                              16520              63 :             | json_value_expr_list ',' json_value_expr  { $$ = lappend($1, $3);}
                              16521                 :         ;
                              16522                 : 
                              16523                 : json_aggregate_func:
                              16524                 :             JSON_OBJECTAGG '('
                              16525                 :                 json_name_and_value
                              16526                 :                 json_object_constructor_null_clause_opt
                              16527                 :                 json_key_uniqueness_constraint_opt
                              16528                 :                 json_output_clause_opt
                              16529                 :             ')'
                              16530                 :                 {
                              16531              60 :                     JsonObjectAgg *n = makeNode(JsonObjectAgg);
                              16532                 : 
                              16533              60 :                     n->arg = (JsonKeyValue *) $3;
                              16534              60 :                     n->absent_on_null = $4;
                              16535              60 :                     n->unique = $5;
                              16536              60 :                     n->constructor = makeNode(JsonAggConstructor);
                              16537              60 :                     n->constructor->output = (JsonOutput *) $6;
                              16538              60 :                     n->constructor->agg_order = NULL;
                              16539              60 :                     n->constructor->location = @1;
                              16540              60 :                     $$ = (Node *) n;
                              16541                 :                 }
                              16542                 :             | JSON_ARRAYAGG '('
                              16543                 :                 json_value_expr
                              16544                 :                 json_array_aggregate_order_by_clause_opt
                              16545                 :                 json_array_constructor_null_clause_opt
                              16546                 :                 json_output_clause_opt
                              16547                 :             ')'
                              16548                 :                 {
                              16549              75 :                     JsonArrayAgg *n = makeNode(JsonArrayAgg);
                              16550                 : 
                              16551              75 :                     n->arg = (JsonValueExpr *) $3;
                              16552              75 :                     n->absent_on_null = $5;
                              16553              75 :                     n->constructor = makeNode(JsonAggConstructor);
                              16554              75 :                     n->constructor->agg_order = $4;
                              16555              75 :                     n->constructor->output = (JsonOutput *) $6;
                              16556              75 :                     n->constructor->location = @1;
                              16557              75 :                     $$ = (Node *) n;
                              16558                 :                 }
                              16559                 :         ;
                              16560                 : 
                              16561                 : json_array_aggregate_order_by_clause_opt:
                              16562               9 :             ORDER BY sortby_list                    { $$ = $3; }
                              16563              66 :             | /* EMPTY */                           { $$ = NIL; }
                              16564                 :         ;
                              16565                 : 
                              16566                 : /*****************************************************************************
                              16567                 :  *
                              16568                 :  *  target list for SELECT
                              16569                 :  *
                              16570                 :  *****************************************************************************/
 9770 scrappy                 16571 ECB             : 
 3403 tgl                     16572 GIC      264318 : opt_target_list: target_list                        { $$ = $1; }
                              16573             153 :             | /* EMPTY */                           { $$ = NIL; }
                              16574                 :         ;
                              16575                 : 
                              16576                 : target_list:
 6888 neilc                   16577          269549 :             target_el                               { $$ = list_make1($1); }
 7600 bruce                   16578          603288 :             | target_list ',' target_el             { $$ = lappend($1, $3); }
 9344 bruce                   16579 ECB             :         ;
 9770 scrappy                 16580                 : 
 7601 bruce                   16581                 : target_el:  a_expr AS ColLabel
 9344                         16582                 :                 {
 9344 bruce                   16583 CBC      362409 :                     $$ = makeNode(ResTarget);
                              16584          362409 :                     $$->name = $3;
 7689 tgl                     16585          362409 :                     $$->indirection = NIL;
  331 peter                   16586 GBC      362409 :                     $$->val = (Node *) $1;
 6226 tgl                     16587 GIC      362409 :                     $$->location = @1;
                              16588                 :                 }
                              16589                 :             | a_expr BareColLabel
 5532 tgl                     16590 ECB             :                 {
 5532 tgl                     16591 CBC        1690 :                     $$ = makeNode(ResTarget);
                              16592            1690 :                     $$->name = $2;
                              16593            1690 :                     $$->indirection = NIL;
  331 peter                   16594 GIC        1690 :                     $$->val = (Node *) $1;
 5532 tgl                     16595            1690 :                     $$->location = @1;
                              16596                 :                 }
                              16597                 :             | a_expr
                              16598                 :                 {
 9344 bruce                   16599          478576 :                     $$ = makeNode(ResTarget);
                              16600          478576 :                     $$->name = NULL;
 7689 tgl                     16601 CBC      478576 :                     $$->indirection = NIL;
  331 peter                   16602 GIC      478576 :                     $$->val = (Node *) $1;
 6226 tgl                     16603          478576 :                     $$->location = @1;
                              16604                 :                 }
                              16605                 :             | '*'
 9344 bruce                   16606 ECB             :                 {
  331 peter                   16607 GIC       30162 :                     ColumnRef  *n = makeNode(ColumnRef);
                              16608                 : 
 5335 tgl                     16609           30162 :                     n->fields = list_make1(makeNode(A_Star));
 6235                         16610           30162 :                     n->location = @1;
                              16611                 : 
 9344 bruce                   16612 CBC       30162 :                     $$ = makeNode(ResTarget);
 9344 bruce                   16613 GIC       30162 :                     $$->name = NULL;
 7689 tgl                     16614           30162 :                     $$->indirection = NIL;
  331 peter                   16615           30162 :                     $$->val = (Node *) n;
 6226 tgl                     16616           30162 :                     $$->location = @1;
                              16617                 :                 }
                              16618                 :         ;
                              16619                 : 
                              16620                 : 
                              16621                 : /*****************************************************************************
                              16622                 :  *
                              16623                 :  *  Names and constants
                              16624                 :  *
                              16625                 :  *****************************************************************************/
                              16626                 : 
                              16627                 : qualified_name_list:
 6888 neilc                   16628           27362 :             qualified_name                          { $$ = list_make1($1); }
 7601 bruce                   16629             145 :             | qualified_name_list ',' qualified_name { $$ = lappend($1, $3); }
                              16630                 :         ;
                              16631                 : 
                              16632                 : /*
                              16633                 :  * The production for a qualified relation name has to exactly match the
                              16634                 :  * production for a qualified func_name, because in a FROM clause we cannot
 6726 tgl                     16635 ECB             :  * tell which we are parsing until we see what comes after it ('(' for a
                              16636                 :  * func_name, something else for a relation). Therefore we allow 'indirection'
                              16637                 :  * which may contain subscripts, and reject that case in the C code.
                              16638                 :  */
                              16639                 : qualified_name:
 4903 tgl                     16640 EUB             :             ColId
                              16641                 :                 {
 4500 rhaas                   16642 GIC      398845 :                     $$ = makeRangeVar(NULL, $1, @1);
                              16643                 :                 }
                              16644                 :             | ColId indirection
                              16645                 :                 {
  529 akapila                 16646           90679 :                     $$ = makeRangeVarFromQualifiedName($1, $2, @1, yyscanner);
                              16647                 :                 }
                              16648                 :         ;
                              16649                 : 
                              16650                 : name_list:  name
 6888 neilc                   16651 CBC       40132 :                     { $$ = list_make1(makeString($1)); }
                              16652                 :             | name_list ',' name
 7600 bruce                   16653 GIC      164514 :                     { $$ = lappend($1, makeString($3)); }
                              16654                 :         ;
                              16655                 : 
                              16656                 : 
 7601                         16657          269473 : name:       ColId                                   { $$ = $1; };
                              16658                 : 
 6802 tgl                     16659         1153050 : attr_name:  ColLabel                                { $$ = $1; };
                              16660                 : 
 7601 bruce                   16661              26 : file_name:  Sconst                                  { $$ = $1; };
                              16662                 : 
                              16663                 : /*
                              16664                 :  * The production for a qualified func_name has to exactly match the
                              16665                 :  * production for a qualified columnref, because we cannot tell which we
 5944 tgl                     16666 ECB             :  * are parsing until we see what comes after it ('(' or Sconst for a func_name,
                              16667                 :  * anything else for a columnref).  Therefore we allow 'indirection' which
                              16668                 :  * may contain subscripts, and reject that case in the C code.  (If we
                              16669                 :  * ever implement SQL99-like methods, such syntax may actually become legal!)
                              16670                 :  */
                              16671                 : func_name:  type_function_name
 6888 neilc                   16672 CBC      330711 :                     { $$ = list_make1(makeString($1)); }
                              16673                 :             | ColId indirection
                              16674                 :                     {
 5018 tgl                     16675 GIC       46679 :                         $$ = check_func_name(lcons(makeString($1), $2),
 5018 tgl                     16676 ECB             :                                              yyscanner);
                              16677                 :                     }
 7681                         16678                 :         ;
                              16679                 : 
                              16680                 : 
                              16681                 : /*
                              16682                 :  * Constants
 9297 lockhart                16683                 :  */
                              16684                 : AexprConst: Iconst
 9344 bruce                   16685                 :                 {
 5337 tgl                     16686 GIC      263091 :                     $$ = makeIntConst($1, @1);
 9344 bruce                   16687 ECB             :                 }
                              16688                 :             | FCONST
                              16689                 :                 {
 5337 tgl                     16690 GIC        5276 :                     $$ = makeFloatConst($1, @1);
                              16691                 :                 }
                              16692                 :             | Sconst
                              16693                 :                 {
                              16694          479676 :                     $$ = makeStringConst($1, @1);
                              16695                 :                 }
                              16696                 :             | BCONST
                              16697                 :                 {
                              16698             370 :                     $$ = makeBitStringConst($1, @1);
                              16699                 :                 }
                              16700                 :             | XCONST
 7553 lockhart                16701 ECB             :                 {
                              16702                 :                     /* This is a bit constant per SQL99:
                              16703                 :                      * Without Feature F511, "BIT data type",
                              16704                 :                      * a <general literal> shall not be a
                              16705                 :                      * <bit string literal> or a <hex string literal>.
                              16706                 :                      */
 5337 tgl                     16707 CBC        1653 :                     $$ = makeBitStringConst($1, @1);
 7553 lockhart                16708 ECB             :                 }
                              16709                 :             | func_name Sconst
                              16710                 :                 {
                              16711                 :                     /* generic type 'literal' syntax */
  331 peter                   16712 GIC        3848 :                     TypeName   *t = makeTypeNameFromNameList($1);
                              16713                 : 
 5458 alvherre                16714 CBC        3848 :                     t->location = @1;
 5337 tgl                     16715            3848 :                     $$ = makeStringConstCast($2, @2, t);
                              16716                 :                 }
                              16717                 :             | func_name '(' func_arg_list opt_sort_clause ')' Sconst
                              16718                 :                 {
                              16719                 :                     /* generic syntax with a type modifier */
  331 peter                   16720 UIC           0 :                     TypeName   *t = makeTypeNameFromNameList($1);
  331 peter                   16721 ECB             :                     ListCell   *lc;
                              16722                 : 
 4931 tgl                     16723                 :                     /*
 3394                         16724                 :                      * We must use func_arg_list and opt_sort_clause in the
                              16725                 :                      * production to avoid reduce/reduce conflicts, but we
                              16726                 :                      * don't actually wish to allow NamedArgExpr in this
                              16727                 :                      * context, nor ORDER BY.
                              16728                 :                      */
 4931 tgl                     16729 UIC           0 :                     foreach(lc, $3)
                              16730                 :                     {
 4931 tgl                     16731 LBC           0 :                         NamedArgExpr *arg = (NamedArgExpr *) lfirst(lc);
 4931 tgl                     16732 ECB             : 
 4931 tgl                     16733 UIC           0 :                         if (IsA(arg, NamedArgExpr))
                              16734               0 :                             ereport(ERROR,
 4177 peter_e                 16735 ECB             :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              16736                 :                                      errmsg("type modifier cannot have parameter name"),
                              16737                 :                                      parser_errposition(arg->location)));
                              16738                 :                     }
 3394 tgl                     16739 UIC           0 :                     if ($4 != NIL)
                              16740               0 :                             ereport(ERROR,
 3394 tgl                     16741 ECB             :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              16742                 :                                      errmsg("type modifier cannot have ORDER BY"),
                              16743                 :                                      parser_errposition(@4)));
                              16744                 : 
 5458 alvherre                16745 LBC           0 :                     t->typmods = $3;
 5458 alvherre                16746 UIC           0 :                     t->location = @1;
 3394 tgl                     16747               0 :                     $$ = makeStringConstCast($6, @6, t);
                              16748                 :                 }
                              16749                 :             | ConstTypename Sconst
                              16750                 :                 {
 5337 tgl                     16751 GIC        1139 :                     $$ = makeStringConstCast($2, @2, $1);
 8304 lockhart                16752 ECB             :                 }
                              16753                 :             | ConstInterval Sconst opt_interval
                              16754                 :                 {
  331 peter                   16755 GIC        1172 :                     TypeName   *t = $1;
  331 peter                   16756 ECB             : 
 5323 tgl                     16757 GIC        1172 :                     t->typmods = $3;
 5337                         16758            1172 :                     $$ = makeStringConstCast($2, @2, t);
                              16759                 :                 }
 3095 bruce                   16760 ECB             :             | ConstInterval '(' Iconst ')' Sconst
                              16761                 :                 {
  331 peter                   16762 CBC           6 :                     TypeName   *t = $1;
  331 peter                   16763 ECB             : 
 3095 bruce                   16764 CBC           6 :                     t->typmods = list_make2(makeIntConst(INTERVAL_FULL_RANGE, -1),
 3095 bruce                   16765 ECB             :                                             makeIntConst($3, @3));
 5337 tgl                     16766 GIC           6 :                     $$ = makeStringConstCast($5, @5, t);
                              16767                 :                 }
                              16768                 :             | TRUE_P
 9297 lockhart                16769 ECB             :                 {
 2062 peter_e                 16770 GIC       10462 :                     $$ = makeBoolAConst(true, @1);
 9297 lockhart                16771 ECB             :                 }
 7601 bruce                   16772                 :             | FALSE_P
 9297 lockhart                16773                 :                 {
 2062 peter_e                 16774 CBC       19065 :                     $$ = makeBoolAConst(false, @1);
                              16775                 :                 }
                              16776                 :             | NULL_P
                              16777                 :                 {
 5337 tgl                     16778 GIC       96509 :                     $$ = makeNullAConst(@1);
 8428 tgl                     16779 ECB             :                 }
 9344 bruce                   16780                 :         ;
                              16781                 : 
 7601 bruce                   16782 GIC      288122 : Iconst:     ICONST                                  { $$ = $1; };
                              16783          536743 : Sconst:     SCONST                                  { $$ = $1; };
 3365 sfrost                  16784 ECB             : 
 5261 meskes                  16785 CBC       20682 : SignedIconst: Iconst                                { $$ = $1; }
 5261 meskes                  16786 UIC           0 :             | '+' Iconst                            { $$ = + $2; }
 5261 meskes                  16787 GIC         133 :             | '-' Iconst                            { $$ = - $2; }
                              16788                 :         ;
 6461 tgl                     16789 ECB             : 
 2953 alvherre                16790                 : /* Role specifications */
                              16791                 : RoleId:     RoleSpec
                              16792                 :                 {
  331 peter                   16793 GIC         834 :                     RoleSpec   *spc = (RoleSpec *) $1;
                              16794                 : 
 2953 alvherre                16795             834 :                     switch (spc->roletype)
                              16796                 :                     {
                              16797             829 :                         case ROLESPEC_CSTRING:
                              16798             829 :                             $$ = spc->rolename;
                              16799             829 :                             break;
                              16800               2 :                         case ROLESPEC_PUBLIC:
 2953 alvherre                16801 CBC           2 :                             ereport(ERROR,
                              16802                 :                                     (errcode(ERRCODE_RESERVED_NAME),
                              16803                 :                                      errmsg("role name \"%s\" is reserved",
                              16804                 :                                             "public"),
                              16805                 :                                      parser_errposition(@1)));
                              16806                 :                             break;
 2953 alvherre                16807 GIC           1 :                         case ROLESPEC_SESSION_USER:
 2953 alvherre                16808 CBC           1 :                             ereport(ERROR,
                              16809                 :                                     (errcode(ERRCODE_RESERVED_NAME),
                              16810                 :                                      errmsg("%s cannot be used as a role name here",
                              16811                 :                                             "SESSION_USER"),
 2953 alvherre                16812 ECB             :                                      parser_errposition(@1)));
                              16813                 :                             break;
 2953 alvherre                16814 GIC           1 :                         case ROLESPEC_CURRENT_USER:
                              16815               1 :                             ereport(ERROR,
                              16816                 :                                     (errcode(ERRCODE_RESERVED_NAME),
 2901 alvherre                16817 ECB             :                                      errmsg("%s cannot be used as a role name here",
 2953                         16818                 :                                             "CURRENT_USER"),
                              16819                 :                                      parser_errposition(@1)));
                              16820                 :                             break;
  934 peter                   16821 GIC           1 :                         case ROLESPEC_CURRENT_ROLE:
                              16822               1 :                             ereport(ERROR,
                              16823                 :                                     (errcode(ERRCODE_RESERVED_NAME),
  934 peter                   16824 ECB             :                                      errmsg("%s cannot be used as a role name here",
                              16825                 :                                             "CURRENT_ROLE"),
                              16826                 :                                      parser_errposition(@1)));
                              16827                 :                             break;
 2953 alvherre                16828                 :                     }
                              16829                 :                 }
                              16830                 :             ;
                              16831                 : 
                              16832                 : RoleSpec:   NonReservedWord
                              16833                 :                 {
                              16834                 :                     /*
  331 peter                   16835                 :                      * "public" and "none" are not keywords, but they must
                              16836                 :                      * be treated specially here.
                              16837                 :                      */
                              16838                 :                     RoleSpec   *n;
                              16839                 : 
  331 peter                   16840 GIC       54442 :                     if (strcmp($1, "public") == 0)
                              16841                 :                     {
                              16842           44129 :                         n = (RoleSpec *) makeRoleSpec(ROLESPEC_PUBLIC, @1);
                              16843           44129 :                         n->roletype = ROLESPEC_PUBLIC;
 2953 alvherre                16844 ECB             :                     }
  331 peter                   16845 CBC       10313 :                     else if (strcmp($1, "none") == 0)
  934 peter                   16846 ECB             :                     {
  331 peter                   16847 CBC          13 :                         ereport(ERROR,
  331 peter                   16848 ECB             :                                 (errcode(ERRCODE_RESERVED_NAME),
                              16849                 :                                  errmsg("role name \"%s\" is reserved",
                              16850                 :                                         "none"),
                              16851                 :                                  parser_errposition(@1)));
                              16852                 :                     }
                              16853                 :                     else
                              16854                 :                     {
  331 peter                   16855 CBC       10300 :                         n = makeRoleSpec(ROLESPEC_CSTRING, @1);
  331 peter                   16856 GIC       10300 :                         n->rolename = pstrdup($1);
                              16857                 :                     }
                              16858           54429 :                     $$ = n;
                              16859                 :                 }
                              16860                 :             | CURRENT_ROLE
                              16861                 :                 {
                              16862              28 :                     $$ = makeRoleSpec(ROLESPEC_CURRENT_ROLE, @1);
                              16863                 :                 }
                              16864                 :             | CURRENT_USER
  331 peter                   16865 ECB             :                 {
  331 peter                   16866 GIC         102 :                     $$ = makeRoleSpec(ROLESPEC_CURRENT_USER, @1);
                              16867                 :                 }
 2953 alvherre                16868 ECB             :             | SESSION_USER
                              16869                 :                 {
  331 peter                   16870 GIC          18 :                     $$ = makeRoleSpec(ROLESPEC_SESSION_USER, @1);
                              16871                 :                 }
                              16872                 :         ;
 2953 alvherre                16873 ECB             : 
                              16874                 : role_list:  RoleSpec
  331 peter                   16875 CBC        2258 :                 { $$ = list_make1($1); }
                              16876                 :             | role_list ',' RoleSpec
  331 peter                   16877 GIC         123 :                 { $$ = lappend($1, $3); }
                              16878                 :         ;
 2953 alvherre                16879 ECB             : 
  825 tgl                     16880                 : 
                              16881                 : /*****************************************************************************
                              16882                 :  *
                              16883                 :  * PL/pgSQL extensions
                              16884                 :  *
                              16885                 :  * You'd think a PL/pgSQL "expression" should be just an a_expr, but
                              16886                 :  * historically it can include just about anything that can follow SELECT.
                              16887                 :  * Therefore the returned struct is a SelectStmt.
                              16888                 :  *****************************************************************************/
                              16889                 : 
                              16890                 : PLpgSQL_Expr: opt_distinct_clause opt_target_list
                              16891                 :             from_clause where_clause
                              16892                 :             group_clause having_clause window_clause
                              16893                 :             opt_sort_clause opt_select_limit opt_for_locking_clause
                              16894                 :                 {
  825 tgl                     16895 GIC       17582 :                     SelectStmt *n = makeNode(SelectStmt);
                              16896                 : 
  807 tgl                     16897 CBC       17582 :                     n->distinctClause = $1;
  807 tgl                     16898 GIC       17582 :                     n->targetList = $2;
  807 tgl                     16899 CBC       17582 :                     n->fromClause = $3;
                              16900           17582 :                     n->whereClause = $4;
  752 tomas.vondra            16901           17582 :                     n->groupClause = ($5)->list;
                              16902           17582 :                     n->groupDistinct = ($5)->distinct;
  807 tgl                     16903           17582 :                     n->havingClause = $6;
                              16904           17582 :                     n->windowClause = $7;
                              16905           17582 :                     n->sortClause = $8;
                              16906           17582 :                     if ($9)
                              16907                 :                     {
  807 tgl                     16908 GIC           2 :                         n->limitOffset = $9->limitOffset;
                              16909               2 :                         n->limitCount = $9->limitCount;
  825                         16910               2 :                         if (!n->sortClause &&
  807                         16911               2 :                             $9->limitOption == LIMIT_OPTION_WITH_TIES)
  825 tgl                     16912 UIC           0 :                             ereport(ERROR,
                              16913                 :                                     (errcode(ERRCODE_SYNTAX_ERROR),
                              16914                 :                                      errmsg("WITH TIES cannot be specified without ORDER BY clause")));
  807 tgl                     16915 CBC           2 :                         n->limitOption = $9->limitOption;
                              16916                 :                     }
                              16917           17582 :                     n->lockingClause = $10;
  825                         16918           17582 :                     $$ = (Node *) n;
  825 tgl                     16919 ECB             :                 }
                              16920                 :         ;
                              16921                 : 
                              16922                 : /*
                              16923                 :  * PL/pgSQL Assignment statement: name opt_indirection := PLpgSQL_Expr
                              16924                 :  */
                              16925                 : 
                              16926                 : PLAssignStmt: plassign_target opt_indirection plassign_equals PLpgSQL_Expr
                              16927                 :                 {
  825 tgl                     16928 CBC        3251 :                     PLAssignStmt *n = makeNode(PLAssignStmt);
  825 tgl                     16929 ECB             : 
  825 tgl                     16930 GIC        3251 :                     n->name = $1;
                              16931            3251 :                     n->indirection = check_indirection($2, yyscanner);
                              16932                 :                     /* nnames will be filled by calling production */
                              16933            3226 :                     n->val = (SelectStmt *) $4;
                              16934            3226 :                     n->location = @1;
                              16935            3226 :                     $$ = (Node *) n;
                              16936                 :                 }
                              16937                 :         ;
  825 tgl                     16938 ECB             : 
  825 tgl                     16939 CBC        3239 : plassign_target: ColId                          { $$ = $1; }
  825 tgl                     16940 GIC          12 :             | PARAM                             { $$ = psprintf("$%d", $1); }
                              16941                 :         ;
                              16942                 : 
  825 tgl                     16943 ECB             : plassign_equals: COLON_EQUALS
                              16944                 :             | '='
                              16945                 :         ;
                              16946                 : 
                              16947                 : 
                              16948                 : /*
 7814                         16949                 :  * Name classification hierarchy.
                              16950                 :  *
                              16951                 :  * IDENT is the lexeme returned by the lexer for identifiers that match
                              16952                 :  * no known keyword.  In most cases, we can accept certain keywords as
 7601 bruce                   16953                 :  * names, not only IDENTs.  We prefer to accept as many such keywords
                              16954                 :  * as possible to minimize the impact of "reserved words" on programmers.
                              16955                 :  * So, we divide names into several possible classes.  The classification
                              16956                 :  * is chosen in part to make keywords acceptable as names wherever possible.
 7814 tgl                     16957                 :  */
                              16958                 : 
                              16959                 : /* Column identifier --- names that can be column, table, etc names.
                              16960                 :  */
 7601 bruce                   16961 CBC     2594178 : ColId:      IDENT                                   { $$ = $1; }
 7601 bruce                   16962 GIC       65792 :             | unreserved_keyword                    { $$ = pstrdup($1); }
                              16963           17502 :             | col_name_keyword                      { $$ = pstrdup($1); }
                              16964                 :         ;
 7814 tgl                     16965 ECB             : 
 5944                         16966                 : /* Type/function identifier --- names that can be type or function names.
 7814                         16967                 :  */
 5944 tgl                     16968 CBC      780167 : type_function_name: IDENT                           { $$ = $1; }
 7601 bruce                   16969           71539 :             | unreserved_keyword                    { $$ = pstrdup($1); }
 5944 tgl                     16970 GIC          21 :             | type_func_name_keyword                { $$ = pstrdup($1); }
                              16971                 :         ;
                              16972                 : 
 3598 tgl                     16973 ECB             : /* Any not-fully-reserved word --- these names can be, eg, role names.
                              16974                 :  */
 3598 tgl                     16975 CBC       83574 : NonReservedWord:    IDENT                           { $$ = $1; }
                              16976           26612 :             | unreserved_keyword                    { $$ = pstrdup($1); }
 3598 tgl                     16977 GIC          11 :             | col_name_keyword                      { $$ = pstrdup($1); }
 3598 tgl                     16978 CBC        1318 :             | type_func_name_keyword                { $$ = pstrdup($1); }
 3598 tgl                     16979 ECB             :         ;
                              16980                 : 
 7814                         16981                 : /* Column label --- allowed labels in "AS" clauses.
                              16982                 :  * This presently includes *all* Postgres keywords.
                              16983                 :  */
 7601 bruce                   16984 GIC     1504091 : ColLabel:   IDENT                                   { $$ = $1; }
                              16985           48765 :             | unreserved_keyword                    { $$ = pstrdup($1); }
                              16986             112 :             | col_name_keyword                      { $$ = pstrdup($1); }
 5944 tgl                     16987             855 :             | type_func_name_keyword                { $$ = pstrdup($1); }
 7601 bruce                   16988            3246 :             | reserved_keyword                      { $$ = pstrdup($1); }
                              16989                 :         ;
                              16990                 : 
                              16991                 : /* Bare column label --- names that can be column labels without writing "AS".
                              16992                 :  * This classification is orthogonal to the other keyword categories.
                              16993                 :  */
  933 tgl                     16994 CBC        1687 : BareColLabel:   IDENT                               { $$ = $1; }
                              16995               3 :             | bare_label_keyword                    { $$ = pstrdup($1); }
                              16996                 :         ;
                              16997                 : 
                              16998                 : 
                              16999                 : /*
                              17000                 :  * Keyword category lists.  Generally, every keyword present in
                              17001                 :  * the Postgres grammar should appear in exactly one of these lists.
                              17002                 :  *
                              17003                 :  * Put a new keyword into the first list that it can go into without causing
                              17004                 :  * shift or reduce conflicts.  The earlier lists define "less reserved"
                              17005                 :  * categories of keywords.
                              17006                 :  *
                              17007                 :  * Make sure that each keyword's category in kwlist.h matches where
 5774 tgl                     17008 ECB             :  * it is listed here.  (Someday we may be able to generate these lists and
                              17009                 :  * kwlist.h's table from one source of truth.)
                              17010                 :  */
                              17011                 : 
 7814                         17012                 : /* "Unreserved" keywords --- available for use as any kind of name.
                              17013                 :  */
                              17014                 : unreserved_keyword:
                              17015                 :               ABORT_P
                              17016                 :             | ABSENT
                              17017                 :             | ABSOLUTE_P
 7601 bruce                   17018                 :             | ACCESS
                              17019                 :             | ACTION
 6312                         17020                 :             | ADD_P
                              17021                 :             | ADMIN
                              17022                 :             | AFTER
                              17023                 :             | AGGREGATE
 6845 tgl                     17024                 :             | ALSO
                              17025                 :             | ALTER
 5865 JanWieck                17026                 :             | ALWAYS
                              17027                 :             | ASENSITIVE
 7601 bruce                   17028                 :             | ASSERTION
                              17029                 :             | ASSIGNMENT
                              17030                 :             | AT
                              17031                 :             | ATOMIC
                              17032                 :             | ATTACH
                              17033                 :             | ATTRIBUTE
                              17034                 :             | BACKWARD
                              17035                 :             | BEFORE
                              17036                 :             | BEGIN_P
                              17037                 :             | BREADTH
                              17038                 :             | BY
                              17039                 :             | CACHE
                              17040                 :             | CALL
                              17041                 :             | CALLED
                              17042                 :             | CASCADE
                              17043                 :             | CASCADED
                              17044                 :             | CATALOG_P
                              17045                 :             | CHAIN
                              17046                 :             | CHARACTERISTICS
                              17047                 :             | CHECKPOINT
                              17048                 :             | CLASS
                              17049                 :             | CLOSE
                              17050                 :             | CLUSTER
                              17051                 :             | COLUMNS
                              17052                 :             | COMMENT
 4927 andrew                  17053                 :             | COMMENTS
                              17054                 :             | COMMIT
                              17055                 :             | COMMITTED
                              17056                 :             | COMPRESSION
 5710 tgl                     17057                 :             | CONFIGURATION
                              17058                 :             | CONFLICT
                              17059                 :             | CONNECTION
                              17060                 :             | CONSTRAINTS
 5950                         17061                 :             | CONTENT_P
                              17062                 :             | CONTINUE_P
                              17063                 :             | CONVERSION_P
                              17064                 :             | COPY
 5921                         17065                 :             | COST
                              17066                 :             | CSV
                              17067                 :             | CUBE
                              17068                 :             | CURRENT_P
                              17069                 :             | CURSOR
                              17070                 :             | CYCLE
                              17071                 :             | DATA_P
                              17072                 :             | DATABASE
                              17073                 :             | DAY_P
 7530                         17074                 :             | DEALLOCATE
                              17075                 :             | DECLARE
                              17076                 :             | DEFAULTS
                              17077                 :             | DEFERRED
                              17078                 :             | DEFINER
 7601 bruce                   17079                 :             | DELETE_P
                              17080                 :             | DELIMITER
                              17081                 :             | DELIMITERS
 2560 alvherre                17082                 :             | DEPENDS
                              17083                 :             | DEPTH
                              17084                 :             | DETACH
                              17085                 :             | DICTIONARY
                              17086                 :             | DISABLE_P
 5827 neilc                   17087 EUB             :             | DISCARD
                              17088                 :             | DOCUMENT_P
                              17089                 :             | DOMAIN_P
                              17090                 :             | DOUBLE_P
                              17091                 :             | DROP
                              17092                 :             | EACH
                              17093                 :             | ENABLE_P
                              17094                 :             | ENCODING
                              17095                 :             | ENCRYPTED
 5851 tgl                     17096                 :             | ENUM_P
                              17097                 :             | ESCAPE
 3847                         17098                 :             | EVENT
                              17099                 :             | EXCLUDE
 7228 bruce                   17100                 :             | EXCLUDING
 7601                         17101                 :             | EXCLUSIVE
                              17102                 :             | EXECUTE
                              17103                 :             | EXPLAIN
                              17104                 :             | EXPRESSION
                              17105                 :             | EXTENSION
                              17106                 :             | EXTERNAL
 5920 tgl                     17107                 :             | FAMILY
                              17108                 :             | FILTER
                              17109                 :             | FINALIZE
                              17110                 :             | FIRST_P
                              17111                 :             | FOLLOWING
 7601 bruce                   17112                 :             | FORCE
                              17113                 :             | FORMAT
                              17114                 :             | FORWARD
                              17115                 :             | FUNCTION
                              17116                 :             | FUNCTIONS
                              17117                 :             | GENERATED
                              17118                 :             | GLOBAL
 6494 tgl                     17119 ECB             :             | GRANTED
                              17120                 :             | GROUPS
                              17121                 :             | HANDLER
                              17122                 :             | HEADER_P
 7285                         17123                 :             | HOLD
                              17124                 :             | HOUR_P
 5441                         17125                 :             | IDENTITY_P
 6350 andrew                  17126                 :             | IF_P
                              17127                 :             | IMMEDIATE
                              17128                 :             | IMMUTABLE
                              17129                 :             | IMPLICIT_P
 3195 tgl                     17130                 :             | IMPORT_P
                              17131                 :             | INCLUDE
 7228 bruce                   17132                 :             | INCLUDING
                              17133                 :             | INCREMENT
                              17134                 :             | INDENT
 7601                         17135                 :             | INDEX
                              17136                 :             | INDEXES
                              17137                 :             | INHERIT
                              17138                 :             | INHERITS
 4947 tgl                     17139                 :             | INLINE_P
                              17140                 :             | INPUT_P
                              17141                 :             | INSENSITIVE
                              17142                 :             | INSERT
 7601 bruce                   17143                 :             | INSTEAD
                              17144                 :             | INVOKER
                              17145                 :             | ISOLATION
                              17146                 :             | JSON
                              17147                 :             | KEY
                              17148                 :             | KEYS
 4577 rhaas                   17149                 :             | LABEL
                              17150                 :             | LANGUAGE
                              17151                 :             | LARGE_P
                              17152                 :             | LAST_P
 4073                         17153                 :             | LEAKPROOF
 7601 bruce                   17154                 :             | LEVEL
                              17155                 :             | LISTEN
                              17156                 :             | LOAD
 7601 bruce                   17157 EUB             :             | LOCAL
 7601 bruce                   17158 ECB             :             | LOCATION
                              17159                 :             | LOCK_P
                              17160                 :             | LOCKED
                              17161                 :             | LOGGED
                              17162                 :             | MAPPING
                              17163                 :             | MATCH
  377 alvherre                17164                 :             | MATCHED
                              17165                 :             | MATERIALIZED
 7601 bruce                   17166                 :             | MAXVALUE
                              17167                 :             | MERGE
 2573 alvherre                17168                 :             | METHOD
 7601 bruce                   17169                 :             | MINUTE_P
                              17170                 :             | MINVALUE
                              17171                 :             | MODE
                              17172                 :             | MONTH_P
                              17173                 :             | MOVE
                              17174                 :             | NAME_P
                              17175                 :             | NAMES
                              17176                 :             | NEW
                              17177                 :             | NEXT
 1109 peter                   17178                 :             | NFC
                              17179                 :             | NFD
                              17180                 :             | NFKC
                              17181                 :             | NFKD
                              17182                 :             | NO
                              17183                 :             | NORMALIZED
                              17184                 :             | NOTHING
 7601 bruce                   17185                 :             | NOTIFY
 6764 tgl                     17186                 :             | NOWAIT
                              17187                 :             | NULLS_P
                              17188                 :             | OBJECT_P
                              17189                 :             | OF
                              17190                 :             | OFF
                              17191                 :             | OIDS
 2347 kgrittn                 17192                 :             | OLD
 7601 bruce                   17193                 :             | OPERATOR
                              17194                 :             | OPTION
                              17195                 :             | OPTIONS
                              17196                 :             | ORDINALITY
                              17197                 :             | OTHERS
                              17198                 :             | OVER
                              17199                 :             | OVERRIDING
                              17200                 :             | OWNED
                              17201                 :             | OWNER
                              17202                 :             | PARALLEL
                              17203                 :             | PARAMETER
                              17204                 :             | PARSER
                              17205                 :             | PARTIAL
                              17206                 :             | PARTITION
                              17207                 :             | PASSING
                              17208                 :             | PASSWORD
                              17209                 :             | PLANS
                              17210                 :             | POLICY
 5212 tgl                     17211                 :             | PRECEDING
                              17212                 :             | PREPARE
 6505                         17213                 :             | PREPARED
 7456 bruce                   17214                 :             | PRESERVE
                              17215                 :             | PRIOR
 7601                         17216                 :             | PRIVILEGES
                              17217                 :             | PROCEDURAL
                              17218                 :             | PROCEDURE
                              17219                 :             | PROCEDURES
                              17220                 :             | PROGRAM
                              17221                 :             | PUBLICATION
                              17222                 :             | QUOTE
                              17223                 :             | RANGE
                              17224                 :             | READ
                              17225                 :             | REASSIGN
 7559 tgl                     17226                 :             | RECHECK
 5300                         17227                 :             | RECURSIVE
                              17228                 :             | REF_P
 2347 kgrittn                 17229                 :             | REFERENCING
                              17230                 :             | REFRESH
                              17231                 :             | REINDEX
                              17232                 :             | RELATIVE_P
 6830 tgl                     17233                 :             | RELEASE
                              17234                 :             | RENAME
                              17235                 :             | REPEATABLE
                              17236                 :             | REPLACE
 5865 JanWieck                17237                 :             | REPLICA
                              17238                 :             | RESET
                              17239                 :             | RESTART
                              17240                 :             | RESTRICT
  732 peter                   17241                 :             | RETURN
                              17242                 :             | RETURNS
                              17243                 :             | REVOKE
                              17244                 :             | ROLE
                              17245                 :             | ROLLBACK
 2885 andres                  17246                 :             | ROLLUP
                              17247                 :             | ROUTINE
 1956 peter_e                 17248                 :             | ROUTINES
                              17249                 :             | ROWS
                              17250                 :             | RULE
                              17251                 :             | SAVEPOINT
                              17252                 :             | SCALAR
                              17253                 :             | SCHEMA
                              17254                 :             | SCHEMAS
                              17255                 :             | SCROLL
                              17256                 :             | SEARCH
                              17257                 :             | SECOND_P
                              17258                 :             | SECURITY
                              17259                 :             | SEQUENCE
                              17260                 :             | SEQUENCES
                              17261                 :             | SERIALIZABLE
                              17262                 :             | SERVER
                              17263                 :             | SESSION
                              17264                 :             | SET
                              17265                 :             | SETS
                              17266                 :             | SHARE
 7601 bruce                   17267                 :             | SHOW
                              17268                 :             | SIMPLE
 3106 alvherre                17269                 :             | SKIP
 4077 heikki.linnakangas      17270                 :             | SNAPSHOT
 2905 peter_e                 17271                 :             | SQL_P
 7601 bruce                   17272                 :             | STABLE
 5950 tgl                     17273                 :             | STANDALONE_P
 7601 bruce                   17274                 :             | START
                              17275                 :             | STATEMENT
                              17276                 :             | STATISTICS
                              17277                 :             | STDIN
                              17278                 :             | STDOUT
                              17279                 :             | STORAGE
 1471 peter                   17280                 :             | STORED
 5950 tgl                     17281                 :             | STRICT_P
                              17282                 :             | STRIP_P
 2271 peter_e                 17283                 :             | SUBSCRIPTION
 1520 tgl                     17284 EUB             :             | SUPPORT
                              17285                 :             | SYSID
                              17286                 :             | SYSTEM_P
 4927 tgl                     17287 ECB             :             | TABLES
                              17288                 :             | TABLESPACE
 7601 bruce                   17289                 :             | TEMP
                              17290                 :             | TEMPLATE
                              17291                 :             | TEMPORARY
                              17292                 :             | TEXT_P
                              17293                 :             | TIES
                              17294                 :             | TRANSACTION
                              17295                 :             | TRANSFORM
                              17296                 :             | TRIGGER
                              17297                 :             | TRUNCATE
                              17298                 :             | TRUSTED
                              17299                 :             | TYPE_P
 4077 heikki.linnakangas      17300                 :             | TYPES_P
                              17301                 :             | UESCAPE
 5212 tgl                     17302                 :             | UNBOUNDED
 7094 peter_e                 17303                 :             | UNCOMMITTED
                              17304                 :             | UNENCRYPTED
 7601 bruce                   17305                 :             | UNKNOWN
                              17306                 :             | UNLISTEN
 4484 rhaas                   17307                 :             | UNLOGGED
                              17308                 :             | UNTIL
                              17309                 :             | UPDATE
                              17310                 :             | VACUUM
 7601 bruce                   17311                 :             | VALID
 4415 tgl                     17312                 :             | VALIDATE
                              17313                 :             | VALIDATOR
                              17314                 :             | VALUE_P
                              17315                 :             | VARYING
                              17316                 :             | VERSION_P
                              17317                 :             | VIEW
                              17318                 :             | VIEWS
                              17319                 :             | VOLATILE
                              17320                 :             | WHITESPACE_P
                              17321                 :             | WITHIN
                              17322                 :             | WITHOUT
                              17323                 :             | WORK
                              17324                 :             | WRAPPER
                              17325                 :             | WRITE
                              17326                 :             | XML_P
                              17327                 :             | YEAR_P
                              17328                 :             | YES_P
                              17329                 :             | ZONE
                              17330                 :         ;
                              17331                 : 
                              17332                 : /* Column identifier --- keywords that can be column, table, etc names.
 7820                         17333                 :  *
 7814                         17334                 :  * Many of these keywords will in fact be recognized as type or function
                              17335                 :  * names too; but they have special productions for the purpose, and so
                              17336                 :  * can't be treated as "generic" type or function names.
                              17337                 :  *
                              17338                 :  * The type names appearing here are not usable as function names
                              17339                 :  * because they can be followed by '(' in typename productions, which
                              17340                 :  * looks too much like a function call for an LR(1) parser.
 7820                         17341                 :  */
 7814                         17342                 : col_name_keyword:
                              17343                 :               BETWEEN
                              17344                 :             | BIGINT
                              17345                 :             | BIT
                              17346                 :             | BOOLEAN_P
 7601 bruce                   17347                 :             | CHAR_P
                              17348                 :             | CHARACTER
                              17349                 :             | COALESCE
                              17350                 :             | DEC
                              17351                 :             | DECIMAL_P
                              17352                 :             | EXISTS
                              17353                 :             | EXTRACT
                              17354                 :             | FLOAT_P
                              17355                 :             | GREATEST
 2885 andres                  17356                 :             | GROUPING
 7033 tgl                     17357                 :             | INOUT
 7269 bruce                   17358                 :             | INT_P
 7601                         17359                 :             | INTEGER
                              17360                 :             | INTERVAL
                              17361                 :             | JSON_ARRAY
                              17362                 :             | JSON_ARRAYAGG
                              17363                 :             | JSON_OBJECT
                              17364                 :             | JSON_OBJECTAGG
                              17365                 :             | LEAST
                              17366                 :             | NATIONAL
                              17367                 :             | NCHAR
                              17368                 :             | NONE
                              17369                 :             | NORMALIZE
                              17370                 :             | NULLIF
                              17371                 :             | NUMERIC
                              17372                 :             | OUT_P
                              17373                 :             | OVERLAY
                              17374                 :             | POSITION
                              17375                 :             | PRECISION
                              17376                 :             | REAL
                              17377                 :             | ROW
                              17378                 :             | SETOF
                              17379                 :             | SMALLINT
                              17380                 :             | SUBSTRING
                              17381                 :             | TIME
                              17382                 :             | TIMESTAMP
                              17383                 :             | TREAT
                              17384                 :             | TRIM
                              17385                 :             | VALUES
                              17386                 :             | VARCHAR
                              17387                 :             | XMLATTRIBUTES
                              17388                 :             | XMLCONCAT
                              17389                 :             | XMLELEMENT
                              17390                 :             | XMLEXISTS
                              17391                 :             | XMLFOREST
                              17392                 :             | XMLNAMESPACES
                              17393                 :             | XMLPARSE
                              17394                 :             | XMLPI
                              17395                 :             | XMLROOT
                              17396                 :             | XMLSERIALIZE
                              17397                 :             | XMLTABLE
                              17398                 :         ;
                              17399                 : 
                              17400                 : /* Type/function identifier --- keywords that can be type or function names.
                              17401                 :  *
                              17402                 :  * Most of these are keywords that are used as operators in expressions;
                              17403                 :  * in general such keywords can't be column names because they would be
                              17404                 :  * ambiguous with variables, but they are unambiguous as function identifiers.
                              17405                 :  *
                              17406                 :  * Do not include POSITION, SUBSTRING, etc here since they have explicit
                              17407                 :  * productions in a_expr to support the goofy SQL9x argument syntax.
                              17408                 :  * - thomas 2000-11-28
                              17409                 :  */
                              17410                 : type_func_name_keyword:
                              17411                 :               AUTHORIZATION
                              17412                 :             | BINARY
                              17413                 :             | COLLATION
                              17414                 :             | CONCURRENTLY
                              17415                 :             | CROSS
                              17416                 :             | CURRENT_SCHEMA
                              17417                 :             | FREEZE
                              17418                 :             | FULL
                              17419                 :             | ILIKE
                              17420                 :             | INNER_P
                              17421                 :             | IS
                              17422                 :             | ISNULL
                              17423                 :             | JOIN
                              17424                 :             | LEFT
                              17425                 :             | LIKE
                              17426                 :             | NATURAL
                              17427                 :             | NOTNULL
                              17428                 :             | OUTER_P
                              17429                 :             | OVERLAPS
                              17430                 :             | RIGHT
                              17431                 :             | SIMILAR
                              17432                 :             | TABLESAMPLE
                              17433                 :             | VERBOSE
                              17434                 :         ;
                              17435                 : 
                              17436                 : /* Reserved keyword --- these keywords are usable only as a ColLabel.
                              17437                 :  *
                              17438                 :  * Keywords appear here if they could not be distinguished from variable,
                              17439                 :  * type, or function names in some contexts.  Don't put things here unless
                              17440                 :  * forced to.
                              17441                 :  */
                              17442                 : reserved_keyword:
                              17443                 :               ALL
                              17444                 :             | ANALYSE
                              17445                 :             | ANALYZE
                              17446                 :             | AND
                              17447                 :             | ANY
                              17448                 :             | ARRAY
                              17449                 :             | AS
                              17450                 :             | ASC
                              17451                 :             | ASYMMETRIC
                              17452                 :             | BOTH
                              17453                 :             | CASE
                              17454                 :             | CAST
                              17455                 :             | CHECK
                              17456                 :             | COLLATE
                              17457                 :             | COLUMN
                              17458                 :             | CONSTRAINT
                              17459                 :             | CREATE
                              17460                 :             | CURRENT_CATALOG
                              17461                 :             | CURRENT_DATE
                              17462                 :             | CURRENT_ROLE
                              17463                 :             | CURRENT_TIME
                              17464                 :             | CURRENT_TIMESTAMP
                              17465                 :             | CURRENT_USER
                              17466                 :             | DEFAULT
                              17467                 :             | DEFERRABLE
                              17468                 :             | DESC
                              17469                 :             | DISTINCT
                              17470                 :             | DO
                              17471                 :             | ELSE
                              17472                 :             | END_P
                              17473                 :             | EXCEPT
                              17474                 :             | FALSE_P
                              17475                 :             | FETCH
                              17476                 :             | FOR
                              17477                 :             | FOREIGN
                              17478                 :             | FROM
                              17479                 :             | GRANT
                              17480                 :             | GROUP_P
                              17481                 :             | HAVING
                              17482                 :             | IN_P
                              17483                 :             | INITIALLY
                              17484                 :             | INTERSECT
                              17485                 :             | INTO
                              17486                 :             | LATERAL_P
                              17487                 :             | LEADING
                              17488                 :             | LIMIT
                              17489                 :             | LOCALTIME
                              17490                 :             | LOCALTIMESTAMP
                              17491                 :             | NOT
                              17492                 :             | NULL_P
                              17493                 :             | OFFSET
                              17494                 :             | ON
                              17495                 :             | ONLY
                              17496                 :             | OR
                              17497                 :             | ORDER
                              17498                 :             | PLACING
                              17499                 :             | PRIMARY
                              17500                 :             | REFERENCES
                              17501                 :             | RETURNING
                              17502                 :             | SELECT
                              17503                 :             | SESSION_USER
                              17504                 :             | SOME
                              17505                 :             | SYMMETRIC
                              17506                 :             | SYSTEM_USER
                              17507                 :             | TABLE
                              17508                 :             | THEN
                              17509                 :             | TO
                              17510                 :             | TRAILING
                              17511                 :             | TRUE_P
                              17512                 :             | UNION
                              17513                 :             | UNIQUE
                              17514                 :             | USER
                              17515                 :             | USING
                              17516                 :             | VARIADIC
                              17517                 :             | WHEN
                              17518                 :             | WHERE
                              17519                 :             | WINDOW
                              17520                 :             | WITH
                              17521                 :         ;
                              17522                 : 
                              17523                 : /*
                              17524                 :  * While all keywords can be used as column labels when preceded by AS,
                              17525                 :  * not all of them can be used as a "bare" column label without AS.
                              17526                 :  * Those that can be used as a bare label must be listed here,
                              17527                 :  * in addition to appearing in one of the category lists above.
                              17528                 :  *
                              17529                 :  * Always add a new keyword to this list if possible.  Mark it BARE_LABEL
                              17530                 :  * in kwlist.h if it is included here, or AS_LABEL if it is not.
                              17531                 :  */
                              17532                 : bare_label_keyword:
                              17533                 :               ABORT_P
                              17534                 :             | ABSENT
                              17535                 :             | ABSOLUTE_P
                              17536                 :             | ACCESS
                              17537                 :             | ACTION
                              17538                 :             | ADD_P
                              17539                 :             | ADMIN
                              17540                 :             | AFTER
                              17541                 :             | AGGREGATE
                              17542                 :             | ALL
                              17543                 :             | ALSO
                              17544                 :             | ALTER
                              17545                 :             | ALWAYS
                              17546                 :             | ANALYSE
                              17547                 :             | ANALYZE
                              17548                 :             | AND
                              17549                 :             | ANY
                              17550                 :             | ASC
                              17551                 :             | ASENSITIVE
                              17552                 :             | ASSERTION
                              17553                 :             | ASSIGNMENT
                              17554                 :             | ASYMMETRIC
                              17555                 :             | AT
                              17556                 :             | ATOMIC
                              17557                 :             | ATTACH
                              17558                 :             | ATTRIBUTE
                              17559                 :             | AUTHORIZATION
                              17560                 :             | BACKWARD
                              17561                 :             | BEFORE
                              17562                 :             | BEGIN_P
                              17563                 :             | BETWEEN
                              17564                 :             | BIGINT
                              17565                 :             | BINARY
                              17566                 :             | BIT
                              17567                 :             | BOOLEAN_P
                              17568                 :             | BOTH
                              17569                 :             | BREADTH
                              17570                 :             | BY
                              17571                 :             | CACHE
                              17572                 :             | CALL
                              17573                 :             | CALLED
                              17574                 :             | CASCADE
                              17575                 :             | CASCADED
                              17576                 :             | CASE
                              17577                 :             | CAST
                              17578                 :             | CATALOG_P
                              17579                 :             | CHAIN
                              17580                 :             | CHARACTERISTICS
                              17581                 :             | CHECK
                              17582                 :             | CHECKPOINT
                              17583                 :             | CLASS
                              17584                 :             | CLOSE
                              17585                 :             | CLUSTER
                              17586                 :             | COALESCE
                              17587                 :             | COLLATE
                              17588                 :             | COLLATION
                              17589                 :             | COLUMN
                              17590                 :             | COLUMNS
                              17591                 :             | COMMENT
                              17592                 :             | COMMENTS
                              17593                 :             | COMMIT
                              17594                 :             | COMMITTED
                              17595                 :             | COMPRESSION
                              17596                 :             | CONCURRENTLY
                              17597                 :             | CONFIGURATION
                              17598                 :             | CONFLICT
                              17599                 :             | CONNECTION
                              17600                 :             | CONSTRAINT
                              17601                 :             | CONSTRAINTS
                              17602                 :             | CONTENT_P
                              17603                 :             | CONTINUE_P
                              17604                 :             | CONVERSION_P
                              17605                 :             | COPY
                              17606                 :             | COST
                              17607                 :             | CROSS
                              17608                 :             | CSV
                              17609                 :             | CUBE
                              17610                 :             | CURRENT_P
                              17611                 :             | CURRENT_CATALOG
                              17612                 :             | CURRENT_DATE
                              17613                 :             | CURRENT_ROLE
                              17614                 :             | CURRENT_SCHEMA
                              17615                 :             | CURRENT_TIME
                              17616                 :             | CURRENT_TIMESTAMP
                              17617                 :             | CURRENT_USER
                              17618                 :             | CURSOR
                              17619                 :             | CYCLE
                              17620                 :             | DATA_P
                              17621                 :             | DATABASE
                              17622                 :             | DEALLOCATE
                              17623                 :             | DEC
                              17624                 :             | DECIMAL_P
                              17625                 :             | DECLARE
                              17626                 :             | DEFAULT
                              17627                 :             | DEFAULTS
                              17628                 :             | DEFERRABLE
                              17629                 :             | DEFERRED
                              17630                 :             | DEFINER
                              17631                 :             | DELETE_P
                              17632                 :             | DELIMITER
                              17633                 :             | DELIMITERS
                              17634                 :             | DEPENDS
                              17635                 :             | DEPTH
                              17636                 :             | DESC
                              17637                 :             | DETACH
                              17638                 :             | DICTIONARY
                              17639                 :             | DISABLE_P
                              17640                 :             | DISCARD
                              17641                 :             | DISTINCT
                              17642                 :             | DO
                              17643                 :             | DOCUMENT_P
                              17644                 :             | DOMAIN_P
                              17645                 :             | DOUBLE_P
                              17646                 :             | DROP
                              17647                 :             | EACH
                              17648                 :             | ELSE
                              17649                 :             | ENABLE_P
                              17650                 :             | ENCODING
                              17651                 :             | ENCRYPTED
                              17652                 :             | END_P
                              17653                 :             | ENUM_P
                              17654                 :             | ESCAPE
                              17655                 :             | EVENT
                              17656                 :             | EXCLUDE
                              17657                 :             | EXCLUDING
                              17658                 :             | EXCLUSIVE
                              17659                 :             | EXECUTE
                              17660                 :             | EXISTS
                              17661                 :             | EXPLAIN
                              17662                 :             | EXPRESSION
                              17663                 :             | EXTENSION
                              17664                 :             | EXTERNAL
                              17665                 :             | EXTRACT
                              17666                 :             | FALSE_P
                              17667                 :             | FAMILY
                              17668                 :             | FINALIZE
                              17669                 :             | FIRST_P
                              17670                 :             | FLOAT_P
                              17671                 :             | FOLLOWING
                              17672                 :             | FORCE
                              17673                 :             | FOREIGN
                              17674                 :             | FORMAT
                              17675                 :             | FORWARD
                              17676                 :             | FREEZE
                              17677                 :             | FULL
                              17678                 :             | FUNCTION
                              17679                 :             | FUNCTIONS
                              17680                 :             | GENERATED
                              17681                 :             | GLOBAL
                              17682                 :             | GRANTED
                              17683                 :             | GREATEST
                              17684                 :             | GROUPING
                              17685                 :             | GROUPS
                              17686                 :             | HANDLER
                              17687                 :             | HEADER_P
                              17688                 :             | HOLD
                              17689                 :             | IDENTITY_P
                              17690                 :             | IF_P
                              17691                 :             | ILIKE
                              17692                 :             | IMMEDIATE
                              17693                 :             | IMMUTABLE
                              17694                 :             | IMPLICIT_P
                              17695                 :             | IMPORT_P
                              17696                 :             | IN_P
                              17697                 :             | INCLUDE
                              17698                 :             | INCLUDING
                              17699                 :             | INCREMENT
                              17700                 :             | INDENT
                              17701                 :             | INDEX
                              17702                 :             | INDEXES
                              17703                 :             | INHERIT
                              17704                 :             | INHERITS
                              17705                 :             | INITIALLY
                              17706                 :             | INLINE_P
                              17707                 :             | INNER_P
                              17708                 :             | INOUT
                              17709                 :             | INPUT_P
                              17710                 :             | INSENSITIVE
                              17711                 :             | INSERT
                              17712                 :             | INSTEAD
                              17713                 :             | INT_P
                              17714                 :             | INTEGER
                              17715                 :             | INTERVAL
                              17716                 :             | INVOKER
                              17717                 :             | IS
                              17718                 :             | ISOLATION
                              17719                 :             | JOIN
                              17720                 :             | JSON
                              17721                 :             | JSON_ARRAY
                              17722                 :             | JSON_ARRAYAGG
                              17723                 :             | JSON_OBJECT
                              17724                 :             | JSON_OBJECTAGG
                              17725                 :             | KEY
                              17726                 :             | KEYS
                              17727                 :             | LABEL
                              17728                 :             | LANGUAGE
                              17729                 :             | LARGE_P
                              17730                 :             | LAST_P
                              17731                 :             | LATERAL_P
                              17732                 :             | LEADING
                              17733                 :             | LEAKPROOF
                              17734                 :             | LEAST
                              17735                 :             | LEFT
                              17736                 :             | LEVEL
                              17737                 :             | LIKE
                              17738                 :             | LISTEN
                              17739                 :             | LOAD
                              17740                 :             | LOCAL
                              17741                 :             | LOCALTIME
                              17742                 :             | LOCALTIMESTAMP
                              17743                 :             | LOCATION
                              17744                 :             | LOCK_P
                              17745                 :             | LOCKED
                              17746                 :             | LOGGED
                              17747                 :             | MAPPING
                              17748                 :             | MATCH
                              17749                 :             | MATCHED
                              17750                 :             | MATERIALIZED
                              17751                 :             | MAXVALUE
                              17752                 :             | MERGE
                              17753                 :             | METHOD
                              17754                 :             | MINVALUE
                              17755                 :             | MODE
                              17756                 :             | MOVE
                              17757                 :             | NAME_P
                              17758                 :             | NAMES
                              17759                 :             | NATIONAL
                              17760                 :             | NATURAL
                              17761                 :             | NCHAR
                              17762                 :             | NEW
                              17763                 :             | NEXT
                              17764                 :             | NFC
                              17765                 :             | NFD
                              17766                 :             | NFKC
                              17767                 :             | NFKD
                              17768                 :             | NO
                              17769                 :             | NONE
                              17770                 :             | NORMALIZE
                              17771                 :             | NORMALIZED
                              17772                 :             | NOT
                              17773                 :             | NOTHING
                              17774                 :             | NOTIFY
                              17775                 :             | NOWAIT
                              17776                 :             | NULL_P
                              17777                 :             | NULLIF
                              17778                 :             | NULLS_P
                              17779                 :             | NUMERIC
                              17780                 :             | OBJECT_P
                              17781                 :             | OF
                              17782                 :             | OFF
                              17783                 :             | OIDS
                              17784                 :             | OLD
                              17785                 :             | ONLY
                              17786                 :             | OPERATOR
                              17787                 :             | OPTION
                              17788                 :             | OPTIONS
                              17789                 :             | OR
                              17790                 :             | ORDINALITY
                              17791                 :             | OTHERS
                              17792                 :             | OUT_P
                              17793                 :             | OUTER_P
                              17794                 :             | OVERLAY
                              17795                 :             | OVERRIDING
                              17796                 :             | OWNED
                              17797                 :             | OWNER
                              17798                 :             | PARALLEL
                              17799                 :             | PARAMETER
                              17800                 :             | PARSER
                              17801                 :             | PARTIAL
                              17802                 :             | PARTITION
                              17803                 :             | PASSING
                              17804                 :             | PASSWORD
                              17805                 :             | PLACING
                              17806                 :             | PLANS
                              17807                 :             | POLICY
                              17808                 :             | POSITION
                              17809                 :             | PRECEDING
                              17810                 :             | PREPARE
                              17811                 :             | PREPARED
                              17812                 :             | PRESERVE
                              17813                 :             | PRIMARY
                              17814                 :             | PRIOR
                              17815                 :             | PRIVILEGES
                              17816                 :             | PROCEDURAL
                              17817                 :             | PROCEDURE
                              17818                 :             | PROCEDURES
                              17819                 :             | PROGRAM
                              17820                 :             | PUBLICATION
                              17821                 :             | QUOTE
                              17822                 :             | RANGE
                              17823                 :             | READ
                              17824                 :             | REAL
                              17825                 :             | REASSIGN
                              17826                 :             | RECHECK
                              17827                 :             | RECURSIVE
                              17828                 :             | REF_P
                              17829                 :             | REFERENCES
                              17830                 :             | REFERENCING
                              17831                 :             | REFRESH
                              17832                 :             | REINDEX
                              17833                 :             | RELATIVE_P
                              17834                 :             | RELEASE
                              17835                 :             | RENAME
                              17836                 :             | REPEATABLE
                              17837                 :             | REPLACE
                              17838                 :             | REPLICA
                              17839                 :             | RESET
                              17840                 :             | RESTART
                              17841                 :             | RESTRICT
                              17842                 :             | RETURN
                              17843                 :             | RETURNS
                              17844                 :             | REVOKE
                              17845                 :             | RIGHT
                              17846                 :             | ROLE
                              17847                 :             | ROLLBACK
                              17848                 :             | ROLLUP
                              17849                 :             | ROUTINE
                              17850                 :             | ROUTINES
                              17851                 :             | ROW
                              17852                 :             | ROWS
                              17853                 :             | RULE
                              17854                 :             | SAVEPOINT
                              17855                 :             | SCALAR
                              17856                 :             | SCHEMA
                              17857                 :             | SCHEMAS
                              17858                 :             | SCROLL
                              17859                 :             | SEARCH
                              17860                 :             | SECURITY
                              17861                 :             | SELECT
                              17862                 :             | SEQUENCE
                              17863                 :             | SEQUENCES
                              17864                 :             | SERIALIZABLE
                              17865                 :             | SERVER
                              17866                 :             | SESSION
                              17867                 :             | SESSION_USER
                              17868                 :             | SET
                              17869                 :             | SETOF
                              17870                 :             | SETS
                              17871                 :             | SHARE
                              17872                 :             | SHOW
                              17873                 :             | SIMILAR
                              17874                 :             | SIMPLE
                              17875                 :             | SKIP
                              17876                 :             | SMALLINT
                              17877                 :             | SNAPSHOT
                              17878                 :             | SOME
                              17879                 :             | SQL_P
                              17880                 :             | STABLE
                              17881                 :             | STANDALONE_P
                              17882                 :             | START
                              17883                 :             | STATEMENT
                              17884                 :             | STATISTICS
                              17885                 :             | STDIN
                              17886                 :             | STDOUT
                              17887                 :             | STORAGE
                              17888                 :             | STORED
                              17889                 :             | STRICT_P
                              17890                 :             | STRIP_P
                              17891                 :             | SUBSCRIPTION
                              17892                 :             | SUBSTRING
                              17893                 :             | SUPPORT
                              17894                 :             | SYMMETRIC
                              17895                 :             | SYSID
                              17896                 :             | SYSTEM_P
                              17897                 :             | SYSTEM_USER
                              17898                 :             | TABLE
                              17899                 :             | TABLES
                              17900                 :             | TABLESAMPLE
                              17901                 :             | TABLESPACE
                              17902                 :             | TEMP
                              17903                 :             | TEMPLATE
                              17904                 :             | TEMPORARY
                              17905                 :             | TEXT_P
                              17906                 :             | THEN
                              17907                 :             | TIES
                              17908                 :             | TIME
                              17909                 :             | TIMESTAMP
                              17910                 :             | TRAILING
                              17911                 :             | TRANSACTION
                              17912                 :             | TRANSFORM
                              17913                 :             | TREAT
                              17914                 :             | TRIGGER
                              17915                 :             | TRIM
                              17916                 :             | TRUE_P
                              17917                 :             | TRUNCATE
                              17918                 :             | TRUSTED
                              17919                 :             | TYPE_P
                              17920                 :             | TYPES_P
                              17921                 :             | UESCAPE
                              17922                 :             | UNBOUNDED
                              17923                 :             | UNCOMMITTED
                              17924                 :             | UNENCRYPTED
                              17925                 :             | UNIQUE
                              17926                 :             | UNKNOWN
                              17927                 :             | UNLISTEN
                              17928                 :             | UNLOGGED
                              17929                 :             | UNTIL
                              17930                 :             | UPDATE
                              17931                 :             | USER
                              17932                 :             | USING
                              17933                 :             | VACUUM
                              17934                 :             | VALID
                              17935                 :             | VALIDATE
                              17936                 :             | VALIDATOR
                              17937                 :             | VALUE_P
                              17938                 :             | VALUES
                              17939                 :             | VARCHAR
                              17940                 :             | VARIADIC
                              17941                 :             | VERBOSE
                              17942                 :             | VERSION_P
                              17943                 :             | VIEW
                              17944                 :             | VIEWS
                              17945                 :             | VOLATILE
                              17946                 :             | WHEN
                              17947                 :             | WHITESPACE_P
                              17948                 :             | WORK
                              17949                 :             | WRAPPER
                              17950                 :             | WRITE
                              17951                 :             | XML_P
                              17952                 :             | XMLATTRIBUTES
                              17953                 :             | XMLCONCAT
                              17954                 :             | XMLELEMENT
                              17955                 :             | XMLEXISTS
                              17956                 :             | XMLFOREST
                              17957                 :             | XMLNAMESPACES
                              17958                 :             | XMLPARSE
                              17959                 :             | XMLPI
                              17960                 :             | XMLROOT
                              17961                 :             | XMLSERIALIZE
                              17962                 :             | XMLTABLE
                              17963                 :             | YES_P
                              17964                 :             | ZONE
                              17965                 :         ;
                              17966                 : 
                              17967                 : %%
                              17968                 : 
                              17969                 : /*
                              17970                 :  * The signature of this function is required by bison.  However, we
                              17971                 :  * ignore the passed yylloc and instead use the last token position
                              17972                 :  * available from the scanner.
                              17973                 :  */
                              17974                 : static void
 4899 tgl                     17975 GIC         322 : base_yyerror(YYLTYPE *yylloc, core_yyscan_t yyscanner, const char *msg)
                              17976                 : {
 5018                         17977             322 :     parser_yyerror(msg);
                              17978                 : }
                              17979                 : 
                              17980                 : static RawStmt *
 2276                         17981          540777 : makeRawStmt(Node *stmt, int stmt_location)
                              17982                 : {
                              17983          540777 :     RawStmt    *rs = makeNode(RawStmt);
                              17984                 : 
                              17985          540777 :     rs->stmt = stmt;
                              17986          540777 :     rs->stmt_location = stmt_location;
                              17987          540777 :     rs->stmt_len = 0;            /* might get changed later */
                              17988          540777 :     return rs;
                              17989                 : }
                              17990                 : 
                              17991                 : /* Adjust a RawStmt to reflect that it doesn't run to the end of the string */
                              17992                 : static void
                              17993          454229 : updateRawStmtEnd(RawStmt *rs, int end_location)
                              17994                 : {
                              17995                 :     /*
                              17996                 :      * If we already set the length, don't change it.  This is for situations
                              17997                 :      * like "select foo ;; select bar" where the same statement will be last
                              17998                 :      * in the string for more than one semicolon.
                              17999                 :      */
                              18000          454229 :     if (rs->stmt_len > 0)
                              18001               5 :         return;
                              18002                 : 
                              18003                 :     /* OK, update length of RawStmt */
                              18004          454224 :     rs->stmt_len = end_location - rs->stmt_location;
                              18005                 : }
                              18006                 : 
                              18007                 : static Node *
 5018                         18008         1358108 : makeColumnRef(char *colname, List *indirection,
                              18009                 :               int location, core_yyscan_t yyscanner)
                              18010                 : {
                              18011                 :     /*
                              18012                 :      * Generate a ColumnRef node, with an A_Indirection node added if there
                              18013                 :      * is any subscripting in the specified indirection list.  However,
                              18014                 :      * any field selection at the start of the indirection list must be
                              18015                 :      * transposed into the "fields" part of the ColumnRef node.
                              18016                 :      */
 6878                         18017         1358108 :     ColumnRef  *c = makeNode(ColumnRef);
  331 peter                   18018         1358108 :     int         nfields = 0;
                              18019                 :     ListCell   *l;
                              18020                 : 
 6235 tgl                     18021         1358108 :     c->location = location;
 6878                         18022         2307350 :     foreach(l, indirection)
                              18023                 :     {
                              18024          955685 :         if (IsA(lfirst(l), A_Indices))
                              18025                 :         {
                              18026            6443 :             A_Indirection *i = makeNode(A_Indirection);
                              18027                 : 
                              18028            6443 :             if (nfields == 0)
                              18029                 :             {
                              18030                 :                 /* easy case - all indirection goes to A_Indirection */
 5335                         18031            5607 :                 c->fields = list_make1(makeString(colname));
 5018                         18032            5607 :                 i->indirection = check_indirection(indirection, yyscanner);
                              18033                 :             }
                              18034                 :             else
                              18035                 :             {
                              18036                 :                 /* got to split the list in two */
 5335                         18037             836 :                 i->indirection = check_indirection(list_copy_tail(indirection,
                              18038                 :                                                                   nfields),
                              18039                 :                                                    yyscanner);
 6878                         18040             836 :                 indirection = list_truncate(indirection, nfields);
 5335                         18041             836 :                 c->fields = lcons(makeString(colname), indirection);
                              18042                 :             }
 6878                         18043            6443 :             i->arg = (Node *) c;
                              18044            6443 :             return (Node *) i;
                              18045                 :         }
 5335                         18046          949242 :         else if (IsA(lfirst(l), A_Star))
                              18047                 :         {
                              18048                 :             /* We only allow '*' at the end of a ColumnRef */
 1364                         18049            2099 :             if (lnext(indirection, l) != NULL)
 5018 tgl                     18050 UIC           0 :                 parser_yyerror("improper use of \"*\"");
                              18051                 :         }
 6878 tgl                     18052 GIC      949242 :         nfields++;
                              18053                 :     }
                              18054                 :     /* No subscripting, so all indirection gets added to field list */
 5335                         18055         1351665 :     c->fields = lcons(makeString(colname), indirection);
 6878                         18056         1351665 :     return (Node *) c;
                              18057                 : }
                              18058                 : 
                              18059                 : static Node *
 5337                         18060          311956 : makeTypeCast(Node *arg, TypeName *typename, int location)
                              18061                 : {
  331 peter                   18062          311956 :     TypeCast   *n = makeNode(TypeCast);
                              18063                 : 
 7582 bruce                   18064          311956 :     n->arg = arg;
 5015 peter_e                 18065          311956 :     n->typeName = typename;
 5337 tgl                     18066          311956 :     n->location = location;
 7582 bruce                   18067          311956 :     return (Node *) n;
                              18068                 : }
                              18069                 : 
                              18070                 : static Node *
 5337 tgl                     18071          498738 : makeStringConst(char *str, int location)
                              18072                 : {
  331 peter                   18073          498738 :     A_Const    *n = makeNode(A_Const);
                              18074                 : 
  577                         18075          498738 :     n->val.sval.type = T_String;
  450                         18076          498738 :     n->val.sval.sval = str;
 5337 tgl                     18077          498738 :     n->location = location;
                              18078                 : 
  331 peter                   18079          498738 :    return (Node *) n;
                              18080                 : }
                              18081                 : 
                              18082                 : static Node *
 5337 tgl                     18083            6165 : makeStringConstCast(char *str, int location, TypeName *typename)
                              18084                 : {
  331 peter                   18085            6165 :     Node       *s = makeStringConst(str, location);
                              18086                 : 
 5337 tgl                     18087            6165 :     return makeTypeCast(s, typename, -1);
                              18088                 : }
                              18089                 : 
                              18090                 : static Node *
                              18091          267775 : makeIntConst(int val, int location)
                              18092                 : {
  331 peter                   18093          267775 :     A_Const    *n = makeNode(A_Const);
                              18094                 : 
  577                         18095          267775 :     n->val.ival.type = T_Integer;
  450                         18096          267775 :     n->val.ival.ival = val;
 5337 tgl                     18097          267775 :     n->location = location;
                              18098                 : 
  331 peter                   18099          267775 :    return (Node *) n;
                              18100                 : }
                              18101                 : 
                              18102                 : static Node *
 5337 tgl                     18103            5385 : makeFloatConst(char *str, int location)
                              18104                 : {
  331 peter                   18105            5385 :     A_Const    *n = makeNode(A_Const);
                              18106                 : 
  577                         18107            5385 :     n->val.fval.type = T_Float;
  450                         18108            5385 :     n->val.fval.fval = str;
 5337 tgl                     18109            5385 :     n->location = location;
                              18110                 : 
  331 peter                   18111            5385 :    return (Node *) n;
                              18112                 : }
                              18113                 : 
                              18114                 : static Node *
  450                         18115           29657 : makeBoolAConst(bool state, int location)
                              18116                 : {
  331                         18117           29657 :     A_Const    *n = makeNode(A_Const);
                              18118                 : 
  450                         18119           29657 :     n->val.boolval.type = T_Boolean;
                              18120           29657 :     n->val.boolval.boolval = state;
                              18121           29657 :     n->location = location;
                              18122                 : 
  331                         18123           29657 :    return (Node *) n;
                              18124                 : }
                              18125                 : 
                              18126                 : static Node *
 5337 tgl                     18127            2023 : makeBitStringConst(char *str, int location)
                              18128                 : {
  331 peter                   18129            2023 :     A_Const    *n = makeNode(A_Const);
                              18130                 : 
  577                         18131            2023 :     n->val.bsval.type = T_BitString;
  450                         18132            2023 :     n->val.bsval.bsval = str;
 5337 tgl                     18133            2023 :     n->location = location;
                              18134                 : 
  331 peter                   18135            2023 :    return (Node *) n;
                              18136                 : }
                              18137                 : 
                              18138                 : static Node *
 5337 tgl                     18139           96532 : makeNullAConst(int location)
                              18140                 : {
  331 peter                   18141           96532 :     A_Const    *n = makeNode(A_Const);
                              18142                 : 
  577                         18143           96532 :     n->isnull = true;
 5337 tgl                     18144           96532 :     n->location = location;
                              18145                 : 
  331 peter                   18146           96532 :     return (Node *) n;
                              18147                 : }
                              18148                 : 
                              18149                 : static Node *
  577                         18150            1670 : makeAConst(Node *v, int location)
                              18151                 : {
                              18152                 :     Node       *n;
                              18153                 : 
 7658 lockhart                18154            1670 :     switch (v->type)
                              18155                 :     {
                              18156             109 :         case T_Float:
  450 peter                   18157             109 :             n = makeFloatConst(castNode(Float, v)->fval, location);
 7658 lockhart                18158             109 :             break;
                              18159                 : 
                              18160            1561 :         case T_Integer:
  450 peter                   18161            1561 :             n = makeIntConst(castNode(Integer, v)->ival, location);
 7658 lockhart                18162            1561 :             break;
                              18163                 : 
 7658 lockhart                18164 UIC           0 :         default:
                              18165                 :             /* currently not used */
  450 peter                   18166               0 :             Assert(false);
                              18167                 :             n = NULL;
                              18168                 :     }
                              18169                 : 
 7658 lockhart                18170 GIC        1670 :     return n;
                              18171                 : }
                              18172                 : 
                              18173                 : /* makeRoleSpec
                              18174                 :  * Create a RoleSpec with the given type
                              18175                 :  */
                              18176                 : static RoleSpec *
 2953 alvherre                18177           54858 : makeRoleSpec(RoleSpecType type, int location)
                              18178                 : {
  331 peter                   18179           54858 :     RoleSpec   *spec = makeNode(RoleSpec);
                              18180                 : 
 2953 alvherre                18181           54858 :     spec->roletype = type;
                              18182           54858 :     spec->location = location;
                              18183                 : 
 2293 peter_e                 18184           54858 :     return spec;
                              18185                 : }
                              18186                 : 
                              18187                 : /* check_qualified_name --- check the result of qualified_name production
                              18188                 :  *
                              18189                 :  * It's easiest to let the grammar production for qualified_name allow
                              18190                 :  * subscripts and '*', which we then must reject here.
                              18191                 :  */
                              18192                 : static void
 4899 tgl                     18193           90692 : check_qualified_name(List *names, core_yyscan_t yyscanner)
                              18194                 : {
                              18195                 :     ListCell   *i;
                              18196                 : 
 6726                         18197          181384 :     foreach(i, names)
                              18198                 :     {
                              18199           90692 :         if (!IsA(lfirst(i), String))
 5018 tgl                     18200 UIC           0 :             parser_yyerror("syntax error");
                              18201                 :     }
 6726 tgl                     18202 GIC       90692 : }
                              18203                 : 
                              18204                 : /* check_func_name --- check the result of func_name production
                              18205                 :  *
                              18206                 :  * It's easiest to let the grammar production for func_name allow subscripts
                              18207                 :  * and '*', which we then must reject here.
                              18208                 :  */
                              18209                 : static List *
 4899                         18210           46693 : check_func_name(List *names, core_yyscan_t yyscanner)
                              18211                 : {
                              18212                 :     ListCell   *i;
                              18213                 : 
 6878                         18214          140079 :     foreach(i, names)
                              18215                 :     {
                              18216           93386 :         if (!IsA(lfirst(i), String))
 5018 tgl                     18217 UIC           0 :             parser_yyerror("syntax error");
                              18218                 :     }
 6878 tgl                     18219 GIC       46693 :     return names;
                              18220                 : }
                              18221                 : 
                              18222                 : /* check_indirection --- check the result of indirection production
                              18223                 :  *
                              18224                 :  * We only allow '*' at the end of the list, but it's hard to enforce that
                              18225                 :  * in the grammar, so do it here.
                              18226                 :  */
                              18227                 : static List *
 4899                         18228           80312 : check_indirection(List *indirection, core_yyscan_t yyscanner)
                              18229                 : {
                              18230                 :     ListCell *l;
                              18231                 : 
 5335                         18232          126393 :     foreach(l, indirection)
                              18233                 :     {
                              18234           46081 :         if (IsA(lfirst(l), A_Star))
                              18235                 :         {
 1364                         18236            2983 :             if (lnext(indirection, l) != NULL)
 5018 tgl                     18237 UIC           0 :                 parser_yyerror("improper use of \"*\"");
                              18238                 :         }
                              18239                 :     }
 5335 tgl                     18240 GIC       80312 :     return indirection;
                              18241                 : }
                              18242                 : 
                              18243                 : /* extractArgTypes()
                              18244                 :  * Given a list of FunctionParameter nodes, extract a list of just the
                              18245                 :  * argument types (TypeNames) for input parameters only.  This is what
                              18246                 :  * is needed to look up an existing function, which is what is wanted by
                              18247                 :  * the productions that use this call.
                              18248                 :  */
                              18249                 : static List *
  668                         18250           25527 : extractArgTypes(List *parameters)
                              18251                 : {
 7033                         18252           25527 :     List       *result = NIL;
                              18253                 :     ListCell   *i;
                              18254                 : 
                              18255           50381 :     foreach(i, parameters)
                              18256                 :     {
                              18257           24854 :         FunctionParameter *p = (FunctionParameter *) lfirst(i);
                              18258                 : 
  668                         18259           24854 :         if (p->mode != FUNC_PARAM_OUT && p->mode != FUNC_PARAM_TABLE)
 6585                         18260           24779 :             result = lappend(result, p->argType);
                              18261                 :     }
 7033                         18262           25527 :     return result;
                              18263                 : }
                              18264                 : 
                              18265                 : /* extractAggrArgTypes()
                              18266                 :  * As above, but work from the output of the aggr_args production.
                              18267                 :  */
                              18268                 : static List *
 3394                         18269             181 : extractAggrArgTypes(List *aggrargs)
                              18270                 : {
                              18271             181 :     Assert(list_length(aggrargs) == 2);
  668                         18272             181 :     return extractArgTypes((List *) linitial(aggrargs));
                              18273                 : }
                              18274                 : 
                              18275                 : /* makeOrderedSetArgs()
                              18276                 :  * Build the result of the aggr_args production (which see the comments for).
                              18277                 :  * This handles only the case where both given lists are nonempty, so that
                              18278                 :  * we have to deal with multiple VARIADIC arguments.
                              18279                 :  */
                              18280                 : static List *
 3394                         18281              16 : makeOrderedSetArgs(List *directargs, List *orderedargs,
                              18282                 :                    core_yyscan_t yyscanner)
                              18283                 : {
                              18284              16 :     FunctionParameter *lastd = (FunctionParameter *) llast(directargs);
                              18285                 :     Integer    *ndirectargs;
                              18286                 : 
                              18287                 :     /* No restriction unless last direct arg is VARIADIC */
                              18288              16 :     if (lastd->mode == FUNC_PARAM_VARIADIC)
                              18289                 :     {
                              18290               8 :         FunctionParameter *firsto = (FunctionParameter *) linitial(orderedargs);
                              18291                 : 
                              18292                 :         /*
                              18293                 :          * We ignore the names, though the aggr_arg production allows them;
                              18294                 :          * it doesn't allow default values, so those need not be checked.
                              18295                 :          */
                              18296               8 :         if (list_length(orderedargs) != 1 ||
                              18297               8 :             firsto->mode != FUNC_PARAM_VARIADIC ||
                              18298               8 :             !equal(lastd->argType, firsto->argType))
 3394 tgl                     18299 UIC           0 :             ereport(ERROR,
                              18300                 :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              18301                 :                      errmsg("an ordered-set aggregate with a VARIADIC direct argument must have one VARIADIC aggregated argument of the same data type"),
                              18302                 :                      parser_errposition(exprLocation((Node *) firsto))));
                              18303                 : 
                              18304                 :         /* OK, drop the duplicate VARIADIC argument from the internal form */
 3394 tgl                     18305 GIC           8 :         orderedargs = NIL;
                              18306                 :     }
                              18307                 : 
                              18308                 :     /* don't merge into the next line, as list_concat changes directargs */
  914                         18309              16 :     ndirectargs = makeInteger(list_length(directargs));
                              18310                 : 
 3394                         18311              16 :     return list_make2(list_concat(directargs, orderedargs),
                              18312                 :                       ndirectargs);
                              18313                 : }
                              18314                 : 
                              18315                 : /* insertSelectOptions()
                              18316                 :  * Insert ORDER BY, etc into an already-constructed SelectStmt.
                              18317                 :  *
                              18318                 :  * This routine is just to avoid duplicating code in SelectStmt productions.
                              18319                 :  */
                              18320                 : static void
 8190                         18321           30248 : insertSelectOptions(SelectStmt *stmt,
                              18322                 :                     List *sortClause, List *lockingClause,
                              18323                 :                     SelectLimit *limitClause,
                              18324                 :                     WithClause *withClause,
                              18325                 :                     core_yyscan_t yyscanner)
                              18326                 : {
 5300                         18327           30248 :     Assert(IsA(stmt, SelectStmt));
                              18328                 : 
                              18329                 :     /*
                              18330                 :      * Tests here are to reject constructs like
                              18331                 :      *  (SELECT foo ORDER BY bar) ORDER BY baz
                              18332                 :      */
 8190                         18333           30248 :     if (sortClause)
                              18334                 :     {
                              18335           26190 :         if (stmt->sortClause)
 7204 tgl                     18336 UIC           0 :             ereport(ERROR,
                              18337                 :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18338                 :                      errmsg("multiple ORDER BY clauses not allowed"),
                              18339                 :                      parser_errposition(exprLocation((Node *) sortClause))));
 8190 tgl                     18340 GIC       26190 :         stmt->sortClause = sortClause;
                              18341                 :     }
                              18342                 :     /* We can handle multiple locking clauses, though */
 6188                         18343           30248 :     stmt->lockingClause = list_concat(stmt->lockingClause, lockingClause);
 1097 alvherre                18344           30248 :     if (limitClause && limitClause->limitOffset)
                              18345                 :     {
 8190 tgl                     18346             359 :         if (stmt->limitOffset)
 7204 tgl                     18347 UIC           0 :             ereport(ERROR,
                              18348                 :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18349                 :                      errmsg("multiple OFFSET clauses not allowed"),
                              18350                 :                      parser_errposition(exprLocation(limitClause->limitOffset))));
 1097 alvherre                18351 GIC         359 :         stmt->limitOffset = limitClause->limitOffset;
                              18352                 :     }
                              18353           30248 :     if (limitClause && limitClause->limitCount)
                              18354                 :     {
 8190 tgl                     18355            2937 :         if (stmt->limitCount)
 7204 tgl                     18356 UIC           0 :             ereport(ERROR,
                              18357                 :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18358                 :                      errmsg("multiple LIMIT clauses not allowed"),
                              18359                 :                      parser_errposition(exprLocation(limitClause->limitCount))));
 1097 alvherre                18360 GIC        2937 :         stmt->limitCount = limitClause->limitCount;
                              18361                 :     }
                              18362           30248 :     if (limitClause && limitClause->limitOption != LIMIT_OPTION_DEFAULT)
 1097 alvherre                18363 ECB             :     {
 1097 alvherre                18364 GIC        3109 :         if (stmt->limitOption)
 1097 alvherre                18365 LBC           0 :             ereport(ERROR,
                              18366                 :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18367                 :                      errmsg("multiple limit options not allowed")));
 1097 alvherre                18368 GIC        3109 :         if (!stmt->sortClause && limitClause->limitOption == LIMIT_OPTION_WITH_TIES)
 1097 alvherre                18369 CBC           3 :             ereport(ERROR,
                              18370                 :                     (errcode(ERRCODE_SYNTAX_ERROR),
  937 peter                   18371 ECB             :                      errmsg("WITH TIES cannot be specified without ORDER BY clause")));
  555 alvherre                18372 GIC        3106 :         if (limitClause->limitOption == LIMIT_OPTION_WITH_TIES && stmt->lockingClause)
  555 alvherre                18373 ECB             :         {
                              18374                 :             ListCell   *lc;
                              18375                 : 
  555 alvherre                18376 CBC           3 :             foreach(lc, stmt->lockingClause)
                              18377                 :             {
  555 alvherre                18378 GIC           3 :                 LockingClause *lock = lfirst_node(LockingClause, lc);
                              18379                 : 
                              18380               3 :                 if (lock->waitPolicy == LockWaitSkip)
  555 alvherre                18381 CBC           3 :                     ereport(ERROR,
                              18382                 :                             (errcode(ERRCODE_SYNTAX_ERROR),
                              18383                 :                              errmsg("%s and %s options cannot be used together",
                              18384                 :                                     "SKIP LOCKED", "WITH TIES")));
                              18385                 :             }
                              18386                 :         }
 1097 alvherre                18387 GIC        3103 :         stmt->limitOption = limitClause->limitOption;
 8190 tgl                     18388 ECB             :     }
 5300 tgl                     18389 CBC       30242 :     if (withClause)
                              18390                 :     {
 5300 tgl                     18391 GIC        1038 :         if (stmt->withClause)
 5300 tgl                     18392 LBC           0 :             ereport(ERROR,
                              18393                 :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18394                 :                      errmsg("multiple WITH clauses not allowed"),
                              18395                 :                      parser_errposition(exprLocation((Node *) withClause))));
 5300 tgl                     18396 CBC        1038 :         stmt->withClause = withClause;
                              18397                 :     }
 8190 tgl                     18398 GIC       30242 : }
                              18399                 : 
                              18400                 : static Node *
                              18401           16666 : makeSetOp(SetOperation op, bool all, Node *larg, Node *rarg)
                              18402                 : {
                              18403           16666 :     SelectStmt *n = makeNode(SelectStmt);
                              18404                 : 
 8190 tgl                     18405 CBC       16666 :     n->op = op;
                              18406           16666 :     n->all = all;
 8190 tgl                     18407 GIC       16666 :     n->larg = (SelectStmt *) larg;
                              18408           16666 :     n->rarg = (SelectStmt *) rarg;
 8190 tgl                     18409 CBC       16666 :     return (Node *) n;
 8221 tgl                     18410 ECB             : }
                              18411                 : 
 7670                         18412                 : /* SystemFuncName()
                              18413                 :  * Build a properly-qualified reference to a built-in function.
                              18414                 :  */
                              18415                 : List *
 7670 tgl                     18416 CBC       15783 : SystemFuncName(char *name)
                              18417                 : {
 6888 neilc                   18418 GIC       15783 :     return list_make2(makeString("pg_catalog"), makeString(name));
 7670 tgl                     18419 ECB             : }
 9281 lockhart                18420                 : 
                              18421                 : /* SystemTypeName()
                              18422                 :  * Build a properly-qualified reference to a built-in type.
                              18423                 :  *
                              18424                 :  * typmod is defaulted, but may be changed afterwards by caller.
 5337 tgl                     18425                 :  * Likewise for the location.
                              18426                 :  */
                              18427                 : TypeName *
 7646 tgl                     18428 CBC       83714 : SystemTypeName(char *name)
 7646 tgl                     18429 ECB             : {
 5944 tgl                     18430 GIC       83714 :     return makeTypeNameFromNameList(list_make2(makeString("pg_catalog"),
 5944 tgl                     18431 ECB             :                                                makeString(name)));
 7646                         18432                 : }
                              18433                 : 
 7584 lockhart                18434                 : /* doNegate()
                              18435                 :  * Handle negation of a numeric constant.
                              18436                 :  *
 8445 tgl                     18437                 :  * Formerly, we did this here because the optimizer couldn't cope with
 8445 tgl                     18438 EUB             :  * indexquals that looked like "var = -4" --- it wants "var = const"
                              18439                 :  * and a unary minus operator applied to a constant didn't qualify.
 8445 tgl                     18440 ECB             :  * As of Postgres 7.0, that problem doesn't exist anymore because there
                              18441                 :  * is a constant-subexpression simplifier in the optimizer.  However,
                              18442                 :  * there's still a good reason for doing this here, which is that we can
                              18443                 :  * postpone committing to a particular internal representation for simple
 7601 bruce                   18444                 :  * negative constants.  It's better to leave "-123.456" in string form
                              18445                 :  * until we know what the desired type is.
                              18446                 :  */
                              18447                 : static Node *
 6235 tgl                     18448 CBC        8915 : doNegate(Node *n, int location)
                              18449                 : {
 8788 bruce                   18450            8915 :     if (IsA(n, A_Const))
                              18451                 :     {
  331 peter                   18452            8493 :         A_Const    *con = (A_Const *) n;
 8788 bruce                   18453 ECB             : 
 5337 tgl                     18454                 :         /* report the constant's location as that of the '-' sign */
 5337 tgl                     18455 CBC        8493 :         con->location = location;
                              18456                 : 
  577 peter                   18457 GIC        8493 :         if (IsA(&con->val, Integer))
                              18458                 :         {
  450 peter                   18459 CBC        8104 :             con->val.ival.ival = -con->val.ival.ival;
 8788 bruce                   18460 GIC        8104 :             return n;
 8788 bruce                   18461 ECB             :         }
  577 peter                   18462 GIC         389 :         if (IsA(&con->val, Float))
 8788 bruce                   18463 ECB             :         {
  577 peter                   18464 CBC         389 :             doNegateFloat(&con->val.fval);
 8788 bruce                   18465             389 :             return n;
                              18466                 :         }
 8788 bruce                   18467 ECB             :     }
                              18468                 : 
 6235 tgl                     18469 GIC         422 :     return (Node *) makeSimpleA_Expr(AEXPR_OP, "-", NULL, n, location);
                              18470                 : }
 8448 tgl                     18471 ECB             : 
                              18472                 : static void
  577 peter                   18473 CBC         399 : doNegateFloat(Float *v)
                              18474                 : {
  331                         18475             399 :     char       *oldval = v->fval;
                              18476                 : 
 8448 tgl                     18477 GIC         399 :     if (*oldval == '+')
 8448 tgl                     18478 UIC           0 :         oldval++;
 8448 tgl                     18479 CBC         399 :     if (*oldval == '-')
  450 peter                   18480 UIC           0 :         v->fval = oldval+1;  /* just strip the '-' */
 8448 tgl                     18481 ECB             :     else
  450 peter                   18482 GIC         399 :         v->fval = psprintf("-%s", oldval);
 8448 tgl                     18483 CBC         399 : }
 7464 tgl                     18484 ECB             : 
 3219                         18485                 : static Node *
 3219 tgl                     18486 GIC      174289 : makeAndExpr(Node *lexpr, Node *rexpr, int location)
 3219 tgl                     18487 ECB             : {
                              18488                 :     /* Flatten "a AND b AND c ..." to a single BoolExpr on sight */
  852 tgl                     18489 GIC      174289 :     if (IsA(lexpr, BoolExpr))
                              18490                 :     {
  331 peter                   18491 CBC       96665 :         BoolExpr   *blexpr = (BoolExpr *) lexpr;
                              18492                 : 
 3219 tgl                     18493           96665 :         if (blexpr->boolop == AND_EXPR)
                              18494                 :         {
                              18495           94261 :             blexpr->args = lappend(blexpr->args, rexpr);
                              18496           94261 :             return (Node *) blexpr;
 3219 tgl                     18497 ECB             :         }
                              18498                 :     }
 3219 tgl                     18499 CBC       80028 :     return (Node *) makeBoolExpr(AND_EXPR, list_make2(lexpr, rexpr), location);
                              18500                 : }
                              18501                 : 
                              18502                 : static Node *
                              18503           26248 : makeOrExpr(Node *lexpr, Node *rexpr, int location)
                              18504                 : {
 3219 tgl                     18505 ECB             :     /* Flatten "a OR b OR c ..." to a single BoolExpr on sight */
  852 tgl                     18506 GIC       26248 :     if (IsA(lexpr, BoolExpr))
 3219 tgl                     18507 ECB             :     {
  331 peter                   18508 CBC        7442 :         BoolExpr   *blexpr = (BoolExpr *) lexpr;
 3219 tgl                     18509 ECB             : 
 3219 tgl                     18510 GIC        7442 :         if (blexpr->boolop == OR_EXPR)
 3219 tgl                     18511 ECB             :         {
 3219 tgl                     18512 GIC        6128 :             blexpr->args = lappend(blexpr->args, rexpr);
                              18513            6128 :             return (Node *) blexpr;
                              18514                 :         }
 3219 tgl                     18515 ECB             :     }
 3219 tgl                     18516 GIC       20120 :     return (Node *) makeBoolExpr(OR_EXPR, list_make2(lexpr, rexpr), location);
 3219 tgl                     18517 ECB             : }
                              18518                 : 
                              18519                 : static Node *
 3219 tgl                     18520 CBC       15206 : makeNotExpr(Node *expr, int location)
 3219 tgl                     18521 ECB             : {
 3219 tgl                     18522 GIC       15206 :     return (Node *) makeBoolExpr(NOT_EXPR, list_make1(expr), location);
 3219 tgl                     18523 ECB             : }
                              18524                 : 
                              18525                 : static Node *
 5337 tgl                     18526 GIC        3780 : makeAArrayExpr(List *elements, int location)
 5498 tgl                     18527 ECB             : {
 5498 tgl                     18528 GIC        3780 :     A_ArrayExpr *n = makeNode(A_ArrayExpr);
 5498 tgl                     18529 ECB             : 
 5498 tgl                     18530 GIC        3780 :     n->elements = elements;
 5337 tgl                     18531 CBC        3780 :     n->location = location;
 5498                         18532            3780 :     return (Node *) n;
                              18533                 : }
 5498 tgl                     18534 ECB             : 
                              18535                 : static Node *
 5337 tgl                     18536 CBC         298 : makeXmlExpr(XmlExprOp op, char *name, List *named_args, List *args,
 5337 tgl                     18537 ECB             :             int location)
 5953 peter_e                 18538                 : {
 4177 peter_e                 18539 GIC         298 :     XmlExpr     *x = makeNode(XmlExpr);
 5950 tgl                     18540 EUB             : 
 5953 peter_e                 18541 GIC         298 :     x->op = op;
 5953 peter_e                 18542 GBC         298 :     x->name = name;
                              18543                 :     /*
                              18544                 :      * named_args is a list of ResTarget; it'll be split apart into separate
                              18545                 :      * expression and name lists in transformXmlExpr().
 5950 tgl                     18546 ECB             :      */
 5953 peter_e                 18547 GIC         298 :     x->named_args = named_args;
 5950 tgl                     18548             298 :     x->arg_names = NIL;
 5953 peter_e                 18549             298 :     x->args = args;
                              18550                 :     /* xmloption, if relevant, must be filled in by caller */
                              18551                 :     /* type and typmod will be filled in during parse analysis */
 3759 tgl                     18552             298 :     x->type = InvalidOid;            /* marks the node as not analyzed */
 5337 tgl                     18553 CBC         298 :     x->location = location;
 5953 peter_e                 18554 GIC         298 :     return (Node *) x;
 5953 peter_e                 18555 ECB             : }
                              18556                 : 
 5378 tgl                     18557                 : /*
                              18558                 :  * Merge the input and output parameters of a table function.
                              18559                 :  */
                              18560                 : static List *
 5378 tgl                     18561 GIC          88 : mergeTableFuncParameters(List *func_args, List *columns)
                              18562                 : {
                              18563                 :     ListCell   *lc;
                              18564                 : 
                              18565                 :     /* Explicit OUT and INOUT parameters shouldn't be used in this syntax */
                              18566             185 :     foreach(lc, func_args)
                              18567                 :     {
                              18568              97 :         FunctionParameter *p = (FunctionParameter *) lfirst(lc);
 5378 tgl                     18569 ECB             : 
  668 tgl                     18570 GIC          97 :         if (p->mode != FUNC_PARAM_DEFAULT &&
  668 tgl                     18571 UIC           0 :             p->mode != FUNC_PARAM_IN &&
                              18572               0 :             p->mode != FUNC_PARAM_VARIADIC)
 5378 tgl                     18573 LBC           0 :             ereport(ERROR,
                              18574                 :                     (errcode(ERRCODE_SYNTAX_ERROR),
 5378 tgl                     18575 ECB             :                      errmsg("OUT and INOUT arguments aren't allowed in TABLE functions")));
 5378 tgl                     18576 EUB             :     }
                              18577                 : 
 5378 tgl                     18578 CBC          88 :     return list_concat(func_args, columns);
                              18579                 : }
                              18580                 : 
                              18581                 : /*
                              18582                 :  * Determine return type of a TABLE function.  A single result column
                              18583                 :  * returns setof that column's type; otherwise return setof record.
                              18584                 :  */
                              18585                 : static TypeName *
                              18586              88 : TableFuncTypeName(List *columns)
                              18587                 : {
                              18588                 :     TypeName   *result;
                              18589                 : 
                              18590              88 :     if (list_length(columns) == 1)
                              18591                 :     {
                              18592              31 :         FunctionParameter *p = (FunctionParameter *) linitial(columns);
 5378 tgl                     18593 EUB             : 
 2222 peter_e                 18594 GIC          31 :         result = copyObject(p->argType);
 5378 tgl                     18595 ECB             :     }
                              18596                 :     else
 5378 tgl                     18597 GIC          57 :         result = SystemTypeName("record");
                              18598                 : 
                              18599              88 :     result->setof = true;
                              18600                 : 
                              18601              88 :     return result;
                              18602                 : }
                              18603                 : 
 4578 peter_e                 18604 ECB             : /*
                              18605                 :  * Convert a list of (dotted) names to a RangeVar (like
                              18606                 :  * makeRangeVarFromNameList, but with position support).  The
                              18607                 :  * "AnyName" refers to the any_name production in the grammar.
                              18608                 :  */
                              18609                 : static RangeVar *
 4578 peter_e                 18610 CBC         431 : makeRangeVarFromAnyName(List *names, int position, core_yyscan_t yyscanner)
                              18611                 : {
  331 peter                   18612             431 :     RangeVar   *r = makeNode(RangeVar);
 4578 peter_e                 18613 EUB             : 
 4578 peter_e                 18614 GIC         431 :     switch (list_length(names))
                              18615                 :     {
 4578 peter_e                 18616 CBC         392 :         case 1:
 4578 peter_e                 18617 GIC         392 :             r->catalogname = NULL;
                              18618             392 :             r->schemaname = NULL;
                              18619             392 :             r->relname = strVal(linitial(names));
                              18620             392 :             break;
                              18621              39 :         case 2:
                              18622              39 :             r->catalogname = NULL;
                              18623              39 :             r->schemaname = strVal(linitial(names));
                              18624              39 :             r->relname = strVal(lsecond(names));
                              18625              39 :             break;
 4578 peter_e                 18626 LBC           0 :         case 3:
 2931 heikki.linnakangas      18627 UIC           0 :             r->catalogname = strVal(linitial(names));
 4578 peter_e                 18628 LBC           0 :             r->schemaname = strVal(lsecond(names));
 4578 peter_e                 18629 UIC           0 :             r->relname = strVal(lthird(names));
                              18630               0 :             break;
 4578 peter_e                 18631 LBC           0 :         default:
 4578 peter_e                 18632 UIC           0 :             ereport(ERROR,
 4578 peter_e                 18633 ECB             :                     (errcode(ERRCODE_SYNTAX_ERROR),
                              18634                 :                      errmsg("improper qualified name (too many dotted names): %s",
                              18635                 :                             NameListToString(names)),
                              18636                 :                      parser_errposition(position)));
                              18637                 :             break;
                              18638                 :     }
                              18639                 : 
 4500 rhaas                   18640 GIC         431 :     r->relpersistence = RELPERSISTENCE_PERMANENT;
 4578 peter_e                 18641             431 :     r->location = position;
                              18642                 : 
                              18643             431 :     return r;
                              18644                 : }
 4578 peter_e                 18645 ECB             : 
                              18646                 : /*
  529 akapila                 18647                 :  * Convert a relation_name with name and namelist to a RangeVar using
                              18648                 :  * makeRangeVar.
                              18649                 :  */
                              18650                 : static RangeVar *
  529 akapila                 18651 GIC       90692 : makeRangeVarFromQualifiedName(char *name, List *namelist, int location,
                              18652                 :                               core_yyscan_t yyscanner)
                              18653                 : {
                              18654                 :     RangeVar   *r;
                              18655                 : 
                              18656           90692 :     check_qualified_name(namelist, yyscanner);
  529 akapila                 18657 CBC       90692 :     r = makeRangeVar(NULL, NULL, location);
                              18658                 : 
  529 akapila                 18659 GIC       90692 :     switch (list_length(namelist))
  529 akapila                 18660 ECB             :     {
  529 akapila                 18661 GIC       90692 :         case 1:
                              18662           90692 :             r->catalogname = NULL;
                              18663           90692 :             r->schemaname = name;
  529 akapila                 18664 CBC       90692 :             r->relname = strVal(linitial(namelist));
  529 akapila                 18665 GIC       90692 :             break;
  529 akapila                 18666 LBC           0 :         case 2:
  529 akapila                 18667 UIC           0 :             r->catalogname = name;
                              18668               0 :             r->schemaname = strVal(linitial(namelist));
                              18669               0 :             r->relname = strVal(lsecond(namelist));
                              18670               0 :             break;
                              18671               0 :         default:
  529 akapila                 18672 LBC           0 :             ereport(ERROR,
  529 akapila                 18673 ECB             :                     errcode(ERRCODE_SYNTAX_ERROR),
                              18674                 :                     errmsg("improper qualified name (too many dotted names): %s",
  529 akapila                 18675 EUB             :                            NameListToString(lcons(makeString(name), namelist))),
                              18676                 :                            parser_errposition(location));
                              18677                 :             break;
                              18678                 :     }
                              18679                 : 
  529 akapila                 18680 GIC       90692 :     return r;
  529 akapila                 18681 ECB             : }
                              18682                 : 
                              18683                 : /* Separate Constraint nodes from COLLATE clauses in a ColQualList */
                              18684                 : static void
 4414 tgl                     18685 CBC       36794 : SplitColQualList(List *qualList,
                              18686                 :                  List **constraintList, CollateClause **collClause,
 4414 tgl                     18687 ECB             :                  core_yyscan_t yyscanner)
                              18688                 : {
                              18689                 :     ListCell   *cell;
                              18690                 : 
 4414 tgl                     18691 GIC       36794 :     *collClause = NULL;
 1364                         18692           46122 :     foreach(cell, qualList)
                              18693                 :     {
  331 peter                   18694            9328 :         Node       *n = (Node *) lfirst(cell);
                              18695                 : 
 4414 tgl                     18696            9328 :         if (IsA(n, Constraint))
 4414 tgl                     18697 ECB             :         {
                              18698                 :             /* keep it in list */
 4414 tgl                     18699 GIC        8455 :             continue;
                              18700                 :         }
                              18701             873 :         if (IsA(n, CollateClause))
                              18702                 :         {
 4414 tgl                     18703 CBC         873 :             CollateClause *c = (CollateClause *) n;
                              18704                 : 
 4414 tgl                     18705 GIC         873 :             if (*collClause)
 4414 tgl                     18706 UIC           0 :                 ereport(ERROR,
                              18707                 :                         (errcode(ERRCODE_SYNTAX_ERROR),
                              18708                 :                          errmsg("multiple COLLATE clauses not allowed"),
 4414 tgl                     18709 ECB             :                          parser_errposition(c->location)));
 4414 tgl                     18710 GIC         873 :             *collClause = c;
 4414 tgl                     18711 ECB             :         }
 4414 tgl                     18712 EUB             :         else
 4414 tgl                     18713 UIC           0 :             elog(ERROR, "unexpected node type %d", (int) n->type);
                              18714                 :         /* remove non-Constraint nodes from qualList */
 1364 tgl                     18715 GIC         873 :         qualList = foreach_delete_current(qualList, cell);
 4414 tgl                     18716 ECB             :     }
 4414 tgl                     18717 GIC       36794 :     *constraintList = qualList;
                              18718           36794 : }
 4414 tgl                     18719 ECB             : 
 4316                         18720                 : /*
                              18721                 :  * Process result of ConstraintAttributeSpec, and set appropriate bool flags
                              18722                 :  * in the output command node.  Pass NULL for any flags the particular
 4316 tgl                     18723 EUB             :  * command doesn't support.
                              18724                 :  */
                              18725                 : static void
 4316 tgl                     18726 GIC       35769 : processCASbits(int cas_bits, int location, const char *constrType,
 4316 tgl                     18727 ECB             :                bool *deferrable, bool *initdeferred, bool *not_valid,
                              18728                 :                bool *no_inherit, core_yyscan_t yyscanner)
                              18729                 : {
                              18730                 :     /* defaults */
 4316 tgl                     18731 CBC       35769 :     if (deferrable)
 4316 tgl                     18732 GBC       35150 :         *deferrable = false;
 4316 tgl                     18733 GIC       35769 :     if (initdeferred)
                              18734           35150 :         *initdeferred = false;
                              18735           35769 :     if (not_valid)
 4316 tgl                     18736 CBC        1257 :         *not_valid = false;
                              18737                 : 
                              18738           35769 :     if (cas_bits & (CAS_DEFERRABLE | CAS_INITIALLY_DEFERRED))
                              18739                 :     {
                              18740              79 :         if (deferrable)
 4316 tgl                     18741 GBC          79 :             *deferrable = true;
                              18742                 :         else
 4316 tgl                     18743 UIC           0 :             ereport(ERROR,
 4316 tgl                     18744 ECB             :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              18745                 :                      /* translator: %s is CHECK, UNIQUE, or similar */
                              18746                 :                      errmsg("%s constraints cannot be marked DEFERRABLE",
                              18747                 :                             constrType),
                              18748                 :                      parser_errposition(location)));
                              18749                 :     }
                              18750                 : 
 4316 tgl                     18751 GIC       35769 :     if (cas_bits & CAS_INITIALLY_DEFERRED)
 4316 tgl                     18752 ECB             :     {
 4316 tgl                     18753 GIC          45 :         if (initdeferred)
 4316 tgl                     18754 CBC          45 :             *initdeferred = true;
                              18755                 :         else
 4316 tgl                     18756 LBC           0 :             ereport(ERROR,
 4316 tgl                     18757 ECB             :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              18758                 :                      /* translator: %s is CHECK, UNIQUE, or similar */
                              18759                 :                      errmsg("%s constraints cannot be marked DEFERRABLE",
                              18760                 :                             constrType),
                              18761                 :                      parser_errposition(location)));
                              18762                 :     }
                              18763                 : 
 4316 tgl                     18764 GIC       35769 :     if (cas_bits & CAS_NOT_VALID)
 4316 tgl                     18765 ECB             :     {
 4316 tgl                     18766 GIC         258 :         if (not_valid)
 4316 tgl                     18767 CBC         258 :             *not_valid = true;
 4316 tgl                     18768 EUB             :         else
 4316 tgl                     18769 UIC           0 :             ereport(ERROR,
                              18770                 :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              18771                 :                      /* translator: %s is CHECK, UNIQUE, or similar */
 4316 tgl                     18772 ECB             :                      errmsg("%s constraints cannot be marked NOT VALID",
                              18773                 :                             constrType),
                              18774                 :                      parser_errposition(location)));
                              18775                 :     }
                              18776                 : 
 3911 alvherre                18777 CBC       35769 :     if (cas_bits & CAS_NO_INHERIT)
                              18778                 :     {
                              18779              53 :         if (no_inherit)
 3911 alvherre                18780 GIC          53 :             *no_inherit = true;
 3911 alvherre                18781 ECB             :         else
 3911 alvherre                18782 LBC           0 :             ereport(ERROR,
 3911 alvherre                18783 ECB             :                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
                              18784                 :                      /* translator: %s is CHECK, UNIQUE, or similar */
                              18785                 :                      errmsg("%s constraints cannot be marked NO INHERIT",
                              18786                 :                             constrType),
                              18787                 :                      parser_errposition(location)));
                              18788                 :     }
 4316 tgl                     18789 GIC       35769 : }
                              18790                 : 
                              18791                 : /*
                              18792                 :  * Parse a user-supplied partition strategy string into parse node
                              18793                 :  * PartitionStrategy representation, or die trying.
                              18794                 :  */
                              18795                 : static PartitionStrategy
  157 alvherre                18796 GNC        2190 : parsePartitionStrategy(char *strategy)
                              18797                 : {
                              18798            2190 :     if (pg_strcasecmp(strategy, "list") == 0)
                              18799            1116 :         return PARTITION_STRATEGY_LIST;
                              18800            1074 :     else if (pg_strcasecmp(strategy, "range") == 0)
                              18801             964 :         return PARTITION_STRATEGY_RANGE;
                              18802             110 :     else if (pg_strcasecmp(strategy, "hash") == 0)
                              18803             107 :         return PARTITION_STRATEGY_HASH;
                              18804                 : 
                              18805               3 :     ereport(ERROR,
                              18806                 :             (errcode(ERRCODE_INVALID_PARAMETER_VALUE),
                              18807                 :              errmsg("unrecognized partitioning strategy \"%s\"",
                              18808                 :                     strategy)));
                              18809                 :     return PARTITION_STRATEGY_LIST;     /* keep compiler quiet */
                              18810                 : 
                              18811                 : }
                              18812                 : 
                              18813                 : /*
  529 akapila                 18814 ECB             :  * Process pubobjspec_list to check for errors in any of the objects and
                              18815                 :  * convert PUBLICATIONOBJ_CONTINUATION into appropriate PublicationObjSpecType.
                              18816                 :  */
                              18817                 : static void
  529 akapila                 18818 GIC         719 : preprocess_pubobj_list(List *pubobjspec_list, core_yyscan_t yyscanner)
                              18819                 : {
                              18820                 :     ListCell   *cell;
                              18821                 :     PublicationObjSpec *pubobj;
                              18822             719 :     PublicationObjSpecType prevobjtype = PUBLICATIONOBJ_CONTINUATION;
                              18823                 : 
                              18824             719 :     if (!pubobjspec_list)
  529 akapila                 18825 UIC           0 :         return;
  529 akapila                 18826 ECB             : 
  529 akapila                 18827 GIC         719 :     pubobj = (PublicationObjSpec *) linitial(pubobjspec_list);
  529 akapila                 18828 CBC         719 :     if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION)
  529 akapila                 18829 GIC           6 :         ereport(ERROR,
                              18830                 :                 errcode(ERRCODE_SYNTAX_ERROR),
                              18831                 :                 errmsg("invalid publication object list"),
                              18832                 :                 errdetail("One of TABLE or TABLES IN SCHEMA must be specified before a standalone table or schema name."),
                              18833                 :                 parser_errposition(pubobj->location));
                              18834                 : 
                              18835            1525 :     foreach(cell, pubobjspec_list)
                              18836                 :     {
                              18837             818 :         pubobj = (PublicationObjSpec *) lfirst(cell);
                              18838                 : 
                              18839             818 :         if (pubobj->pubobjtype == PUBLICATIONOBJ_CONTINUATION)
                              18840              80 :             pubobj->pubobjtype = prevobjtype;
                              18841                 : 
  367 tomas.vondra            18842             818 :         if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLE)
                              18843                 :         {
                              18844                 :             /* relation name or pubtable must be set for this type of object */
  529 akapila                 18845             622 :             if (!pubobj->name && !pubobj->pubtable)
  529 akapila                 18846 LBC           0 :                 ereport(ERROR,
                              18847                 :                         errcode(ERRCODE_SYNTAX_ERROR),
  529 akapila                 18848 ECB             :                         errmsg("invalid table name at or near"),
                              18849                 :                         parser_errposition(pubobj->location));
  411                         18850                 : 
  411 akapila                 18851 GIC         622 :             if (pubobj->name)
                              18852                 :             {
  529 akapila                 18853 ECB             :                 /* convert it to PublicationTable */
  529 akapila                 18854 GIC          28 :                 PublicationTable *pubtable = makeNode(PublicationTable);
  465 alvherre                18855 ECB             : 
  465 alvherre                18856 GIC          28 :                 pubtable->relation =
  465 alvherre                18857 CBC          28 :                     makeRangeVar(NULL, pubobj->name, pubobj->location);
  529 akapila                 18858              28 :                 pubobj->pubtable = pubtable;
  529 akapila                 18859 GIC          28 :                 pubobj->name = NULL;
  529 akapila                 18860 ECB             :             }
                              18861                 :         }
  465 alvherre                18862 CBC         196 :         else if (pubobj->pubobjtype == PUBLICATIONOBJ_TABLES_IN_SCHEMA ||
                              18863              12 :                  pubobj->pubobjtype == PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA)
                              18864                 :         {
                              18865                 :             /* WHERE clause is not allowed on a schema object */
  411 akapila                 18866 GIC         196 :             if (pubobj->pubtable && pubobj->pubtable->whereClause)
  411 akapila                 18867 CBC           3 :                 ereport(ERROR,
                              18868                 :                         errcode(ERRCODE_SYNTAX_ERROR),
                              18869                 :                         errmsg("WHERE clause not allowed for schema"),
                              18870                 :                         parser_errposition(pubobj->location));
  411 akapila                 18871 ECB             : 
                              18872                 :             /* Column list is not allowed on a schema object */
  379 tomas.vondra            18873 CBC         193 :             if (pubobj->pubtable && pubobj->pubtable->columns)
  379 tomas.vondra            18874 GIC           3 :                 ereport(ERROR,
  379 tomas.vondra            18875 ECB             :                         errcode(ERRCODE_SYNTAX_ERROR),
  379 tomas.vondra            18876 EUB             :                         errmsg("column specification not allowed for schema"),
  379 tomas.vondra            18877 ECB             :                         parser_errposition(pubobj->location));
  379 tomas.vondra            18878 EUB             : 
                              18879                 :             /*
  529 akapila                 18880 ECB             :              * We can distinguish between the different type of schema
                              18881                 :              * objects based on whether name and pubtable is set.
                              18882                 :              */
  529 akapila                 18883 GIC         190 :             if (pubobj->name)
  465 alvherre                18884 CBC         178 :                 pubobj->pubobjtype = PUBLICATIONOBJ_TABLES_IN_SCHEMA;
  529 akapila                 18885 GIC          12 :             else if (!pubobj->name && !pubobj->pubtable)
  465 alvherre                18886              12 :                 pubobj->pubobjtype = PUBLICATIONOBJ_TABLES_IN_CUR_SCHEMA;
  529 akapila                 18887 ECB             :             else
  529 akapila                 18888 UIC           0 :                 ereport(ERROR,
  529 akapila                 18889 ECB             :                         errcode(ERRCODE_SYNTAX_ERROR),
                              18890                 :                         errmsg("invalid schema name at or near"),
                              18891                 :                         parser_errposition(pubobj->location));
                              18892                 :         }
                              18893                 : 
  529 akapila                 18894 CBC         812 :         prevobjtype = pubobj->pubobjtype;
                              18895                 :     }
                              18896                 : }
  529 akapila                 18897 ECB             : 
                              18898                 : /*----------
                              18899                 :  * Recursive view transformation
                              18900                 :  *
 3720 peter_e                 18901                 :  * Convert
                              18902                 :  *
                              18903                 :  *     CREATE RECURSIVE VIEW relname (aliases) AS query
                              18904                 :  *
                              18905                 :  * to
                              18906                 :  *
                              18907                 :  *     CREATE VIEW relname (aliases) AS
                              18908                 :  *         WITH RECURSIVE relname (aliases) AS (query)
                              18909                 :  *         SELECT aliases FROM relname
                              18910                 :  *
                              18911                 :  * Actually, just the WITH ... part, which is then inserted into the original
                              18912                 :  * view definition as the query.
                              18913                 :  * ----------
                              18914                 :  */
                              18915                 : static Node *
 3720 peter_e                 18916 GIC           7 : makeRecursiveViewSelect(char *relname, List *aliases, Node *query)
                              18917                 : {
 3720 peter_e                 18918 CBC           7 :     SelectStmt *s = makeNode(SelectStmt);
 3720 peter_e                 18919 GIC           7 :     WithClause *w = makeNode(WithClause);
 3720 peter_e                 18920 CBC           7 :     CommonTableExpr *cte = makeNode(CommonTableExpr);
 3720 peter_e                 18921 GIC           7 :     List       *tl = NIL;
                              18922                 :     ListCell   *lc;
                              18923                 : 
 3720 peter_e                 18924 ECB             :     /* create common table expression */
 3720 peter_e                 18925 GIC           7 :     cte->ctename = relname;
 3720 peter_e                 18926 CBC           7 :     cte->aliascolnames = aliases;
 1513 tgl                     18927 GIC           7 :     cte->ctematerialized = CTEMaterializeDefault;
 3720 peter_e                 18928 CBC           7 :     cte->ctequery = query;
                              18929               7 :     cte->location = -1;
 3720 peter_e                 18930 ECB             : 
                              18931                 :     /* create WITH clause and attach CTE */
 3720 peter_e                 18932 GIC           7 :     w->recursive = true;
                              18933               7 :     w->ctes = list_make1(cte);
 3720 peter_e                 18934 CBC           7 :     w->location = -1;
                              18935                 : 
                              18936                 :     /* create target list for the new SELECT from the alias list of the
 3720 peter_e                 18937 ECB             :      * recursive view specification */
 3720 peter_e                 18938 GIC          14 :     foreach (lc, aliases)
 3720 peter_e                 18939 ECB             :     {
 3720 peter_e                 18940 CBC           7 :         ResTarget *rt = makeNode(ResTarget);
                              18941                 : 
 3720 peter_e                 18942 GIC           7 :         rt->name = NULL;
                              18943               7 :         rt->indirection = NIL;
                              18944               7 :         rt->val = makeColumnRef(strVal(lfirst(lc)), NIL, -1, 0);
 3720 peter_e                 18945 CBC           7 :         rt->location = -1;
 3720 peter_e                 18946 ECB             : 
 3720 peter_e                 18947 CBC           7 :         tl = lappend(tl, rt);
                              18948                 :     }
                              18949                 : 
 3720 peter_e                 18950 ECB             :     /* create new SELECT combining WITH clause, target list, and fake FROM
                              18951                 :      * clause */
 3720 peter_e                 18952 CBC           7 :     s->withClause = w;
 3720 peter_e                 18953 GIC           7 :     s->targetList = tl;
                              18954               7 :     s->fromClause = list_make1(makeRangeVar(NULL, relname, -1));
                              18955                 : 
                              18956               7 :     return (Node *) s;
                              18957                 : }
                              18958                 : 
 4414 tgl                     18959 ECB             : /* parser_init()
                              18960                 :  * Initialize to parse one query string
                              18961                 :  */
                              18962                 : void
 4414 tgl                     18963 GIC      498136 : parser_init(base_yy_extra_type *yyext)
 4414 tgl                     18964 ECB             : {
 4414 tgl                     18965 GIC      498136 :     yyext->parsetree = NIL;      /* in case grammar forgets to set it */
 4414 tgl                     18966 CBC      498136 : }
        

Generated by: LCOV version v1.16-55-g56c0a2a