LCOV - code coverage report
Current view: top level - src/pl/plpgsql/src - pl_gram.c (source / functions) Hit Total Coverage
Test: PostgreSQL 19devel Lines: 368 468 78.6 %
Date: 2025-07-05 22:19:01 Functions: 2 2 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /* A Bison parser, made by GNU Bison 3.8.2.  */
       2             : 
       3             : /* Bison implementation for Yacc-like parsers in C
       4             : 
       5             :    Copyright (C) 1984, 1989-1990, 2000-2015, 2018-2021 Free Software Foundation,
       6             :    Inc.
       7             : 
       8             :    This program is free software: you can redistribute it and/or modify
       9             :    it under the terms of the GNU General Public License as published by
      10             :    the Free Software Foundation, either version 3 of the License, or
      11             :    (at your option) any later version.
      12             : 
      13             :    This program is distributed in the hope that it will be useful,
      14             :    but WITHOUT ANY WARRANTY; without even the implied warranty of
      15             :    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      16             :    GNU General Public License for more details.
      17             : 
      18             :    You should have received a copy of the GNU General Public License
      19             :    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      20             : 
      21             : /* As a special exception, you may create a larger work that contains
      22             :    part or all of the Bison parser skeleton and distribute that work
      23             :    under terms of your choice, so long as that work isn't itself a
      24             :    parser generator using the skeleton or a modified version thereof
      25             :    as a parser skeleton.  Alternatively, if you modify or redistribute
      26             :    the parser skeleton itself, you may (at your option) remove this
      27             :    special exception, which will cause the skeleton and the resulting
      28             :    Bison output files to be licensed under the GNU General Public
      29             :    License without this special exception.
      30             : 
      31             :    This special exception was added by the Free Software Foundation in
      32             :    version 2.2 of Bison.  */
      33             : 
      34             : /* C LALR(1) parser skeleton written by Richard Stallman, by
      35             :    simplifying the original so-called "semantic" parser.  */
      36             : 
      37             : /* DO NOT RELY ON FEATURES THAT ARE NOT DOCUMENTED in the manual,
      38             :    especially those whose name start with YY_ or yy_.  They are
      39             :    private implementation details that can be changed or removed.  */
      40             : 
      41             : /* All symbols defined below should begin with yy or YY, to avoid
      42             :    infringing on user name space.  This should be done even for local
      43             :    variables, as they might otherwise be expanded by user macros.
      44             :    There are some unavoidable exceptions within include files to
      45             :    define necessary library symbols; they are noted "INFRINGES ON
      46             :    USER NAME SPACE" below.  */
      47             : 
      48             : /* Identify Bison output, and Bison version.  */
      49             : #define YYBISON 30802
      50             : 
      51             : /* Bison version string.  */
      52             : #define YYBISON_VERSION "3.8.2"
      53             : 
      54             : /* Skeleton name.  */
      55             : #define YYSKELETON_NAME "yacc.c"
      56             : 
      57             : /* Pure parsers.  */
      58             : #define YYPURE 1
      59             : 
      60             : /* Push parsers.  */
      61             : #define YYPUSH 0
      62             : 
      63             : /* Pull parsers.  */
      64             : #define YYPULL 1
      65             : 
      66             : 
      67             : /* Substitute the variable and function names.  */
      68             : #define yyparse         plpgsql_yyparse
      69             : #define yylex           plpgsql_yylex
      70             : #define yyerror         plpgsql_yyerror
      71             : #define yydebug         plpgsql_yydebug
      72             : #define yynerrs         plpgsql_yynerrs
      73             : 
      74             : /* First part of user prologue.  */
      75             : #line 1 "pl_gram.y"
      76             : 
      77             : /*-------------------------------------------------------------------------
      78             :  *
      79             :  * pl_gram.y            - Parser for the PL/pgSQL procedural language
      80             :  *
      81             :  * Portions Copyright (c) 1996-2025, PostgreSQL Global Development Group
      82             :  * Portions Copyright (c) 1994, Regents of the University of California
      83             :  *
      84             :  *
      85             :  * IDENTIFICATION
      86             :  *    src/pl/plpgsql/src/pl_gram.y
      87             :  *
      88             :  *-------------------------------------------------------------------------
      89             :  */
      90             : 
      91             : #include "postgres.h"
      92             : 
      93             : #include "catalog/namespace.h"
      94             : #include "catalog/pg_proc.h"
      95             : #include "catalog/pg_type.h"
      96             : #include "parser/parser.h"
      97             : #include "parser/parse_type.h"
      98             : #include "parser/scanner.h"
      99             : #include "parser/scansup.h"
     100             : #include "utils/builtins.h"
     101             : 
     102             : #include "plpgsql.h"
     103             : 
     104             : #include "pl_gram.h"
     105             : 
     106             : /* Location tracking support --- simpler than bison's default */
     107             : #define YYLLOC_DEFAULT(Current, Rhs, N) \
     108             :     do { \
     109             :         if (N) \
     110             :             (Current) = (Rhs)[1]; \
     111             :         else \
     112             :             (Current) = (Rhs)[0]; \
     113             :     } while (0)
     114             : 
     115             : /*
     116             :  * Bison doesn't allocate anything that needs to live across parser calls,
     117             :  * so we can easily have it use palloc instead of malloc.  This prevents
     118             :  * memory leaks if we error out during parsing.
     119             :  */
     120             : #define YYMALLOC palloc
     121             : #define YYFREE   pfree
     122             : 
     123             : 
     124             : typedef struct
     125             : {
     126             :     int         location;
     127             :     yyscan_t    yyscanner;
     128             : } sql_error_callback_arg;
     129             : 
     130             : #define parser_errposition(pos)  plpgsql_scanner_errposition(pos, yyscanner)
     131             : 
     132             : union YYSTYPE;                  /* need forward reference for tok_is_keyword */
     133             : 
     134             : static  bool            tok_is_keyword(int token, union YYSTYPE *lval,
     135             :                                        int kw_token, const char *kw_str);
     136             : static  void            word_is_not_variable(PLword *word, int location, yyscan_t yyscanner);
     137             : static  void            cword_is_not_variable(PLcword *cword, int location, yyscan_t yyscanner);
     138             : static  void            current_token_is_not_variable(int tok, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     139             : static  PLpgSQL_expr    *make_plpgsql_expr(const char *query,
     140             :                                            RawParseMode parsemode);
     141             : static  void            mark_expr_as_assignment_source(PLpgSQL_expr *expr,
     142             :                                                        PLpgSQL_datum *target);
     143             : static  PLpgSQL_expr    *read_sql_construct(int until,
     144             :                                             int until2,
     145             :                                             int until3,
     146             :                                             const char *expected,
     147             :                                             RawParseMode parsemode,
     148             :                                             bool isexpression,
     149             :                                             bool valid_sql,
     150             :                                             int *startloc,
     151             :                                             int *endtoken,
     152             :                                             YYSTYPE *yylvalp, YYLTYPE *yyllocp,
     153             :                                             yyscan_t yyscanner);
     154             : static  PLpgSQL_expr    *read_sql_expression(int until, const char *expected,
     155             :                                              YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     156             : static  PLpgSQL_expr    *read_sql_expression2(int until, int until2,
     157             :                                               const char *expected, int *endtoken,
     158             :                                               YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     159             : static  PLpgSQL_expr    *read_sql_stmt(YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     160             : static  PLpgSQL_type    *read_datatype(int tok, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     161             : static  PLpgSQL_stmt    *make_execsql_stmt(int firsttoken, int location,
     162             :                                            PLword *word, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     163             : static  PLpgSQL_stmt_fetch *read_fetch_direction(YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     164             : static  void             complete_direction(PLpgSQL_stmt_fetch *fetch,
     165             :                                             bool *check_FROM, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     166             : static  PLpgSQL_stmt    *make_return_stmt(int location, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     167             : static  PLpgSQL_stmt    *make_return_next_stmt(int location, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     168             : static  PLpgSQL_stmt    *make_return_query_stmt(int location, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     169             : static  PLpgSQL_stmt    *make_case(int location, PLpgSQL_expr *t_expr,
     170             :                                    List *case_when_list, List *else_stmts, yyscan_t yyscanner);
     171             : static  char            *NameOfDatum(PLwdatum *wdatum);
     172             : static  void             check_assignable(PLpgSQL_datum *datum, int location, yyscan_t yyscanner);
     173             : static  void             read_into_target(PLpgSQL_variable **target, bool *strict,
     174             :                                           YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     175             : static  PLpgSQL_row     *read_into_scalar_list(char *initial_name,
     176             :                                                PLpgSQL_datum *initial_datum,
     177             :                                                int initial_location,
     178             :                                                YYSTYPE *yylvalp, YYLTYPE *yyllocp,
     179             :                                                yyscan_t yyscanner);
     180             : static  PLpgSQL_row     *make_scalar_list1(char *initial_name,
     181             :                                            PLpgSQL_datum *initial_datum,
     182             :                                            int lineno, int location, yyscan_t yyscanner);
     183             : static  void             check_sql_expr(const char *stmt,
     184             :                                         RawParseMode parseMode, int location, yyscan_t yyscanner);
     185             : static  void             plpgsql_sql_error_callback(void *arg);
     186             : static  PLpgSQL_type    *parse_datatype(const char *string, int location, yyscan_t yyscanner);
     187             : static  void             check_labels(const char *start_label,
     188             :                                       const char *end_label,
     189             :                                       int end_location,
     190             :                                       yyscan_t yyscanner);
     191             : static  PLpgSQL_expr    *read_cursor_args(PLpgSQL_var *cursor, int until,
     192             :                                           YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     193             : static  List            *read_raise_options(YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner);
     194             : static  void            check_raise_parameters(PLpgSQL_stmt_raise *stmt);
     195             : 
     196             : 
     197             : #line 198 "pl_gram.c"
     198             : 
     199             : # ifndef YY_CAST
     200             : #  ifdef __cplusplus
     201             : #   define YY_CAST(Type, Val) static_cast<Type> (Val)
     202             : #   define YY_REINTERPRET_CAST(Type, Val) reinterpret_cast<Type> (Val)
     203             : #  else
     204             : #   define YY_CAST(Type, Val) ((Type) (Val))
     205             : #   define YY_REINTERPRET_CAST(Type, Val) ((Type) (Val))
     206             : #  endif
     207             : # endif
     208             : # ifndef YY_NULLPTR
     209             : #  if defined __cplusplus
     210             : #   if 201103L <= __cplusplus
     211             : #    define YY_NULLPTR nullptr
     212             : #   else
     213             : #    define YY_NULLPTR 0
     214             : #   endif
     215             : #  else
     216             : #   define YY_NULLPTR ((void*)0)
     217             : #  endif
     218             : # endif
     219             : 
     220             : #include "pl_gram.h"
     221             : /* Symbol kind.  */
     222             : enum yysymbol_kind_t
     223             : {
     224             :   YYSYMBOL_YYEMPTY = -2,
     225             :   YYSYMBOL_YYEOF = 0,                      /* "end of file"  */
     226             :   YYSYMBOL_YYerror = 1,                    /* error  */
     227             :   YYSYMBOL_YYUNDEF = 2,                    /* "invalid token"  */
     228             :   YYSYMBOL_IDENT = 3,                      /* IDENT  */
     229             :   YYSYMBOL_UIDENT = 4,                     /* UIDENT  */
     230             :   YYSYMBOL_FCONST = 5,                     /* FCONST  */
     231             :   YYSYMBOL_SCONST = 6,                     /* SCONST  */
     232             :   YYSYMBOL_USCONST = 7,                    /* USCONST  */
     233             :   YYSYMBOL_BCONST = 8,                     /* BCONST  */
     234             :   YYSYMBOL_XCONST = 9,                     /* XCONST  */
     235             :   YYSYMBOL_Op = 10,                        /* Op  */
     236             :   YYSYMBOL_ICONST = 11,                    /* ICONST  */
     237             :   YYSYMBOL_PARAM = 12,                     /* PARAM  */
     238             :   YYSYMBOL_TYPECAST = 13,                  /* TYPECAST  */
     239             :   YYSYMBOL_DOT_DOT = 14,                   /* DOT_DOT  */
     240             :   YYSYMBOL_COLON_EQUALS = 15,              /* COLON_EQUALS  */
     241             :   YYSYMBOL_EQUALS_GREATER = 16,            /* EQUALS_GREATER  */
     242             :   YYSYMBOL_LESS_EQUALS = 17,               /* LESS_EQUALS  */
     243             :   YYSYMBOL_GREATER_EQUALS = 18,            /* GREATER_EQUALS  */
     244             :   YYSYMBOL_NOT_EQUALS = 19,                /* NOT_EQUALS  */
     245             :   YYSYMBOL_T_WORD = 20,                    /* T_WORD  */
     246             :   YYSYMBOL_T_CWORD = 21,                   /* T_CWORD  */
     247             :   YYSYMBOL_T_DATUM = 22,                   /* T_DATUM  */
     248             :   YYSYMBOL_LESS_LESS = 23,                 /* LESS_LESS  */
     249             :   YYSYMBOL_GREATER_GREATER = 24,           /* GREATER_GREATER  */
     250             :   YYSYMBOL_K_ABSOLUTE = 25,                /* K_ABSOLUTE  */
     251             :   YYSYMBOL_K_ALIAS = 26,                   /* K_ALIAS  */
     252             :   YYSYMBOL_K_ALL = 27,                     /* K_ALL  */
     253             :   YYSYMBOL_K_AND = 28,                     /* K_AND  */
     254             :   YYSYMBOL_K_ARRAY = 29,                   /* K_ARRAY  */
     255             :   YYSYMBOL_K_ASSERT = 30,                  /* K_ASSERT  */
     256             :   YYSYMBOL_K_BACKWARD = 31,                /* K_BACKWARD  */
     257             :   YYSYMBOL_K_BEGIN = 32,                   /* K_BEGIN  */
     258             :   YYSYMBOL_K_BY = 33,                      /* K_BY  */
     259             :   YYSYMBOL_K_CALL = 34,                    /* K_CALL  */
     260             :   YYSYMBOL_K_CASE = 35,                    /* K_CASE  */
     261             :   YYSYMBOL_K_CHAIN = 36,                   /* K_CHAIN  */
     262             :   YYSYMBOL_K_CLOSE = 37,                   /* K_CLOSE  */
     263             :   YYSYMBOL_K_COLLATE = 38,                 /* K_COLLATE  */
     264             :   YYSYMBOL_K_COLUMN = 39,                  /* K_COLUMN  */
     265             :   YYSYMBOL_K_COLUMN_NAME = 40,             /* K_COLUMN_NAME  */
     266             :   YYSYMBOL_K_COMMIT = 41,                  /* K_COMMIT  */
     267             :   YYSYMBOL_K_CONSTANT = 42,                /* K_CONSTANT  */
     268             :   YYSYMBOL_K_CONSTRAINT = 43,              /* K_CONSTRAINT  */
     269             :   YYSYMBOL_K_CONSTRAINT_NAME = 44,         /* K_CONSTRAINT_NAME  */
     270             :   YYSYMBOL_K_CONTINUE = 45,                /* K_CONTINUE  */
     271             :   YYSYMBOL_K_CURRENT = 46,                 /* K_CURRENT  */
     272             :   YYSYMBOL_K_CURSOR = 47,                  /* K_CURSOR  */
     273             :   YYSYMBOL_K_DATATYPE = 48,                /* K_DATATYPE  */
     274             :   YYSYMBOL_K_DEBUG = 49,                   /* K_DEBUG  */
     275             :   YYSYMBOL_K_DECLARE = 50,                 /* K_DECLARE  */
     276             :   YYSYMBOL_K_DEFAULT = 51,                 /* K_DEFAULT  */
     277             :   YYSYMBOL_K_DETAIL = 52,                  /* K_DETAIL  */
     278             :   YYSYMBOL_K_DIAGNOSTICS = 53,             /* K_DIAGNOSTICS  */
     279             :   YYSYMBOL_K_DO = 54,                      /* K_DO  */
     280             :   YYSYMBOL_K_DUMP = 55,                    /* K_DUMP  */
     281             :   YYSYMBOL_K_ELSE = 56,                    /* K_ELSE  */
     282             :   YYSYMBOL_K_ELSIF = 57,                   /* K_ELSIF  */
     283             :   YYSYMBOL_K_END = 58,                     /* K_END  */
     284             :   YYSYMBOL_K_ERRCODE = 59,                 /* K_ERRCODE  */
     285             :   YYSYMBOL_K_ERROR = 60,                   /* K_ERROR  */
     286             :   YYSYMBOL_K_EXCEPTION = 61,               /* K_EXCEPTION  */
     287             :   YYSYMBOL_K_EXECUTE = 62,                 /* K_EXECUTE  */
     288             :   YYSYMBOL_K_EXIT = 63,                    /* K_EXIT  */
     289             :   YYSYMBOL_K_FETCH = 64,                   /* K_FETCH  */
     290             :   YYSYMBOL_K_FIRST = 65,                   /* K_FIRST  */
     291             :   YYSYMBOL_K_FOR = 66,                     /* K_FOR  */
     292             :   YYSYMBOL_K_FOREACH = 67,                 /* K_FOREACH  */
     293             :   YYSYMBOL_K_FORWARD = 68,                 /* K_FORWARD  */
     294             :   YYSYMBOL_K_FROM = 69,                    /* K_FROM  */
     295             :   YYSYMBOL_K_GET = 70,                     /* K_GET  */
     296             :   YYSYMBOL_K_HINT = 71,                    /* K_HINT  */
     297             :   YYSYMBOL_K_IF = 72,                      /* K_IF  */
     298             :   YYSYMBOL_K_IMPORT = 73,                  /* K_IMPORT  */
     299             :   YYSYMBOL_K_IN = 74,                      /* K_IN  */
     300             :   YYSYMBOL_K_INFO = 75,                    /* K_INFO  */
     301             :   YYSYMBOL_K_INSERT = 76,                  /* K_INSERT  */
     302             :   YYSYMBOL_K_INTO = 77,                    /* K_INTO  */
     303             :   YYSYMBOL_K_IS = 78,                      /* K_IS  */
     304             :   YYSYMBOL_K_LAST = 79,                    /* K_LAST  */
     305             :   YYSYMBOL_K_LOG = 80,                     /* K_LOG  */
     306             :   YYSYMBOL_K_LOOP = 81,                    /* K_LOOP  */
     307             :   YYSYMBOL_K_MERGE = 82,                   /* K_MERGE  */
     308             :   YYSYMBOL_K_MESSAGE = 83,                 /* K_MESSAGE  */
     309             :   YYSYMBOL_K_MESSAGE_TEXT = 84,            /* K_MESSAGE_TEXT  */
     310             :   YYSYMBOL_K_MOVE = 85,                    /* K_MOVE  */
     311             :   YYSYMBOL_K_NEXT = 86,                    /* K_NEXT  */
     312             :   YYSYMBOL_K_NO = 87,                      /* K_NO  */
     313             :   YYSYMBOL_K_NOT = 88,                     /* K_NOT  */
     314             :   YYSYMBOL_K_NOTICE = 89,                  /* K_NOTICE  */
     315             :   YYSYMBOL_K_NULL = 90,                    /* K_NULL  */
     316             :   YYSYMBOL_K_OPEN = 91,                    /* K_OPEN  */
     317             :   YYSYMBOL_K_OPTION = 92,                  /* K_OPTION  */
     318             :   YYSYMBOL_K_OR = 93,                      /* K_OR  */
     319             :   YYSYMBOL_K_PERFORM = 94,                 /* K_PERFORM  */
     320             :   YYSYMBOL_K_PG_CONTEXT = 95,              /* K_PG_CONTEXT  */
     321             :   YYSYMBOL_K_PG_DATATYPE_NAME = 96,        /* K_PG_DATATYPE_NAME  */
     322             :   YYSYMBOL_K_PG_EXCEPTION_CONTEXT = 97,    /* K_PG_EXCEPTION_CONTEXT  */
     323             :   YYSYMBOL_K_PG_EXCEPTION_DETAIL = 98,     /* K_PG_EXCEPTION_DETAIL  */
     324             :   YYSYMBOL_K_PG_EXCEPTION_HINT = 99,       /* K_PG_EXCEPTION_HINT  */
     325             :   YYSYMBOL_K_PG_ROUTINE_OID = 100,         /* K_PG_ROUTINE_OID  */
     326             :   YYSYMBOL_K_PRINT_STRICT_PARAMS = 101,    /* K_PRINT_STRICT_PARAMS  */
     327             :   YYSYMBOL_K_PRIOR = 102,                  /* K_PRIOR  */
     328             :   YYSYMBOL_K_QUERY = 103,                  /* K_QUERY  */
     329             :   YYSYMBOL_K_RAISE = 104,                  /* K_RAISE  */
     330             :   YYSYMBOL_K_RELATIVE = 105,               /* K_RELATIVE  */
     331             :   YYSYMBOL_K_RETURN = 106,                 /* K_RETURN  */
     332             :   YYSYMBOL_K_RETURNED_SQLSTATE = 107,      /* K_RETURNED_SQLSTATE  */
     333             :   YYSYMBOL_K_REVERSE = 108,                /* K_REVERSE  */
     334             :   YYSYMBOL_K_ROLLBACK = 109,               /* K_ROLLBACK  */
     335             :   YYSYMBOL_K_ROW_COUNT = 110,              /* K_ROW_COUNT  */
     336             :   YYSYMBOL_K_ROWTYPE = 111,                /* K_ROWTYPE  */
     337             :   YYSYMBOL_K_SCHEMA = 112,                 /* K_SCHEMA  */
     338             :   YYSYMBOL_K_SCHEMA_NAME = 113,            /* K_SCHEMA_NAME  */
     339             :   YYSYMBOL_K_SCROLL = 114,                 /* K_SCROLL  */
     340             :   YYSYMBOL_K_SLICE = 115,                  /* K_SLICE  */
     341             :   YYSYMBOL_K_SQLSTATE = 116,               /* K_SQLSTATE  */
     342             :   YYSYMBOL_K_STACKED = 117,                /* K_STACKED  */
     343             :   YYSYMBOL_K_STRICT = 118,                 /* K_STRICT  */
     344             :   YYSYMBOL_K_TABLE = 119,                  /* K_TABLE  */
     345             :   YYSYMBOL_K_TABLE_NAME = 120,             /* K_TABLE_NAME  */
     346             :   YYSYMBOL_K_THEN = 121,                   /* K_THEN  */
     347             :   YYSYMBOL_K_TO = 122,                     /* K_TO  */
     348             :   YYSYMBOL_K_TYPE = 123,                   /* K_TYPE  */
     349             :   YYSYMBOL_K_USE_COLUMN = 124,             /* K_USE_COLUMN  */
     350             :   YYSYMBOL_K_USE_VARIABLE = 125,           /* K_USE_VARIABLE  */
     351             :   YYSYMBOL_K_USING = 126,                  /* K_USING  */
     352             :   YYSYMBOL_K_VARIABLE_CONFLICT = 127,      /* K_VARIABLE_CONFLICT  */
     353             :   YYSYMBOL_K_WARNING = 128,                /* K_WARNING  */
     354             :   YYSYMBOL_K_WHEN = 129,                   /* K_WHEN  */
     355             :   YYSYMBOL_K_WHILE = 130,                  /* K_WHILE  */
     356             :   YYSYMBOL_131_ = 131,                     /* '#'  */
     357             :   YYSYMBOL_132_ = 132,                     /* ';'  */
     358             :   YYSYMBOL_133_ = 133,                     /* '('  */
     359             :   YYSYMBOL_134_ = 134,                     /* ')'  */
     360             :   YYSYMBOL_135_ = 135,                     /* ','  */
     361             :   YYSYMBOL_136_ = 136,                     /* '='  */
     362             :   YYSYMBOL_YYACCEPT = 137,                 /* $accept  */
     363             :   YYSYMBOL_pl_function = 138,              /* pl_function  */
     364             :   YYSYMBOL_comp_options = 139,             /* comp_options  */
     365             :   YYSYMBOL_comp_option = 140,              /* comp_option  */
     366             :   YYSYMBOL_option_value = 141,             /* option_value  */
     367             :   YYSYMBOL_opt_semi = 142,                 /* opt_semi  */
     368             :   YYSYMBOL_pl_block = 143,                 /* pl_block  */
     369             :   YYSYMBOL_decl_sect = 144,                /* decl_sect  */
     370             :   YYSYMBOL_decl_start = 145,               /* decl_start  */
     371             :   YYSYMBOL_decl_stmts = 146,               /* decl_stmts  */
     372             :   YYSYMBOL_decl_stmt = 147,                /* decl_stmt  */
     373             :   YYSYMBOL_decl_statement = 148,           /* decl_statement  */
     374             :   YYSYMBOL_149_1 = 149,                    /* $@1  */
     375             :   YYSYMBOL_opt_scrollable = 150,           /* opt_scrollable  */
     376             :   YYSYMBOL_decl_cursor_query = 151,        /* decl_cursor_query  */
     377             :   YYSYMBOL_decl_cursor_args = 152,         /* decl_cursor_args  */
     378             :   YYSYMBOL_decl_cursor_arglist = 153,      /* decl_cursor_arglist  */
     379             :   YYSYMBOL_decl_cursor_arg = 154,          /* decl_cursor_arg  */
     380             :   YYSYMBOL_decl_is_for = 155,              /* decl_is_for  */
     381             :   YYSYMBOL_decl_aliasitem = 156,           /* decl_aliasitem  */
     382             :   YYSYMBOL_decl_varname = 157,             /* decl_varname  */
     383             :   YYSYMBOL_decl_const = 158,               /* decl_const  */
     384             :   YYSYMBOL_decl_datatype = 159,            /* decl_datatype  */
     385             :   YYSYMBOL_decl_collate = 160,             /* decl_collate  */
     386             :   YYSYMBOL_decl_notnull = 161,             /* decl_notnull  */
     387             :   YYSYMBOL_decl_defval = 162,              /* decl_defval  */
     388             :   YYSYMBOL_decl_defkey = 163,              /* decl_defkey  */
     389             :   YYSYMBOL_assign_operator = 164,          /* assign_operator  */
     390             :   YYSYMBOL_proc_sect = 165,                /* proc_sect  */
     391             :   YYSYMBOL_proc_stmt = 166,                /* proc_stmt  */
     392             :   YYSYMBOL_stmt_perform = 167,             /* stmt_perform  */
     393             :   YYSYMBOL_stmt_call = 168,                /* stmt_call  */
     394             :   YYSYMBOL_stmt_assign = 169,              /* stmt_assign  */
     395             :   YYSYMBOL_stmt_getdiag = 170,             /* stmt_getdiag  */
     396             :   YYSYMBOL_getdiag_area_opt = 171,         /* getdiag_area_opt  */
     397             :   YYSYMBOL_getdiag_list = 172,             /* getdiag_list  */
     398             :   YYSYMBOL_getdiag_list_item = 173,        /* getdiag_list_item  */
     399             :   YYSYMBOL_getdiag_item = 174,             /* getdiag_item  */
     400             :   YYSYMBOL_getdiag_target = 175,           /* getdiag_target  */
     401             :   YYSYMBOL_stmt_if = 176,                  /* stmt_if  */
     402             :   YYSYMBOL_stmt_elsifs = 177,              /* stmt_elsifs  */
     403             :   YYSYMBOL_stmt_else = 178,                /* stmt_else  */
     404             :   YYSYMBOL_stmt_case = 179,                /* stmt_case  */
     405             :   YYSYMBOL_opt_expr_until_when = 180,      /* opt_expr_until_when  */
     406             :   YYSYMBOL_case_when_list = 181,           /* case_when_list  */
     407             :   YYSYMBOL_case_when = 182,                /* case_when  */
     408             :   YYSYMBOL_opt_case_else = 183,            /* opt_case_else  */
     409             :   YYSYMBOL_stmt_loop = 184,                /* stmt_loop  */
     410             :   YYSYMBOL_stmt_while = 185,               /* stmt_while  */
     411             :   YYSYMBOL_stmt_for = 186,                 /* stmt_for  */
     412             :   YYSYMBOL_for_control = 187,              /* for_control  */
     413             :   YYSYMBOL_for_variable = 188,             /* for_variable  */
     414             :   YYSYMBOL_stmt_foreach_a = 189,           /* stmt_foreach_a  */
     415             :   YYSYMBOL_foreach_slice = 190,            /* foreach_slice  */
     416             :   YYSYMBOL_stmt_exit = 191,                /* stmt_exit  */
     417             :   YYSYMBOL_exit_type = 192,                /* exit_type  */
     418             :   YYSYMBOL_stmt_return = 193,              /* stmt_return  */
     419             :   YYSYMBOL_stmt_raise = 194,               /* stmt_raise  */
     420             :   YYSYMBOL_stmt_assert = 195,              /* stmt_assert  */
     421             :   YYSYMBOL_loop_body = 196,                /* loop_body  */
     422             :   YYSYMBOL_stmt_execsql = 197,             /* stmt_execsql  */
     423             :   YYSYMBOL_stmt_dynexecute = 198,          /* stmt_dynexecute  */
     424             :   YYSYMBOL_stmt_open = 199,                /* stmt_open  */
     425             :   YYSYMBOL_stmt_fetch = 200,               /* stmt_fetch  */
     426             :   YYSYMBOL_stmt_move = 201,                /* stmt_move  */
     427             :   YYSYMBOL_opt_fetch_direction = 202,      /* opt_fetch_direction  */
     428             :   YYSYMBOL_stmt_close = 203,               /* stmt_close  */
     429             :   YYSYMBOL_stmt_null = 204,                /* stmt_null  */
     430             :   YYSYMBOL_stmt_commit = 205,              /* stmt_commit  */
     431             :   YYSYMBOL_stmt_rollback = 206,            /* stmt_rollback  */
     432             :   YYSYMBOL_opt_transaction_chain = 207,    /* opt_transaction_chain  */
     433             :   YYSYMBOL_cursor_variable = 208,          /* cursor_variable  */
     434             :   YYSYMBOL_exception_sect = 209,           /* exception_sect  */
     435             :   YYSYMBOL_210_2 = 210,                    /* @2  */
     436             :   YYSYMBOL_proc_exceptions = 211,          /* proc_exceptions  */
     437             :   YYSYMBOL_proc_exception = 212,           /* proc_exception  */
     438             :   YYSYMBOL_proc_conditions = 213,          /* proc_conditions  */
     439             :   YYSYMBOL_proc_condition = 214,           /* proc_condition  */
     440             :   YYSYMBOL_expr_until_semi = 215,          /* expr_until_semi  */
     441             :   YYSYMBOL_expr_until_then = 216,          /* expr_until_then  */
     442             :   YYSYMBOL_expr_until_loop = 217,          /* expr_until_loop  */
     443             :   YYSYMBOL_opt_block_label = 218,          /* opt_block_label  */
     444             :   YYSYMBOL_opt_loop_label = 219,           /* opt_loop_label  */
     445             :   YYSYMBOL_opt_label = 220,                /* opt_label  */
     446             :   YYSYMBOL_opt_exitcond = 221,             /* opt_exitcond  */
     447             :   YYSYMBOL_any_identifier = 222,           /* any_identifier  */
     448             :   YYSYMBOL_unreserved_keyword = 223        /* unreserved_keyword  */
     449             : };
     450             : typedef enum yysymbol_kind_t yysymbol_kind_t;
     451             : 
     452             : 
     453             : 
     454             : 
     455             : #ifdef short
     456             : # undef short
     457             : #endif
     458             : 
     459             : /* On compilers that do not define __PTRDIFF_MAX__ etc., make sure
     460             :    <limits.h> and (if available) <stdint.h> are included
     461             :    so that the code can choose integer types of a good width.  */
     462             : 
     463             : #ifndef __PTRDIFF_MAX__
     464             : # include <limits.h> /* INFRINGES ON USER NAME SPACE */
     465             : # if defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
     466             : #  include <stdint.h> /* INFRINGES ON USER NAME SPACE */
     467             : #  define YY_STDINT_H
     468             : # endif
     469             : #endif
     470             : 
     471             : /* Narrow types that promote to a signed type and that can represent a
     472             :    signed or unsigned integer of at least N bits.  In tables they can
     473             :    save space and decrease cache pressure.  Promoting to a signed type
     474             :    helps avoid bugs in integer arithmetic.  */
     475             : 
     476             : #ifdef __INT_LEAST8_MAX__
     477             : typedef __INT_LEAST8_TYPE__ yytype_int8;
     478             : #elif defined YY_STDINT_H
     479             : typedef int_least8_t yytype_int8;
     480             : #else
     481             : typedef signed char yytype_int8;
     482             : #endif
     483             : 
     484             : #ifdef __INT_LEAST16_MAX__
     485             : typedef __INT_LEAST16_TYPE__ yytype_int16;
     486             : #elif defined YY_STDINT_H
     487             : typedef int_least16_t yytype_int16;
     488             : #else
     489             : typedef short yytype_int16;
     490             : #endif
     491             : 
     492             : /* Work around bug in HP-UX 11.23, which defines these macros
     493             :    incorrectly for preprocessor constants.  This workaround can likely
     494             :    be removed in 2023, as HPE has promised support for HP-UX 11.23
     495             :    (aka HP-UX 11i v2) only through the end of 2022; see Table 2 of
     496             :    <https://h20195.www2.hpe.com/V2/getpdf.aspx/4AA4-7673ENW.pdf>.  */
     497             : #ifdef __hpux
     498             : # undef UINT_LEAST8_MAX
     499             : # undef UINT_LEAST16_MAX
     500             : # define UINT_LEAST8_MAX 255
     501             : # define UINT_LEAST16_MAX 65535
     502             : #endif
     503             : 
     504             : #if defined __UINT_LEAST8_MAX__ && __UINT_LEAST8_MAX__ <= __INT_MAX__
     505             : typedef __UINT_LEAST8_TYPE__ yytype_uint8;
     506             : #elif (!defined __UINT_LEAST8_MAX__ && defined YY_STDINT_H \
     507             :        && UINT_LEAST8_MAX <= INT_MAX)
     508             : typedef uint_least8_t yytype_uint8;
     509             : #elif !defined __UINT_LEAST8_MAX__ && UCHAR_MAX <= INT_MAX
     510             : typedef unsigned char yytype_uint8;
     511             : #else
     512             : typedef short yytype_uint8;
     513             : #endif
     514             : 
     515             : #if defined __UINT_LEAST16_MAX__ && __UINT_LEAST16_MAX__ <= __INT_MAX__
     516             : typedef __UINT_LEAST16_TYPE__ yytype_uint16;
     517             : #elif (!defined __UINT_LEAST16_MAX__ && defined YY_STDINT_H \
     518             :        && UINT_LEAST16_MAX <= INT_MAX)
     519             : typedef uint_least16_t yytype_uint16;
     520             : #elif !defined __UINT_LEAST16_MAX__ && USHRT_MAX <= INT_MAX
     521             : typedef unsigned short yytype_uint16;
     522             : #else
     523             : typedef int yytype_uint16;
     524             : #endif
     525             : 
     526             : #ifndef YYPTRDIFF_T
     527             : # if defined __PTRDIFF_TYPE__ && defined __PTRDIFF_MAX__
     528             : #  define YYPTRDIFF_T __PTRDIFF_TYPE__
     529             : #  define YYPTRDIFF_MAXIMUM __PTRDIFF_MAX__
     530             : # elif defined PTRDIFF_MAX
     531             : #  ifndef ptrdiff_t
     532             : #   include <stddef.h> /* INFRINGES ON USER NAME SPACE */
     533             : #  endif
     534             : #  define YYPTRDIFF_T ptrdiff_t
     535             : #  define YYPTRDIFF_MAXIMUM PTRDIFF_MAX
     536             : # else
     537             : #  define YYPTRDIFF_T long
     538             : #  define YYPTRDIFF_MAXIMUM LONG_MAX
     539             : # endif
     540             : #endif
     541             : 
     542             : #ifndef YYSIZE_T
     543             : # ifdef __SIZE_TYPE__
     544             : #  define YYSIZE_T __SIZE_TYPE__
     545             : # elif defined size_t
     546             : #  define YYSIZE_T size_t
     547             : # elif defined __STDC_VERSION__ && 199901 <= __STDC_VERSION__
     548             : #  include <stddef.h> /* INFRINGES ON USER NAME SPACE */
     549             : #  define YYSIZE_T size_t
     550             : # else
     551             : #  define YYSIZE_T unsigned
     552             : # endif
     553             : #endif
     554             : 
     555             : #define YYSIZE_MAXIMUM                                  \
     556             :   YY_CAST (YYPTRDIFF_T,                                 \
     557             :            (YYPTRDIFF_MAXIMUM < YY_CAST (YYSIZE_T, -1)  \
     558             :             ? YYPTRDIFF_MAXIMUM                         \
     559             :             : YY_CAST (YYSIZE_T, -1)))
     560             : 
     561             : #define YYSIZEOF(X) YY_CAST (YYPTRDIFF_T, sizeof (X))
     562             : 
     563             : 
     564             : /* Stored state numbers (used for stacks). */
     565             : typedef yytype_int16 yy_state_t;
     566             : 
     567             : /* State numbers in computations.  */
     568             : typedef int yy_state_fast_t;
     569             : 
     570             : #ifndef YY_
     571             : # if defined YYENABLE_NLS && YYENABLE_NLS
     572             : #  if ENABLE_NLS
     573             : #   include <libintl.h> /* INFRINGES ON USER NAME SPACE */
     574             : #   define YY_(Msgid) dgettext ("bison-runtime", Msgid)
     575             : #  endif
     576             : # endif
     577             : # ifndef YY_
     578             : #  define YY_(Msgid) Msgid
     579             : # endif
     580             : #endif
     581             : 
     582             : 
     583             : #ifndef YY_ATTRIBUTE_PURE
     584             : # if defined __GNUC__ && 2 < __GNUC__ + (96 <= __GNUC_MINOR__)
     585             : #  define YY_ATTRIBUTE_PURE __attribute__ ((__pure__))
     586             : # else
     587             : #  define YY_ATTRIBUTE_PURE
     588             : # endif
     589             : #endif
     590             : 
     591             : #ifndef YY_ATTRIBUTE_UNUSED
     592             : # if defined __GNUC__ && 2 < __GNUC__ + (7 <= __GNUC_MINOR__)
     593             : #  define YY_ATTRIBUTE_UNUSED __attribute__ ((__unused__))
     594             : # else
     595             : #  define YY_ATTRIBUTE_UNUSED
     596             : # endif
     597             : #endif
     598             : 
     599             : /* Suppress unused-variable warnings by "using" E.  */
     600             : #if ! defined lint || defined __GNUC__
     601             : # define YY_USE(E) ((void) (E))
     602             : #else
     603             : # define YY_USE(E) /* empty */
     604             : #endif
     605             : 
     606             : /* Suppress an incorrect diagnostic about yylval being uninitialized.  */
     607             : #if defined __GNUC__ && ! defined __ICC && 406 <= __GNUC__ * 100 + __GNUC_MINOR__
     608             : # if __GNUC__ * 100 + __GNUC_MINOR__ < 407
     609             : #  define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                           \
     610             :     _Pragma ("GCC diagnostic push")                                     \
     611             :     _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")
     612             : # else
     613             : #  define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN                           \
     614             :     _Pragma ("GCC diagnostic push")                                     \
     615             :     _Pragma ("GCC diagnostic ignored \"-Wuninitialized\"")              \
     616             :     _Pragma ("GCC diagnostic ignored \"-Wmaybe-uninitialized\"")
     617             : # endif
     618             : # define YY_IGNORE_MAYBE_UNINITIALIZED_END      \
     619             :     _Pragma ("GCC diagnostic pop")
     620             : #else
     621             : # define YY_INITIAL_VALUE(Value) Value
     622             : #endif
     623             : #ifndef YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
     624             : # define YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
     625             : # define YY_IGNORE_MAYBE_UNINITIALIZED_END
     626             : #endif
     627             : #ifndef YY_INITIAL_VALUE
     628             : # define YY_INITIAL_VALUE(Value) /* Nothing. */
     629             : #endif
     630             : 
     631             : #if defined __cplusplus && defined __GNUC__ && ! defined __ICC && 6 <= __GNUC__
     632             : # define YY_IGNORE_USELESS_CAST_BEGIN                          \
     633             :     _Pragma ("GCC diagnostic push")                            \
     634             :     _Pragma ("GCC diagnostic ignored \"-Wuseless-cast\"")
     635             : # define YY_IGNORE_USELESS_CAST_END            \
     636             :     _Pragma ("GCC diagnostic pop")
     637             : #endif
     638             : #ifndef YY_IGNORE_USELESS_CAST_BEGIN
     639             : # define YY_IGNORE_USELESS_CAST_BEGIN
     640             : # define YY_IGNORE_USELESS_CAST_END
     641             : #endif
     642             : 
     643             : 
     644             : #define YY_ASSERT(E) ((void) (0 && (E)))
     645             : 
     646             : #if !defined yyoverflow
     647             : 
     648             : /* The parser invokes alloca or malloc; define the necessary symbols.  */
     649             : 
     650             : # ifdef YYSTACK_USE_ALLOCA
     651             : #  if YYSTACK_USE_ALLOCA
     652             : #   ifdef __GNUC__
     653             : #    define YYSTACK_ALLOC __builtin_alloca
     654             : #   elif defined __BUILTIN_VA_ARG_INCR
     655             : #    include <alloca.h> /* INFRINGES ON USER NAME SPACE */
     656             : #   elif defined _AIX
     657             : #    define YYSTACK_ALLOC __alloca
     658             : #   elif defined _MSC_VER
     659             : #    include <malloc.h> /* INFRINGES ON USER NAME SPACE */
     660             : #    define alloca _alloca
     661             : #   else
     662             : #    define YYSTACK_ALLOC alloca
     663             : #    if ! defined _ALLOCA_H && ! defined EXIT_SUCCESS
     664             : #     include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
     665             :       /* Use EXIT_SUCCESS as a witness for stdlib.h.  */
     666             : #     ifndef EXIT_SUCCESS
     667             : #      define EXIT_SUCCESS 0
     668             : #     endif
     669             : #    endif
     670             : #   endif
     671             : #  endif
     672             : # endif
     673             : 
     674             : # ifdef YYSTACK_ALLOC
     675             :    /* Pacify GCC's 'empty if-body' warning.  */
     676             : #  define YYSTACK_FREE(Ptr) do { /* empty */; } while (0)
     677             : #  ifndef YYSTACK_ALLOC_MAXIMUM
     678             :     /* The OS might guarantee only one guard page at the bottom of the stack,
     679             :        and a page size can be as small as 4096 bytes.  So we cannot safely
     680             :        invoke alloca (N) if N exceeds 4096.  Use a slightly smaller number
     681             :        to allow for a few compiler-allocated temporary stack slots.  */
     682             : #   define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
     683             : #  endif
     684             : # else
     685             : #  define YYSTACK_ALLOC YYMALLOC
     686             : #  define YYSTACK_FREE YYFREE
     687             : #  ifndef YYSTACK_ALLOC_MAXIMUM
     688             : #   define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
     689             : #  endif
     690             : #  if (defined __cplusplus && ! defined EXIT_SUCCESS \
     691             :        && ! ((defined YYMALLOC || defined malloc) \
     692             :              && (defined YYFREE || defined free)))
     693             : #   include <stdlib.h> /* INFRINGES ON USER NAME SPACE */
     694             : #   ifndef EXIT_SUCCESS
     695             : #    define EXIT_SUCCESS 0
     696             : #   endif
     697             : #  endif
     698             : #  ifndef YYMALLOC
     699             : #   define YYMALLOC malloc
     700             : #   if ! defined malloc && ! defined EXIT_SUCCESS
     701             : void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
     702             : #   endif
     703             : #  endif
     704             : #  ifndef YYFREE
     705             : #   define YYFREE free
     706             : #   if ! defined free && ! defined EXIT_SUCCESS
     707             : void free (void *); /* INFRINGES ON USER NAME SPACE */
     708             : #   endif
     709             : #  endif
     710             : # endif
     711             : #endif /* !defined yyoverflow */
     712             : 
     713             : #if (! defined yyoverflow \
     714             :      && (! defined __cplusplus \
     715             :          || (defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
     716             :              && defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL)))
     717             : 
     718             : /* A type that is properly aligned for any stack member.  */
     719             : union yyalloc
     720             : {
     721             :   yy_state_t yyss_alloc;
     722             :   YYSTYPE yyvs_alloc;
     723             :   YYLTYPE yyls_alloc;
     724             : };
     725             : 
     726             : /* The size of the maximum gap between one aligned stack and the next.  */
     727             : # define YYSTACK_GAP_MAXIMUM (YYSIZEOF (union yyalloc) - 1)
     728             : 
     729             : /* The size of an array large to enough to hold all stacks, each with
     730             :    N elements.  */
     731             : # define YYSTACK_BYTES(N) \
     732             :      ((N) * (YYSIZEOF (yy_state_t) + YYSIZEOF (YYSTYPE) \
     733             :              + YYSIZEOF (YYLTYPE)) \
     734             :       + 2 * YYSTACK_GAP_MAXIMUM)
     735             : 
     736             : # define YYCOPY_NEEDED 1
     737             : 
     738             : /* Relocate STACK from its old location to the new one.  The
     739             :    local variables YYSIZE and YYSTACKSIZE give the old and new number of
     740             :    elements in the stack, and YYPTR gives the new location of the
     741             :    stack.  Advance YYPTR to a properly aligned location for the next
     742             :    stack.  */
     743             : # define YYSTACK_RELOCATE(Stack_alloc, Stack)                           \
     744             :     do                                                                  \
     745             :       {                                                                 \
     746             :         YYPTRDIFF_T yynewbytes;                                         \
     747             :         YYCOPY (&yyptr->Stack_alloc, Stack, yysize);                    \
     748             :         Stack = &yyptr->Stack_alloc;                                    \
     749             :         yynewbytes = yystacksize * YYSIZEOF (*Stack) + YYSTACK_GAP_MAXIMUM; \
     750             :         yyptr += yynewbytes / YYSIZEOF (*yyptr);                        \
     751             :       }                                                                 \
     752             :     while (0)
     753             : 
     754             : #endif
     755             : 
     756             : #if defined YYCOPY_NEEDED && YYCOPY_NEEDED
     757             : /* Copy COUNT objects from SRC to DST.  The source and destination do
     758             :    not overlap.  */
     759             : # ifndef YYCOPY
     760             : #  if defined __GNUC__ && 1 < __GNUC__
     761             : #   define YYCOPY(Dst, Src, Count) \
     762             :       __builtin_memcpy (Dst, Src, YY_CAST (YYSIZE_T, (Count)) * sizeof (*(Src)))
     763             : #  else
     764             : #   define YYCOPY(Dst, Src, Count)              \
     765             :       do                                        \
     766             :         {                                       \
     767             :           YYPTRDIFF_T yyi;                      \
     768             :           for (yyi = 0; yyi < (Count); yyi++)   \
     769             :             (Dst)[yyi] = (Src)[yyi];            \
     770             :         }                                       \
     771             :       while (0)
     772             : #  endif
     773             : # endif
     774             : #endif /* !YYCOPY_NEEDED */
     775             : 
     776             : /* YYFINAL -- State number of the termination state.  */
     777             : #define YYFINAL  3
     778             : /* YYLAST -- Last index in YYTABLE.  */
     779             : #define YYLAST   1305
     780             : 
     781             : /* YYNTOKENS -- Number of terminals.  */
     782             : #define YYNTOKENS  137
     783             : /* YYNNTS -- Number of nonterminals.  */
     784             : #define YYNNTS  87
     785             : /* YYNRULES -- Number of rules.  */
     786             : #define YYNRULES  255
     787             : /* YYNSTATES -- Number of states.  */
     788             : #define YYNSTATES  336
     789             : 
     790             : /* YYMAXUTOK -- Last valid token kind.  */
     791             : #define YYMAXUTOK   385
     792             : 
     793             : 
     794             : /* YYTRANSLATE(TOKEN-NUM) -- Symbol number corresponding to TOKEN-NUM
     795             :    as returned by yylex, with out-of-bounds checking.  */
     796             : #define YYTRANSLATE(YYX)                                \
     797             :   (0 <= (YYX) && (YYX) <= YYMAXUTOK                     \
     798             :    ? YY_CAST (yysymbol_kind_t, yytranslate[YYX])        \
     799             :    : YYSYMBOL_YYUNDEF)
     800             : 
     801             : /* YYTRANSLATE[TOKEN-NUM] -- Symbol number corresponding to TOKEN-NUM
     802             :    as returned by yylex.  */
     803             : static const yytype_uint8 yytranslate[] =
     804             : {
     805             :        0,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     806             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     807             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     808             :        2,     2,     2,     2,     2,   131,     2,     2,     2,     2,
     809             :      133,   134,     2,     2,   135,     2,     2,     2,     2,     2,
     810             :        2,     2,     2,     2,     2,     2,     2,     2,     2,   132,
     811             :        2,   136,     2,     2,     2,     2,     2,     2,     2,     2,
     812             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     813             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     814             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     815             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     816             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     817             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     818             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     819             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     820             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     821             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     822             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     823             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     824             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     825             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     826             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     827             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     828             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     829             :        2,     2,     2,     2,     2,     2,     2,     2,     2,     2,
     830             :        2,     2,     2,     2,     2,     2,     1,     2,     3,     4,
     831             :        5,     6,     7,     8,     9,    10,    11,    12,    13,    14,
     832             :       15,    16,    17,    18,    19,    20,    21,    22,    23,    24,
     833             :       25,    26,    27,    28,    29,    30,    31,    32,    33,    34,
     834             :       35,    36,    37,    38,    39,    40,    41,    42,    43,    44,
     835             :       45,    46,    47,    48,    49,    50,    51,    52,    53,    54,
     836             :       55,    56,    57,    58,    59,    60,    61,    62,    63,    64,
     837             :       65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
     838             :       75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
     839             :       85,    86,    87,    88,    89,    90,    91,    92,    93,    94,
     840             :       95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
     841             :      105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
     842             :      115,   116,   117,   118,   119,   120,   121,   122,   123,   124,
     843             :      125,   126,   127,   128,   129,   130
     844             : };
     845             : 
     846             : #if YYDEBUG
     847             : /* YYRLINE[YYN] -- Source line where rule number YYN was defined.  */
     848             : static const yytype_int16 yyrline[] =
     849             : {
     850             :        0,   374,   374,   381,   382,   385,   389,   398,   402,   406,
     851             :      412,   416,   421,   422,   425,   448,   456,   463,   472,   484,
     852             :      485,   488,   489,   493,   506,   548,   554,   553,   580,   583,
     853             :      587,   594,   600,   603,   634,   638,   644,   652,   653,   655,
     854             :      670,   685,   713,   741,   772,   773,   778,   790,   791,   796,
     855             :      801,   808,   809,   813,   815,   821,   822,   830,   831,   835,
     856             :      836,   846,   848,   850,   852,   854,   856,   858,   860,   862,
     857             :      864,   866,   868,   870,   872,   874,   876,   878,   880,   882,
     858             :      884,   886,   888,   890,   892,   896,   933,   951,   972,  1013,
     859             :     1077,  1080,  1084,  1090,  1094,  1100,  1113,  1160,  1178,  1183,
     860             :     1190,  1208,  1211,  1225,  1228,  1234,  1241,  1255,  1259,  1265,
     861             :     1277,  1280,  1295,  1313,  1332,  1366,  1625,  1653,  1667,  1674,
     862             :     1713,  1716,  1722,  1775,  1779,  1785,  1811,  1957,  1981,  1999,
     863             :     2003,  2007,  2011,  2022,  2035,  2101,  2180,  2210,  2223,  2228,
     864             :     2242,  2249,  2263,  2278,  2279,  2280,  2284,  2306,  2311,  2319,
     865             :     2321,  2320,  2364,  2368,  2374,  2387,  2396,  2402,  2439,  2443,
     866             :     2447,  2451,  2455,  2463,  2467,  2475,  2478,  2485,  2487,  2494,
     867             :     2498,  2502,  2511,  2512,  2513,  2514,  2515,  2516,  2517,  2518,
     868             :     2519,  2520,  2521,  2522,  2523,  2524,  2525,  2526,  2527,  2528,
     869             :     2529,  2530,  2531,  2532,  2533,  2534,  2535,  2536,  2537,  2538,
     870             :     2539,  2540,  2541,  2542,  2543,  2544,  2545,  2546,  2547,  2548,
     871             :     2549,  2550,  2551,  2552,  2553,  2554,  2555,  2556,  2557,  2558,
     872             :     2559,  2560,  2561,  2562,  2563,  2564,  2565,  2566,  2567,  2568,
     873             :     2569,  2570,  2571,  2572,  2573,  2574,  2575,  2576,  2577,  2578,
     874             :     2579,  2580,  2581,  2582,  2583,  2584,  2585,  2586,  2587,  2588,
     875             :     2589,  2590,  2591,  2592,  2593,  2594
     876             : };
     877             : #endif
     878             : 
     879             : /** Accessing symbol of state STATE.  */
     880             : #define YY_ACCESSING_SYMBOL(State) YY_CAST (yysymbol_kind_t, yystos[State])
     881             : 
     882             : #if YYDEBUG || 0
     883             : /* The user-facing name of the symbol whose (internal) number is
     884             :    YYSYMBOL.  No bounds checking.  */
     885             : static const char *yysymbol_name (yysymbol_kind_t yysymbol) YY_ATTRIBUTE_UNUSED;
     886             : 
     887             : /* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
     888             :    First, the terminals, then, starting at YYNTOKENS, nonterminals.  */
     889             : static const char *const yytname[] =
     890             : {
     891             :   "\"end of file\"", "error", "\"invalid token\"", "IDENT", "UIDENT",
     892             :   "FCONST", "SCONST", "USCONST", "BCONST", "XCONST", "Op", "ICONST",
     893             :   "PARAM", "TYPECAST", "DOT_DOT", "COLON_EQUALS", "EQUALS_GREATER",
     894             :   "LESS_EQUALS", "GREATER_EQUALS", "NOT_EQUALS", "T_WORD", "T_CWORD",
     895             :   "T_DATUM", "LESS_LESS", "GREATER_GREATER", "K_ABSOLUTE", "K_ALIAS",
     896             :   "K_ALL", "K_AND", "K_ARRAY", "K_ASSERT", "K_BACKWARD", "K_BEGIN", "K_BY",
     897             :   "K_CALL", "K_CASE", "K_CHAIN", "K_CLOSE", "K_COLLATE", "K_COLUMN",
     898             :   "K_COLUMN_NAME", "K_COMMIT", "K_CONSTANT", "K_CONSTRAINT",
     899             :   "K_CONSTRAINT_NAME", "K_CONTINUE", "K_CURRENT", "K_CURSOR", "K_DATATYPE",
     900             :   "K_DEBUG", "K_DECLARE", "K_DEFAULT", "K_DETAIL", "K_DIAGNOSTICS", "K_DO",
     901             :   "K_DUMP", "K_ELSE", "K_ELSIF", "K_END", "K_ERRCODE", "K_ERROR",
     902             :   "K_EXCEPTION", "K_EXECUTE", "K_EXIT", "K_FETCH", "K_FIRST", "K_FOR",
     903             :   "K_FOREACH", "K_FORWARD", "K_FROM", "K_GET", "K_HINT", "K_IF",
     904             :   "K_IMPORT", "K_IN", "K_INFO", "K_INSERT", "K_INTO", "K_IS", "K_LAST",
     905             :   "K_LOG", "K_LOOP", "K_MERGE", "K_MESSAGE", "K_MESSAGE_TEXT", "K_MOVE",
     906             :   "K_NEXT", "K_NO", "K_NOT", "K_NOTICE", "K_NULL", "K_OPEN", "K_OPTION",
     907             :   "K_OR", "K_PERFORM", "K_PG_CONTEXT", "K_PG_DATATYPE_NAME",
     908             :   "K_PG_EXCEPTION_CONTEXT", "K_PG_EXCEPTION_DETAIL", "K_PG_EXCEPTION_HINT",
     909             :   "K_PG_ROUTINE_OID", "K_PRINT_STRICT_PARAMS", "K_PRIOR", "K_QUERY",
     910             :   "K_RAISE", "K_RELATIVE", "K_RETURN", "K_RETURNED_SQLSTATE", "K_REVERSE",
     911             :   "K_ROLLBACK", "K_ROW_COUNT", "K_ROWTYPE", "K_SCHEMA", "K_SCHEMA_NAME",
     912             :   "K_SCROLL", "K_SLICE", "K_SQLSTATE", "K_STACKED", "K_STRICT", "K_TABLE",
     913             :   "K_TABLE_NAME", "K_THEN", "K_TO", "K_TYPE", "K_USE_COLUMN",
     914             :   "K_USE_VARIABLE", "K_USING", "K_VARIABLE_CONFLICT", "K_WARNING",
     915             :   "K_WHEN", "K_WHILE", "'#'", "';'", "'('", "')'", "','", "'='", "$accept",
     916             :   "pl_function", "comp_options", "comp_option", "option_value", "opt_semi",
     917             :   "pl_block", "decl_sect", "decl_start", "decl_stmts", "decl_stmt",
     918             :   "decl_statement", "$@1", "opt_scrollable", "decl_cursor_query",
     919             :   "decl_cursor_args", "decl_cursor_arglist", "decl_cursor_arg",
     920             :   "decl_is_for", "decl_aliasitem", "decl_varname", "decl_const",
     921             :   "decl_datatype", "decl_collate", "decl_notnull", "decl_defval",
     922             :   "decl_defkey", "assign_operator", "proc_sect", "proc_stmt",
     923             :   "stmt_perform", "stmt_call", "stmt_assign", "stmt_getdiag",
     924             :   "getdiag_area_opt", "getdiag_list", "getdiag_list_item", "getdiag_item",
     925             :   "getdiag_target", "stmt_if", "stmt_elsifs", "stmt_else", "stmt_case",
     926             :   "opt_expr_until_when", "case_when_list", "case_when", "opt_case_else",
     927             :   "stmt_loop", "stmt_while", "stmt_for", "for_control", "for_variable",
     928             :   "stmt_foreach_a", "foreach_slice", "stmt_exit", "exit_type",
     929             :   "stmt_return", "stmt_raise", "stmt_assert", "loop_body", "stmt_execsql",
     930             :   "stmt_dynexecute", "stmt_open", "stmt_fetch", "stmt_move",
     931             :   "opt_fetch_direction", "stmt_close", "stmt_null", "stmt_commit",
     932             :   "stmt_rollback", "opt_transaction_chain", "cursor_variable",
     933             :   "exception_sect", "@2", "proc_exceptions", "proc_exception",
     934             :   "proc_conditions", "proc_condition", "expr_until_semi",
     935             :   "expr_until_then", "expr_until_loop", "opt_block_label",
     936             :   "opt_loop_label", "opt_label", "opt_exitcond", "any_identifier",
     937             :   "unreserved_keyword", YY_NULLPTR
     938             : };
     939             : 
     940             : static const char *
     941             : yysymbol_name (yysymbol_kind_t yysymbol)
     942             : {
     943             :   return yytname[yysymbol];
     944             : }
     945             : #endif
     946             : 
     947             : #define YYPACT_NINF (-245)
     948             : 
     949             : #define yypact_value_is_default(Yyn) \
     950             :   ((Yyn) == YYPACT_NINF)
     951             : 
     952             : #define YYTABLE_NINF (-163)
     953             : 
     954             : #define yytable_value_is_error(Yyn) \
     955             :   0
     956             : 
     957             : /* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
     958             :    STATE-NUM.  */
     959             : static const yytype_int16 yypact[] =
     960             : {
     961             :     -245,    29,   -18,  -245,   327,   -51,  -245,   -99,     8,     7,
     962             :     -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,
     963             :     -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,
     964             :     -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,
     965             :     -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,
     966             :     -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,
     967             :     -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,
     968             :     -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,
     969             :     -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,
     970             :     -245,  -245,  -245,  -245,  -245,  -245,    54,  -245,    15,   651,
     971             :      -35,  -245,  -245,  -245,  -245,   218,  -245,  -245,  -245,  -245,
     972             :     -245,  -245,  -245,  -245,   998,  -245,   327,  -245,   218,  -245,
     973             :     -245,   -10,  -245,  -245,  -245,  -245,   327,  -245,  -245,  -245,
     974             :       46,    66,  -245,  -245,  -245,  -245,  -245,  -245,   -42,  -245,
     975             :     -245,  -245,  -245,  -245,   -40,    46,  -245,  -245,  -245,    66,
     976             :      -36,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,
     977             :     -245,  -245,  -245,   327,  -245,  -245,  -245,  -245,  -245,  -245,
     978             :     -245,  -245,  -245,  -245,  -245,  -245,    39,   -39,    81,  -245,
     979             :       37,  -245,    -3,  -245,    59,  -245,    85,   -19,  -245,  -245,
     980             :     -245,   -16,    -5,   -15,    -9,    46,  -245,  -245,    61,  -245,
     981             :       46,  -245,  -245,    -7,  -245,   -74,  -245,   327,    64,    64,
     982             :     -245,  -245,  -245,   436,  -245,  -245,    83,     4,  -245,   -41,
     983             :     -245,  -245,  -245,    90,  -245,   327,    -9,  -245,    50,    79,
     984             :      866,     2,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -245,
     985             :     -245,    55,    13,  1064,  -245,  -245,  -245,  -245,     3,  -245,
     986             :        5,   545,    48,  -245,  -245,  -245,    88,  -245,   -75,  -245,
     987             :     -245,  -245,  -245,  -245,  -245,  -245,   -72,  -245,   -12,    -8,
     988             :     -245,  -245,  -245,  -245,   126,    65,    60,  -245,  -245,   757,
     989             :      -22,  -245,  -245,  -245,    53,   -13,   -11,  1130,   113,   327,
     990             :     -245,  -245,    79,  -245,  -245,  -245,  -245,  -245,    91,  -245,
     991             :      121,   327,   -62,  -245,  -245,  -245,  -245,  -245,  -245,  -245,
     992             :     -245,  -245,  -245,  -245,    20,  -245,   110,  -245,  -245,  1196,
     993             :     -245,    82,  -245,    26,  -245,   757,  -245,  -245,  -245,   932,
     994             :       27,  -245,  -245,  -245,  -245,  -245
     995             : };
     996             : 
     997             : /* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
     998             :    Performed when YYTABLE does not specify something else to do.  Zero
     999             :    means the default is an error.  */
    1000             : static const yytype_uint8 yydefact[] =
    1001             : {
    1002             :        3,     0,   161,     1,     0,     0,     4,    12,     0,    15,
    1003             :      169,   171,   172,   173,   174,   175,   176,   177,   178,   179,
    1004             :      180,   181,   182,   183,   184,   185,   186,   187,   188,   189,
    1005             :      190,   191,   192,   193,   194,   195,   196,   197,   198,   199,
    1006             :      200,   201,   202,   203,   204,   205,   206,   207,   208,   209,
    1007             :      210,   211,   212,   213,   214,   215,   216,   217,   218,   219,
    1008             :      220,   221,   222,   223,   224,   225,   226,   227,   228,   229,
    1009             :      230,   231,   232,   233,   234,   235,   236,   237,   238,   239,
    1010             :      240,   241,   242,   243,   244,   245,   246,   247,   248,   249,
    1011             :      250,   251,   252,   253,   254,   255,     0,   170,     0,     0,
    1012             :        0,    13,     2,    59,    18,    16,   162,     5,    10,     6,
    1013             :       11,     7,     9,     8,   163,    42,     0,    22,    17,    20,
    1014             :       21,    44,    43,   132,   133,    88,     0,   127,    86,   106,
    1015             :        0,   145,   124,    87,   150,   134,   123,   138,    90,   159,
    1016             :      129,   130,   131,   138,     0,     0,    85,   126,   125,   145,
    1017             :        0,    60,    75,    76,    62,    77,    63,    64,    65,    66,
    1018             :       67,    68,    69,   165,    70,    71,    72,    73,    74,    78,
    1019             :       79,    80,    81,    82,    83,    84,     0,     0,     0,    19,
    1020             :        0,    45,     0,    30,     0,    46,     0,     0,   147,   148,
    1021             :      146,     0,     0,     0,     0,     0,    91,    92,     0,    59,
    1022             :        0,   140,   135,     0,    61,     0,   166,   165,     0,     0,
    1023             :       59,   160,    23,     0,    29,    26,    47,   164,   159,   110,
    1024             :      108,   139,   143,     0,   141,     0,   151,   153,     0,     0,
    1025             :      163,     0,   142,   158,   167,   122,    14,   117,   118,   116,
    1026             :       59,     0,   120,   163,   112,    59,    39,    41,     0,    40,
    1027             :       32,     0,    51,    59,    59,   107,     0,   144,     0,   156,
    1028             :      157,   152,   136,    98,    99,    97,     0,    94,     0,   103,
    1029             :      137,   168,   114,   115,     0,     0,     0,   113,    25,     0,
    1030             :        0,    48,    50,    49,     0,     0,   163,   163,     0,     0,
    1031             :       59,    89,     0,    58,    57,    96,    59,   159,     0,   121,
    1032             :        0,   165,     0,    34,    46,    38,    37,    31,    52,    56,
    1033             :       53,    24,    54,    55,     0,   155,   163,    93,    95,   163,
    1034             :       59,     0,   160,     0,    33,     0,    36,    27,   105,   163,
    1035             :        0,    59,   128,    35,   100,   119
    1036             : };
    1037             : 
    1038             : /* YYPGOTO[NTERM-NUM].  */
    1039             : static const yytype_int16 yypgoto[] =
    1040             : {
    1041             :     -245,  -245,  -245,  -245,  -245,  -245,   159,  -245,  -245,  -245,
    1042             :       44,  -245,  -245,  -245,  -245,  -245,  -245,  -162,  -245,  -245,
    1043             :     -244,  -245,  -139,  -245,  -245,  -245,  -245,  -119,   -97,  -245,
    1044             :     -245,  -245,  -245,  -245,  -245,  -245,  -125,  -245,  -245,  -245,
    1045             :     -245,  -245,  -245,  -245,  -245,   -50,  -245,  -245,  -245,  -245,
    1046             :     -245,   -38,  -245,  -245,  -245,  -245,  -245,  -245,  -245,  -223,
    1047             :     -245,  -245,  -245,  -245,  -245,    32,  -245,  -245,  -245,  -245,
    1048             :       21,  -131,  -245,  -245,  -245,   -49,  -245,  -113,  -245,  -210,
    1049             :     -144,  -245,  -245,  -194,  -245,    -4,   -98
    1050             : };
    1051             : 
    1052             : /* YYDEFGOTO[NTERM-NUM].  */
    1053             : static const yytype_int16 yydefgoto[] =
    1054             : {
    1055             :        0,     1,     2,     6,   109,   102,   150,     8,   105,   118,
    1056             :      119,   120,   250,   184,   327,   280,   302,   303,   307,   248,
    1057             :      121,   185,   216,   252,   285,   311,   312,   295,   243,   151,
    1058             :      152,   153,   154,   155,   198,   266,   267,   318,   268,   156,
    1059             :      269,   298,   157,   187,   219,   220,   256,   158,   159,   160,
    1060             :      240,   241,   161,   275,   162,   163,   164,   165,   166,   244,
    1061             :      167,   168,   169,   170,   171,   195,   172,   173,   174,   175,
    1062             :      193,   191,   176,   194,   226,   227,   258,   259,   271,   199,
    1063             :      245,     9,   177,   205,   235,   206,    97
    1064             : };
    1065             : 
    1066             : /* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM.  If
    1067             :    positive, shift that token.  If negative, reduce the rule whose
    1068             :    number is the opposite.  If YYTABLE_NINF, syntax error.  */
    1069             : static const yytype_int16 yytable[] =
    1070             : {
    1071             :       96,   110,   293,   293,   196,     4,   114,   122,   253,   123,
    1072             :      124,   125,   126,   236,   202,   254,   180,   272,   289,   127,
    1073             :      122,  -161,   277,   128,   129,   111,   130,   208,   209,     3,
    1074             :      131,   222,   181,   101,   132,   304,  -162,   -28,   309,  -161,
    1075             :      103,    98,   210,   133,   305,  -109,   290,  -109,   296,   297,
    1076             :       99,   135,   136,   137,  -162,   233,   306,   104,   234,   138,
    1077             :      291,   139,   140,   292,   228,   141,   188,   189,   190,   231,
    1078             :      107,   142,   324,   325,   143,   197,   100,   182,   106,   144,
    1079             :      145,   304,   223,   146,   237,   238,   239,   320,   218,   112,
    1080             :      113,   211,   201,   147,   192,   148,   204,   207,   149,   263,
    1081             :      264,   265,   230,   213,   183,   212,   215,   323,   335,   217,
    1082             :      218,   214,   178,     5,   229,   249,   221,   224,  -109,   310,
    1083             :      225,   251,   186,   294,   294,   232,   257,   262,   274,   273,
    1084             :      123,   124,   125,   126,   270,   278,   284,   299,   279,   300,
    1085             :      127,   301,  -161,   308,   128,   129,   288,   130,   314,   321,
    1086             :      322,   131,   328,   283,   330,   132,   286,   287,   332,   334,
    1087             :     -161,     7,   179,   333,   133,   326,   313,   317,  -154,   255,
    1088             :      203,   242,   135,   136,   137,   200,   315,   261,   331,     0,
    1089             :      138,   122,   139,   140,     0,     0,   141,     0,     0,     0,
    1090             :        0,     0,   142,   316,     0,   143,     0,     0,     0,   319,
    1091             :      144,   145,     0,     0,   146,     0,     0,     0,     0,     0,
    1092             :        0,     0,     0,     0,   147,     0,   148,     0,     0,   149,
    1093             :        0,   260,     0,   329,     0,     0,     0,   122,     0,     0,
    1094             :        0,     0,     0,     0,     0,     0,     0,     0,   115,  -154,
    1095             :        0,   116,     0,    12,    13,     0,    14,    15,    16,    17,
    1096             :        0,     0,    18,     0,    19,    20,    21,    22,    23,    24,
    1097             :       25,    26,    27,    28,    29,    30,    31,    32,   117,    33,
    1098             :       34,    35,    36,    37,     0,    38,     0,    39,    40,    41,
    1099             :       42,    43,    44,    45,     0,   260,    46,     0,    47,    48,
    1100             :        0,    49,     0,    50,    51,     0,    52,    53,    54,     0,
    1101             :       55,    56,    57,    58,    59,    60,     0,    61,     0,    62,
    1102             :       63,     0,    64,    65,    66,    67,    68,    69,    70,    71,
    1103             :       72,    73,    74,    75,    76,    77,    78,    79,    80,    81,
    1104             :       82,    83,    84,    85,    86,    87,    88,    89,    90,     0,
    1105             :        0,    91,    92,    93,     0,    94,    95,    10,     0,    11,
    1106             :        0,     0,    12,    13,     0,    14,    15,    16,    17,     0,
    1107             :        0,    18,     0,    19,    20,    21,    22,    23,    24,    25,
    1108             :       26,    27,    28,    29,    30,    31,    32,     0,    33,    34,
    1109             :       35,    36,    37,     0,    38,     0,    39,    40,    41,    42,
    1110             :       43,    44,    45,     0,     0,    46,     0,    47,    48,     0,
    1111             :       49,     0,    50,    51,     0,    52,    53,    54,     0,    55,
    1112             :       56,    57,    58,    59,    60,     0,    61,     0,    62,    63,
    1113             :        0,    64,    65,    66,    67,    68,    69,    70,    71,    72,
    1114             :       73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
    1115             :       83,    84,    85,    86,    87,    88,    89,    90,     0,     0,
    1116             :       91,    92,    93,     0,    94,    95,   246,   247,     0,     0,
    1117             :        0,    12,    13,     0,    14,    15,    16,    17,     0,     0,
    1118             :       18,     0,    19,    20,    21,    22,    23,    24,    25,    26,
    1119             :       27,    28,    29,    30,    31,    32,     0,    33,    34,    35,
    1120             :       36,    37,     0,    38,     0,    39,    40,    41,    42,    43,
    1121             :       44,    45,     0,     0,    46,     0,    47,    48,     0,    49,
    1122             :        0,    50,    51,     0,    52,    53,    54,     0,    55,    56,
    1123             :       57,    58,    59,    60,     0,    61,     0,    62,    63,     0,
    1124             :       64,    65,    66,    67,    68,    69,    70,    71,    72,    73,
    1125             :       74,    75,    76,    77,    78,    79,    80,    81,    82,    83,
    1126             :       84,    85,    86,    87,    88,    89,    90,     0,     0,    91,
    1127             :       92,    93,     0,    94,    95,   281,   282,     0,     0,     0,
    1128             :       12,    13,     0,    14,    15,    16,    17,     0,     0,    18,
    1129             :        0,    19,    20,    21,    22,    23,    24,    25,    26,    27,
    1130             :       28,    29,    30,    31,    32,     0,    33,    34,    35,    36,
    1131             :       37,     0,    38,     0,    39,    40,    41,    42,    43,    44,
    1132             :       45,     0,     0,    46,     0,    47,    48,     0,    49,     0,
    1133             :       50,    51,     0,    52,    53,    54,     0,    55,    56,    57,
    1134             :       58,    59,    60,     0,    61,     0,    62,    63,     0,    64,
    1135             :       65,    66,    67,    68,    69,    70,    71,    72,    73,    74,
    1136             :       75,    76,    77,    78,    79,    80,    81,    82,    83,    84,
    1137             :       85,    86,    87,    88,    89,    90,     0,     0,    91,    92,
    1138             :       93,   108,    94,    95,     0,     0,    12,    13,     0,    14,
    1139             :       15,    16,    17,     0,     0,    18,     0,    19,    20,    21,
    1140             :       22,    23,    24,    25,    26,    27,    28,    29,    30,    31,
    1141             :       32,     0,    33,    34,    35,    36,    37,     0,    38,     0,
    1142             :       39,    40,    41,    42,    43,    44,    45,     0,     0,    46,
    1143             :        0,    47,    48,     0,    49,     0,    50,    51,     0,    52,
    1144             :       53,    54,     0,    55,    56,    57,    58,    59,    60,     0,
    1145             :       61,     0,    62,    63,     0,    64,    65,    66,    67,    68,
    1146             :       69,    70,    71,    72,    73,    74,    75,    76,    77,    78,
    1147             :       79,    80,    81,    82,    83,    84,    85,    86,    87,    88,
    1148             :       89,    90,     0,     0,    91,    92,    93,   115,    94,    95,
    1149             :        0,     0,    12,    13,     0,    14,    15,    16,    17,     0,
    1150             :        0,    18,     0,    19,    20,    21,    22,    23,    24,    25,
    1151             :       26,    27,    28,    29,    30,    31,    32,     0,    33,    34,
    1152             :       35,    36,    37,     0,    38,     0,    39,    40,    41,    42,
    1153             :       43,    44,    45,     0,     0,    46,     0,    47,    48,     0,
    1154             :       49,     0,    50,    51,     0,    52,    53,    54,     0,    55,
    1155             :       56,    57,    58,    59,    60,     0,    61,     0,    62,    63,
    1156             :        0,    64,    65,    66,    67,    68,    69,    70,    71,    72,
    1157             :       73,    74,    75,    76,    77,    78,    79,    80,    81,    82,
    1158             :       83,    84,    85,    86,    87,    88,    89,    90,     0,     0,
    1159             :       91,    92,    93,     0,    94,    95,   123,   124,   125,   126,
    1160             :        0,     0,     0,     0,     0,     0,   127,     0,  -161,     0,
    1161             :      128,   129,     0,   130,     0,     0,     0,   131,     0,     0,
    1162             :        0,   132,     0,     0,     0,     0,  -161,     0,     0,     0,
    1163             :      133,     0,  -101,  -101,  -101,     0,     0,     0,   135,   136,
    1164             :      137,     0,     0,     0,     0,     0,   138,     0,   139,   140,
    1165             :        0,     0,   141,     0,     0,     0,     0,     0,   142,     0,
    1166             :        0,   143,   123,   124,   125,   126,   144,   145,     0,     0,
    1167             :      146,     0,   127,     0,  -161,     0,   128,   129,     0,   130,
    1168             :      147,     0,   148,   131,     0,   149,     0,   132,     0,     0,
    1169             :        0,     0,  -161,     0,     0,     0,   133,     0,  -102,  -102,
    1170             :     -102,     0,     0,     0,   135,   136,   137,     0,     0,     0,
    1171             :        0,     0,   138,     0,   139,   140,     0,     0,   141,     0,
    1172             :        0,     0,     0,     0,   142,     0,     0,   143,   123,   124,
    1173             :      125,   126,   144,   145,     0,     0,   146,     0,   127,     0,
    1174             :     -161,     0,   128,   129,     0,   130,   147,     0,   148,   131,
    1175             :        0,   149,     0,   132,     0,     0,     0,     0,  -161,     0,
    1176             :        0,     0,   133,     0,     0,     0,  -149,     0,     0,   134,
    1177             :      135,   136,   137,     0,     0,     0,     0,     0,   138,     0,
    1178             :      139,   140,     0,     0,   141,     0,     0,     0,     0,     0,
    1179             :      142,     0,     0,   143,   123,   124,   125,   126,   144,   145,
    1180             :        0,     0,   146,     0,   127,     0,  -161,     0,   128,   129,
    1181             :        0,   130,   147,     0,   148,   131,     0,   149,     0,   132,
    1182             :        0,     0,     0,     0,  -161,     0,     0,     0,   133,     0,
    1183             :        0,     0,   276,     0,     0,     0,   135,   136,   137,     0,
    1184             :        0,     0,     0,     0,   138,     0,   139,   140,     0,     0,
    1185             :      141,     0,     0,     0,     0,     0,   142,     0,     0,   143,
    1186             :      123,   124,   125,   126,   144,   145,     0,     0,   146,     0,
    1187             :      127,     0,  -161,     0,   128,   129,     0,   130,   147,     0,
    1188             :      148,   131,     0,   149,     0,   132,     0,     0,     0,     0,
    1189             :     -161,     0,     0,     0,   133,     0,     0,     0,  -111,     0,
    1190             :        0,     0,   135,   136,   137,     0,     0,     0,     0,     0,
    1191             :      138,     0,   139,   140,     0,     0,   141,     0,     0,     0,
    1192             :        0,     0,   142,     0,     0,   143,   123,   124,   125,   126,
    1193             :      144,   145,     0,     0,   146,     0,   127,     0,  -161,     0,
    1194             :      128,   129,     0,   130,   147,     0,   148,   131,     0,   149,
    1195             :        0,   132,     0,     0,     0,     0,  -161,     0,     0,     0,
    1196             :      133,     0,     0,     0,  -104,     0,     0,     0,   135,   136,
    1197             :      137,     0,     0,     0,     0,     0,   138,     0,   139,   140,
    1198             :        0,     0,   141,     0,     0,     0,     0,     0,   142,     0,
    1199             :        0,   143,     0,     0,     0,     0,   144,   145,     0,     0,
    1200             :      146,     0,     0,     0,     0,     0,     0,     0,     0,     0,
    1201             :      147,     0,   148,     0,     0,   149
    1202             : };
    1203             : 
    1204             : static const yytype_int16 yycheck[] =
    1205             : {
    1206             :        4,    99,    15,    15,    46,    23,   103,   105,   218,    20,
    1207             :       21,    22,    23,   207,   145,    56,    26,   240,    93,    30,
    1208             :      118,    32,   245,    34,    35,    60,    37,    66,    67,     0,
    1209             :       41,    36,    42,   132,    45,   279,    32,    47,    51,    50,
    1210             :       32,    92,    81,    54,    66,    56,   121,    58,    56,    57,
    1211             :      101,    62,    63,    64,    50,   129,    78,    50,   132,    70,
    1212             :      132,    72,    73,   135,   195,    76,    20,    21,    22,   200,
    1213             :       55,    82,   134,   135,    85,   117,   127,    87,    24,    90,
    1214             :       91,   325,    87,    94,    20,    21,    22,   297,   129,   124,
    1215             :      125,   130,   132,   104,    28,   106,   132,    58,   109,    20,
    1216             :       21,    22,   199,    66,   114,    24,    47,   301,   331,    24,
    1217             :      129,   114,   116,   131,    53,   213,   132,   132,   129,   132,
    1218             :      129,    38,   126,   136,   136,   132,    36,    77,   115,    74,
    1219             :       20,    21,    22,    23,   132,   132,    88,    11,   133,    74,
    1220             :       30,    81,    32,    90,    34,    35,    58,    37,    35,    58,
    1221             :       29,    41,   132,   251,    72,    45,   253,   254,   132,   132,
    1222             :       50,     2,   118,   325,    54,   304,   285,   292,    58,   219,
    1223             :      149,   209,    62,    63,    64,   143,   289,   226,   322,    -1,
    1224             :       70,   279,    72,    73,    -1,    -1,    76,    -1,    -1,    -1,
    1225             :       -1,    -1,    82,   290,    -1,    85,    -1,    -1,    -1,   296,
    1226             :       90,    91,    -1,    -1,    94,    -1,    -1,    -1,    -1,    -1,
    1227             :       -1,    -1,    -1,    -1,   104,    -1,   106,    -1,    -1,   109,
    1228             :       -1,   225,    -1,   320,    -1,    -1,    -1,   325,    -1,    -1,
    1229             :       -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    20,   129,
    1230             :       -1,    23,    -1,    25,    26,    -1,    28,    29,    30,    31,
    1231             :       -1,    -1,    34,    -1,    36,    37,    38,    39,    40,    41,
    1232             :       42,    43,    44,    45,    46,    47,    48,    49,    50,    51,
    1233             :       52,    53,    54,    55,    -1,    57,    -1,    59,    60,    61,
    1234             :       62,    63,    64,    65,    -1,   289,    68,    -1,    70,    71,
    1235             :       -1,    73,    -1,    75,    76,    -1,    78,    79,    80,    -1,
    1236             :       82,    83,    84,    85,    86,    87,    -1,    89,    -1,    91,
    1237             :       92,    -1,    94,    95,    96,    97,    98,    99,   100,   101,
    1238             :      102,   103,   104,   105,   106,   107,   108,   109,   110,   111,
    1239             :      112,   113,   114,   115,   116,   117,   118,   119,   120,    -1,
    1240             :       -1,   123,   124,   125,    -1,   127,   128,    20,    -1,    22,
    1241             :       -1,    -1,    25,    26,    -1,    28,    29,    30,    31,    -1,
    1242             :       -1,    34,    -1,    36,    37,    38,    39,    40,    41,    42,
    1243             :       43,    44,    45,    46,    47,    48,    49,    -1,    51,    52,
    1244             :       53,    54,    55,    -1,    57,    -1,    59,    60,    61,    62,
    1245             :       63,    64,    65,    -1,    -1,    68,    -1,    70,    71,    -1,
    1246             :       73,    -1,    75,    76,    -1,    78,    79,    80,    -1,    82,
    1247             :       83,    84,    85,    86,    87,    -1,    89,    -1,    91,    92,
    1248             :       -1,    94,    95,    96,    97,    98,    99,   100,   101,   102,
    1249             :      103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
    1250             :      113,   114,   115,   116,   117,   118,   119,   120,    -1,    -1,
    1251             :      123,   124,   125,    -1,   127,   128,    20,    21,    -1,    -1,
    1252             :       -1,    25,    26,    -1,    28,    29,    30,    31,    -1,    -1,
    1253             :       34,    -1,    36,    37,    38,    39,    40,    41,    42,    43,
    1254             :       44,    45,    46,    47,    48,    49,    -1,    51,    52,    53,
    1255             :       54,    55,    -1,    57,    -1,    59,    60,    61,    62,    63,
    1256             :       64,    65,    -1,    -1,    68,    -1,    70,    71,    -1,    73,
    1257             :       -1,    75,    76,    -1,    78,    79,    80,    -1,    82,    83,
    1258             :       84,    85,    86,    87,    -1,    89,    -1,    91,    92,    -1,
    1259             :       94,    95,    96,    97,    98,    99,   100,   101,   102,   103,
    1260             :      104,   105,   106,   107,   108,   109,   110,   111,   112,   113,
    1261             :      114,   115,   116,   117,   118,   119,   120,    -1,    -1,   123,
    1262             :      124,   125,    -1,   127,   128,    20,    21,    -1,    -1,    -1,
    1263             :       25,    26,    -1,    28,    29,    30,    31,    -1,    -1,    34,
    1264             :       -1,    36,    37,    38,    39,    40,    41,    42,    43,    44,
    1265             :       45,    46,    47,    48,    49,    -1,    51,    52,    53,    54,
    1266             :       55,    -1,    57,    -1,    59,    60,    61,    62,    63,    64,
    1267             :       65,    -1,    -1,    68,    -1,    70,    71,    -1,    73,    -1,
    1268             :       75,    76,    -1,    78,    79,    80,    -1,    82,    83,    84,
    1269             :       85,    86,    87,    -1,    89,    -1,    91,    92,    -1,    94,
    1270             :       95,    96,    97,    98,    99,   100,   101,   102,   103,   104,
    1271             :      105,   106,   107,   108,   109,   110,   111,   112,   113,   114,
    1272             :      115,   116,   117,   118,   119,   120,    -1,    -1,   123,   124,
    1273             :      125,    20,   127,   128,    -1,    -1,    25,    26,    -1,    28,
    1274             :       29,    30,    31,    -1,    -1,    34,    -1,    36,    37,    38,
    1275             :       39,    40,    41,    42,    43,    44,    45,    46,    47,    48,
    1276             :       49,    -1,    51,    52,    53,    54,    55,    -1,    57,    -1,
    1277             :       59,    60,    61,    62,    63,    64,    65,    -1,    -1,    68,
    1278             :       -1,    70,    71,    -1,    73,    -1,    75,    76,    -1,    78,
    1279             :       79,    80,    -1,    82,    83,    84,    85,    86,    87,    -1,
    1280             :       89,    -1,    91,    92,    -1,    94,    95,    96,    97,    98,
    1281             :       99,   100,   101,   102,   103,   104,   105,   106,   107,   108,
    1282             :      109,   110,   111,   112,   113,   114,   115,   116,   117,   118,
    1283             :      119,   120,    -1,    -1,   123,   124,   125,    20,   127,   128,
    1284             :       -1,    -1,    25,    26,    -1,    28,    29,    30,    31,    -1,
    1285             :       -1,    34,    -1,    36,    37,    38,    39,    40,    41,    42,
    1286             :       43,    44,    45,    46,    47,    48,    49,    -1,    51,    52,
    1287             :       53,    54,    55,    -1,    57,    -1,    59,    60,    61,    62,
    1288             :       63,    64,    65,    -1,    -1,    68,    -1,    70,    71,    -1,
    1289             :       73,    -1,    75,    76,    -1,    78,    79,    80,    -1,    82,
    1290             :       83,    84,    85,    86,    87,    -1,    89,    -1,    91,    92,
    1291             :       -1,    94,    95,    96,    97,    98,    99,   100,   101,   102,
    1292             :      103,   104,   105,   106,   107,   108,   109,   110,   111,   112,
    1293             :      113,   114,   115,   116,   117,   118,   119,   120,    -1,    -1,
    1294             :      123,   124,   125,    -1,   127,   128,    20,    21,    22,    23,
    1295             :       -1,    -1,    -1,    -1,    -1,    -1,    30,    -1,    32,    -1,
    1296             :       34,    35,    -1,    37,    -1,    -1,    -1,    41,    -1,    -1,
    1297             :       -1,    45,    -1,    -1,    -1,    -1,    50,    -1,    -1,    -1,
    1298             :       54,    -1,    56,    57,    58,    -1,    -1,    -1,    62,    63,
    1299             :       64,    -1,    -1,    -1,    -1,    -1,    70,    -1,    72,    73,
    1300             :       -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,    82,    -1,
    1301             :       -1,    85,    20,    21,    22,    23,    90,    91,    -1,    -1,
    1302             :       94,    -1,    30,    -1,    32,    -1,    34,    35,    -1,    37,
    1303             :      104,    -1,   106,    41,    -1,   109,    -1,    45,    -1,    -1,
    1304             :       -1,    -1,    50,    -1,    -1,    -1,    54,    -1,    56,    57,
    1305             :       58,    -1,    -1,    -1,    62,    63,    64,    -1,    -1,    -1,
    1306             :       -1,    -1,    70,    -1,    72,    73,    -1,    -1,    76,    -1,
    1307             :       -1,    -1,    -1,    -1,    82,    -1,    -1,    85,    20,    21,
    1308             :       22,    23,    90,    91,    -1,    -1,    94,    -1,    30,    -1,
    1309             :       32,    -1,    34,    35,    -1,    37,   104,    -1,   106,    41,
    1310             :       -1,   109,    -1,    45,    -1,    -1,    -1,    -1,    50,    -1,
    1311             :       -1,    -1,    54,    -1,    -1,    -1,    58,    -1,    -1,    61,
    1312             :       62,    63,    64,    -1,    -1,    -1,    -1,    -1,    70,    -1,
    1313             :       72,    73,    -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,
    1314             :       82,    -1,    -1,    85,    20,    21,    22,    23,    90,    91,
    1315             :       -1,    -1,    94,    -1,    30,    -1,    32,    -1,    34,    35,
    1316             :       -1,    37,   104,    -1,   106,    41,    -1,   109,    -1,    45,
    1317             :       -1,    -1,    -1,    -1,    50,    -1,    -1,    -1,    54,    -1,
    1318             :       -1,    -1,    58,    -1,    -1,    -1,    62,    63,    64,    -1,
    1319             :       -1,    -1,    -1,    -1,    70,    -1,    72,    73,    -1,    -1,
    1320             :       76,    -1,    -1,    -1,    -1,    -1,    82,    -1,    -1,    85,
    1321             :       20,    21,    22,    23,    90,    91,    -1,    -1,    94,    -1,
    1322             :       30,    -1,    32,    -1,    34,    35,    -1,    37,   104,    -1,
    1323             :      106,    41,    -1,   109,    -1,    45,    -1,    -1,    -1,    -1,
    1324             :       50,    -1,    -1,    -1,    54,    -1,    -1,    -1,    58,    -1,
    1325             :       -1,    -1,    62,    63,    64,    -1,    -1,    -1,    -1,    -1,
    1326             :       70,    -1,    72,    73,    -1,    -1,    76,    -1,    -1,    -1,
    1327             :       -1,    -1,    82,    -1,    -1,    85,    20,    21,    22,    23,
    1328             :       90,    91,    -1,    -1,    94,    -1,    30,    -1,    32,    -1,
    1329             :       34,    35,    -1,    37,   104,    -1,   106,    41,    -1,   109,
    1330             :       -1,    45,    -1,    -1,    -1,    -1,    50,    -1,    -1,    -1,
    1331             :       54,    -1,    -1,    -1,    58,    -1,    -1,    -1,    62,    63,
    1332             :       64,    -1,    -1,    -1,    -1,    -1,    70,    -1,    72,    73,
    1333             :       -1,    -1,    76,    -1,    -1,    -1,    -1,    -1,    82,    -1,
    1334             :       -1,    85,    -1,    -1,    -1,    -1,    90,    91,    -1,    -1,
    1335             :       94,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,    -1,
    1336             :      104,    -1,   106,    -1,    -1,   109
    1337             : };
    1338             : 
    1339             : /* YYSTOS[STATE-NUM] -- The symbol kind of the accessing symbol of
    1340             :    state STATE-NUM.  */
    1341             : static const yytype_uint8 yystos[] =
    1342             : {
    1343             :        0,   138,   139,     0,    23,   131,   140,   143,   144,   218,
    1344             :       20,    22,    25,    26,    28,    29,    30,    31,    34,    36,
    1345             :       37,    38,    39,    40,    41,    42,    43,    44,    45,    46,
    1346             :       47,    48,    49,    51,    52,    53,    54,    55,    57,    59,
    1347             :       60,    61,    62,    63,    64,    65,    68,    70,    71,    73,
    1348             :       75,    76,    78,    79,    80,    82,    83,    84,    85,    86,
    1349             :       87,    89,    91,    92,    94,    95,    96,    97,    98,    99,
    1350             :      100,   101,   102,   103,   104,   105,   106,   107,   108,   109,
    1351             :      110,   111,   112,   113,   114,   115,   116,   117,   118,   119,
    1352             :      120,   123,   124,   125,   127,   128,   222,   223,    92,   101,
    1353             :      127,   132,   142,    32,    50,   145,    24,    55,    20,   141,
    1354             :      223,    60,   124,   125,   165,    20,    23,    50,   146,   147,
    1355             :      148,   157,   223,    20,    21,    22,    23,    30,    34,    35,
    1356             :       37,    41,    45,    54,    61,    62,    63,    64,    70,    72,
    1357             :       73,    76,    82,    85,    90,    91,    94,   104,   106,   109,
    1358             :      143,   166,   167,   168,   169,   170,   176,   179,   184,   185,
    1359             :      186,   189,   191,   192,   193,   194,   195,   197,   198,   199,
    1360             :      200,   201,   203,   204,   205,   206,   209,   219,   222,   147,
    1361             :       26,    42,    87,   114,   150,   158,   222,   180,    20,    21,
    1362             :       22,   208,    28,   207,   210,   202,    46,   117,   171,   216,
    1363             :      202,   132,   208,   207,   132,   220,   222,    58,    66,    67,
    1364             :       81,   130,    24,    66,   114,    47,   159,    24,   129,   181,
    1365             :      182,   132,    36,    87,   132,   129,   211,   212,   208,    53,
    1366             :      165,   208,   132,   129,   132,   221,   220,    20,    21,    22,
    1367             :      187,   188,   188,   165,   196,   217,    20,    21,   156,   223,
    1368             :      149,    38,   160,   216,    56,   182,   183,    36,   213,   214,
    1369             :      222,   212,    77,    20,    21,    22,   172,   173,   175,   177,
    1370             :      132,   215,   196,    74,   115,   190,    58,   196,   132,   133,
    1371             :      152,    20,    21,   223,    88,   161,   165,   165,    58,    93,
    1372             :      121,   132,   135,    15,   136,   164,    56,    57,   178,    11,
    1373             :       74,    81,   153,   154,   157,    66,    78,   155,    90,    51,
    1374             :      132,   162,   163,   164,    35,   214,   165,   173,   174,   165,
    1375             :      216,    58,    29,   220,   134,   135,   159,   151,   132,   165,
    1376             :       72,   217,   132,   154,   132,   196
    1377             : };
    1378             : 
    1379             : /* YYR1[RULE-NUM] -- Symbol kind of the left-hand side of rule RULE-NUM.  */
    1380             : static const yytype_uint8 yyr1[] =
    1381             : {
    1382             :        0,   137,   138,   139,   139,   140,   140,   140,   140,   140,
    1383             :      141,   141,   142,   142,   143,   144,   144,   144,   145,   146,
    1384             :      146,   147,   147,   147,   148,   148,   149,   148,   150,   150,
    1385             :      150,   151,   152,   152,   153,   153,   154,   155,   155,   156,
    1386             :      156,   156,   157,   157,   158,   158,   159,   160,   160,   160,
    1387             :      160,   161,   161,   162,   162,   163,   163,   164,   164,   165,
    1388             :      165,   166,   166,   166,   166,   166,   166,   166,   166,   166,
    1389             :      166,   166,   166,   166,   166,   166,   166,   166,   166,   166,
    1390             :      166,   166,   166,   166,   166,   167,   168,   168,   169,   170,
    1391             :      171,   171,   171,   172,   172,   173,   174,   175,   175,   175,
    1392             :      176,   177,   177,   178,   178,   179,   180,   181,   181,   182,
    1393             :      183,   183,   184,   185,   186,   187,   188,   188,   188,   189,
    1394             :      190,   190,   191,   192,   192,   193,   194,   195,   196,   197,
    1395             :      197,   197,   197,   197,   198,   199,   200,   201,   202,   203,
    1396             :      204,   205,   206,   207,   207,   207,   208,   208,   208,   209,
    1397             :      210,   209,   211,   211,   212,   213,   213,   214,   215,   216,
    1398             :      217,   218,   218,   219,   219,   220,   220,   221,   221,   222,
    1399             :      222,   222,   223,   223,   223,   223,   223,   223,   223,   223,
    1400             :      223,   223,   223,   223,   223,   223,   223,   223,   223,   223,
    1401             :      223,   223,   223,   223,   223,   223,   223,   223,   223,   223,
    1402             :      223,   223,   223,   223,   223,   223,   223,   223,   223,   223,
    1403             :      223,   223,   223,   223,   223,   223,   223,   223,   223,   223,
    1404             :      223,   223,   223,   223,   223,   223,   223,   223,   223,   223,
    1405             :      223,   223,   223,   223,   223,   223,   223,   223,   223,   223,
    1406             :      223,   223,   223,   223,   223,   223,   223,   223,   223,   223,
    1407             :      223,   223,   223,   223,   223,   223
    1408             : };
    1409             : 
    1410             : /* YYR2[RULE-NUM] -- Number of symbols on the right-hand side of rule RULE-NUM.  */
    1411             : static const yytype_int8 yyr2[] =
    1412             : {
    1413             :        0,     2,     3,     0,     2,     3,     3,     3,     3,     3,
    1414             :        1,     1,     0,     1,     6,     1,     2,     3,     1,     2,
    1415             :        1,     1,     1,     3,     6,     5,     0,     7,     0,     2,
    1416             :        1,     0,     0,     3,     1,     3,     2,     1,     1,     1,
    1417             :        1,     1,     1,     1,     0,     1,     0,     0,     2,     2,
    1418             :        2,     0,     2,     1,     1,     1,     1,     1,     1,     0,
    1419             :        2,     2,     1,     1,     1,     1,     1,     1,     1,     1,
    1420             :        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
    1421             :        1,     1,     1,     1,     1,     1,     1,     1,     1,     5,
    1422             :        0,     1,     1,     3,     1,     3,     0,     1,     1,     1,
    1423             :        8,     0,     4,     0,     2,     7,     0,     2,     1,     3,
    1424             :        0,     2,     3,     4,     4,     2,     1,     1,     1,     8,
    1425             :        0,     2,     3,     1,     1,     1,     1,     1,     5,     1,
    1426             :        1,     1,     1,     1,     1,     2,     4,     4,     0,     3,
    1427             :        2,     3,     3,     2,     3,     0,     1,     1,     1,     0,
    1428             :        0,     3,     2,     1,     4,     3,     1,     1,     0,     0,
    1429             :        0,     0,     3,     0,     3,     0,     1,     1,     2,     1,
    1430             :        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
    1431             :        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
    1432             :        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
    1433             :        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
    1434             :        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
    1435             :        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
    1436             :        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
    1437             :        1,     1,     1,     1,     1,     1,     1,     1,     1,     1,
    1438             :        1,     1,     1,     1,     1,     1
    1439             : };
    1440             : 
    1441             : 
    1442             : enum { YYENOMEM = -2 };
    1443             : 
    1444             : #define yyerrok         (yyerrstatus = 0)
    1445             : #define yyclearin       (yychar = YYEMPTY)
    1446             : 
    1447             : #define YYACCEPT        goto yyacceptlab
    1448             : #define YYABORT         goto yyabortlab
    1449             : #define YYERROR         goto yyerrorlab
    1450             : #define YYNOMEM         goto yyexhaustedlab
    1451             : 
    1452             : 
    1453             : #define YYRECOVERING()  (!!yyerrstatus)
    1454             : 
    1455             : #define YYBACKUP(Token, Value)                                    \
    1456             :   do                                                              \
    1457             :     if (yychar == YYEMPTY)                                        \
    1458             :       {                                                           \
    1459             :         yychar = (Token);                                         \
    1460             :         yylval = (Value);                                         \
    1461             :         YYPOPSTACK (yylen);                                       \
    1462             :         yystate = *yyssp;                                         \
    1463             :         goto yybackup;                                            \
    1464             :       }                                                           \
    1465             :     else                                                          \
    1466             :       {                                                           \
    1467             :         yyerror (&yylloc, plpgsql_parse_result_p, yyscanner, YY_("syntax error: cannot back up")); \
    1468             :         YYERROR;                                                  \
    1469             :       }                                                           \
    1470             :   while (0)
    1471             : 
    1472             : /* Backward compatibility with an undocumented macro.
    1473             :    Use YYerror or YYUNDEF. */
    1474             : #define YYERRCODE YYUNDEF
    1475             : 
    1476             : /* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
    1477             :    If N is 0, then set CURRENT to the empty location which ends
    1478             :    the previous symbol: RHS[0] (always defined).  */
    1479             : 
    1480             : #ifndef YYLLOC_DEFAULT
    1481             : # define YYLLOC_DEFAULT(Current, Rhs, N)                                \
    1482             :     do                                                                  \
    1483             :       if (N)                                                            \
    1484             :         {                                                               \
    1485             :           (Current).first_line   = YYRHSLOC (Rhs, 1).first_line;        \
    1486             :           (Current).first_column = YYRHSLOC (Rhs, 1).first_column;      \
    1487             :           (Current).last_line    = YYRHSLOC (Rhs, N).last_line;         \
    1488             :           (Current).last_column  = YYRHSLOC (Rhs, N).last_column;       \
    1489             :         }                                                               \
    1490             :       else                                                              \
    1491             :         {                                                               \
    1492             :           (Current).first_line   = (Current).last_line   =              \
    1493             :             YYRHSLOC (Rhs, 0).last_line;                                \
    1494             :           (Current).first_column = (Current).last_column =              \
    1495             :             YYRHSLOC (Rhs, 0).last_column;                              \
    1496             :         }                                                               \
    1497             :     while (0)
    1498             : #endif
    1499             : 
    1500             : #define YYRHSLOC(Rhs, K) ((Rhs)[K])
    1501             : 
    1502             : 
    1503             : /* Enable debugging if requested.  */
    1504             : #if YYDEBUG
    1505             : 
    1506             : # ifndef YYFPRINTF
    1507             : #  include <stdio.h> /* INFRINGES ON USER NAME SPACE */
    1508             : #  define YYFPRINTF fprintf
    1509             : # endif
    1510             : 
    1511             : # define YYDPRINTF(Args)                        \
    1512             : do {                                            \
    1513             :   if (yydebug)                                  \
    1514             :     YYFPRINTF Args;                             \
    1515             : } while (0)
    1516             : 
    1517             : 
    1518             : /* YYLOCATION_PRINT -- Print the location on the stream.
    1519             :    This macro was not mandated originally: define only if we know
    1520             :    we won't break user code: when these are the locations we know.  */
    1521             : 
    1522             : # ifndef YYLOCATION_PRINT
    1523             : 
    1524             : #  if defined YY_LOCATION_PRINT
    1525             : 
    1526             :    /* Temporary convenience wrapper in case some people defined the
    1527             :       undocumented and private YY_LOCATION_PRINT macros.  */
    1528             : #   define YYLOCATION_PRINT(File, Loc)  YY_LOCATION_PRINT(File, *(Loc))
    1529             : 
    1530             : #  elif defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
    1531             : 
    1532             : /* Print *YYLOCP on YYO.  Private, do not rely on its existence. */
    1533             : 
    1534             : YY_ATTRIBUTE_UNUSED
    1535             : static int
    1536             : yy_location_print_ (FILE *yyo, YYLTYPE const * const yylocp)
    1537             : {
    1538             :   int res = 0;
    1539             :   int end_col = 0 != yylocp->last_column ? yylocp->last_column - 1 : 0;
    1540             :   if (0 <= yylocp->first_line)
    1541             :     {
    1542             :       res += YYFPRINTF (yyo, "%d", yylocp->first_line);
    1543             :       if (0 <= yylocp->first_column)
    1544             :         res += YYFPRINTF (yyo, ".%d", yylocp->first_column);
    1545             :     }
    1546             :   if (0 <= yylocp->last_line)
    1547             :     {
    1548             :       if (yylocp->first_line < yylocp->last_line)
    1549             :         {
    1550             :           res += YYFPRINTF (yyo, "-%d", yylocp->last_line);
    1551             :           if (0 <= end_col)
    1552             :             res += YYFPRINTF (yyo, ".%d", end_col);
    1553             :         }
    1554             :       else if (0 <= end_col && yylocp->first_column < end_col)
    1555             :         res += YYFPRINTF (yyo, "-%d", end_col);
    1556             :     }
    1557             :   return res;
    1558             : }
    1559             : 
    1560             : #   define YYLOCATION_PRINT  yy_location_print_
    1561             : 
    1562             :     /* Temporary convenience wrapper in case some people defined the
    1563             :        undocumented and private YY_LOCATION_PRINT macros.  */
    1564             : #   define YY_LOCATION_PRINT(File, Loc)  YYLOCATION_PRINT(File, &(Loc))
    1565             : 
    1566             : #  else
    1567             : 
    1568             : #   define YYLOCATION_PRINT(File, Loc) ((void) 0)
    1569             :     /* Temporary convenience wrapper in case some people defined the
    1570             :        undocumented and private YY_LOCATION_PRINT macros.  */
    1571             : #   define YY_LOCATION_PRINT  YYLOCATION_PRINT
    1572             : 
    1573             : #  endif
    1574             : # endif /* !defined YYLOCATION_PRINT */
    1575             : 
    1576             : 
    1577             : # define YY_SYMBOL_PRINT(Title, Kind, Value, Location)                    \
    1578             : do {                                                                      \
    1579             :   if (yydebug)                                                            \
    1580             :     {                                                                     \
    1581             :       YYFPRINTF (stderr, "%s ", Title);                                   \
    1582             :       yy_symbol_print (stderr,                                            \
    1583             :                   Kind, Value, Location, plpgsql_parse_result_p, yyscanner); \
    1584             :       YYFPRINTF (stderr, "\n");                                           \
    1585             :     }                                                                     \
    1586             : } while (0)
    1587             : 
    1588             : 
    1589             : /*-----------------------------------.
    1590             : | Print this symbol's value on YYO.  |
    1591             : `-----------------------------------*/
    1592             : 
    1593             : static void
    1594             : yy_symbol_value_print (FILE *yyo,
    1595             :                        yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, PLpgSQL_stmt_block **plpgsql_parse_result_p, yyscan_t yyscanner)
    1596             : {
    1597             :   FILE *yyoutput = yyo;
    1598             :   YY_USE (yyoutput);
    1599             :   YY_USE (yylocationp);
    1600             :   YY_USE (plpgsql_parse_result_p);
    1601             :   YY_USE (yyscanner);
    1602             :   if (!yyvaluep)
    1603             :     return;
    1604             :   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
    1605             :   YY_USE (yykind);
    1606             :   YY_IGNORE_MAYBE_UNINITIALIZED_END
    1607             : }
    1608             : 
    1609             : 
    1610             : /*---------------------------.
    1611             : | Print this symbol on YYO.  |
    1612             : `---------------------------*/
    1613             : 
    1614             : static void
    1615             : yy_symbol_print (FILE *yyo,
    1616             :                  yysymbol_kind_t yykind, YYSTYPE const * const yyvaluep, YYLTYPE const * const yylocationp, PLpgSQL_stmt_block **plpgsql_parse_result_p, yyscan_t yyscanner)
    1617             : {
    1618             :   YYFPRINTF (yyo, "%s %s (",
    1619             :              yykind < YYNTOKENS ? "token" : "nterm", yysymbol_name (yykind));
    1620             : 
    1621             :   YYLOCATION_PRINT (yyo, yylocationp);
    1622             :   YYFPRINTF (yyo, ": ");
    1623             :   yy_symbol_value_print (yyo, yykind, yyvaluep, yylocationp, plpgsql_parse_result_p, yyscanner);
    1624             :   YYFPRINTF (yyo, ")");
    1625             : }
    1626             : 
    1627             : /*------------------------------------------------------------------.
    1628             : | yy_stack_print -- Print the state stack from its BOTTOM up to its |
    1629             : | TOP (included).                                                   |
    1630             : `------------------------------------------------------------------*/
    1631             : 
    1632             : static void
    1633             : yy_stack_print (yy_state_t *yybottom, yy_state_t *yytop)
    1634             : {
    1635             :   YYFPRINTF (stderr, "Stack now");
    1636             :   for (; yybottom <= yytop; yybottom++)
    1637             :     {
    1638             :       int yybot = *yybottom;
    1639             :       YYFPRINTF (stderr, " %d", yybot);
    1640             :     }
    1641             :   YYFPRINTF (stderr, "\n");
    1642             : }
    1643             : 
    1644             : # define YY_STACK_PRINT(Bottom, Top)                            \
    1645             : do {                                                            \
    1646             :   if (yydebug)                                                  \
    1647             :     yy_stack_print ((Bottom), (Top));                           \
    1648             : } while (0)
    1649             : 
    1650             : 
    1651             : /*------------------------------------------------.
    1652             : | Report that the YYRULE is going to be reduced.  |
    1653             : `------------------------------------------------*/
    1654             : 
    1655             : static void
    1656             : yy_reduce_print (yy_state_t *yyssp, YYSTYPE *yyvsp, YYLTYPE *yylsp,
    1657             :                  int yyrule, PLpgSQL_stmt_block **plpgsql_parse_result_p, yyscan_t yyscanner)
    1658             : {
    1659             :   int yylno = yyrline[yyrule];
    1660             :   int yynrhs = yyr2[yyrule];
    1661             :   int yyi;
    1662             :   YYFPRINTF (stderr, "Reducing stack by rule %d (line %d):\n",
    1663             :              yyrule - 1, yylno);
    1664             :   /* The symbols being reduced.  */
    1665             :   for (yyi = 0; yyi < yynrhs; yyi++)
    1666             :     {
    1667             :       YYFPRINTF (stderr, "   $%d = ", yyi + 1);
    1668             :       yy_symbol_print (stderr,
    1669             :                        YY_ACCESSING_SYMBOL (+yyssp[yyi + 1 - yynrhs]),
    1670             :                        &yyvsp[(yyi + 1) - (yynrhs)],
    1671             :                        &(yylsp[(yyi + 1) - (yynrhs)]), plpgsql_parse_result_p, yyscanner);
    1672             :       YYFPRINTF (stderr, "\n");
    1673             :     }
    1674             : }
    1675             : 
    1676             : # define YY_REDUCE_PRINT(Rule)          \
    1677             : do {                                    \
    1678             :   if (yydebug)                          \
    1679             :     yy_reduce_print (yyssp, yyvsp, yylsp, Rule, plpgsql_parse_result_p, yyscanner); \
    1680             : } while (0)
    1681             : 
    1682             : /* Nonzero means print parse trace.  It is left uninitialized so that
    1683             :    multiple parsers can coexist.  */
    1684             : int yydebug;
    1685             : #else /* !YYDEBUG */
    1686             : # define YYDPRINTF(Args) ((void) 0)
    1687             : # define YY_SYMBOL_PRINT(Title, Kind, Value, Location)
    1688             : # define YY_STACK_PRINT(Bottom, Top)
    1689             : # define YY_REDUCE_PRINT(Rule)
    1690             : #endif /* !YYDEBUG */
    1691             : 
    1692             : 
    1693             : /* YYINITDEPTH -- initial size of the parser's stacks.  */
    1694             : #ifndef YYINITDEPTH
    1695             : # define YYINITDEPTH 200
    1696             : #endif
    1697             : 
    1698             : /* YYMAXDEPTH -- maximum size the stacks can grow to (effective only
    1699             :    if the built-in stack extension method is used).
    1700             : 
    1701             :    Do not make this value too large; the results are undefined if
    1702             :    YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
    1703             :    evaluated with infinite-precision integer arithmetic.  */
    1704             : 
    1705             : #ifndef YYMAXDEPTH
    1706             : # define YYMAXDEPTH 10000
    1707             : #endif
    1708             : 
    1709             : 
    1710             : 
    1711             : 
    1712             : 
    1713             : 
    1714             : /*-----------------------------------------------.
    1715             : | Release the memory associated to this symbol.  |
    1716             : `-----------------------------------------------*/
    1717             : 
    1718             : static void
    1719       18612 : yydestruct (const char *yymsg,
    1720             :             yysymbol_kind_t yykind, YYSTYPE *yyvaluep, YYLTYPE *yylocationp, PLpgSQL_stmt_block **plpgsql_parse_result_p, yyscan_t yyscanner)
    1721             : {
    1722             :   YY_USE (yyvaluep);
    1723             :   YY_USE (yylocationp);
    1724             :   YY_USE (plpgsql_parse_result_p);
    1725             :   YY_USE (yyscanner);
    1726       18612 :   if (!yymsg)
    1727           0 :     yymsg = "Deleting";
    1728             :   YY_SYMBOL_PRINT (yymsg, yykind, yyvaluep, yylocationp);
    1729             : 
    1730             :   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
    1731             :   YY_USE (yykind);
    1732             :   YY_IGNORE_MAYBE_UNINITIALIZED_END
    1733       18612 : }
    1734             : 
    1735             : 
    1736             : 
    1737             : 
    1738             : 
    1739             : 
    1740             : /*----------.
    1741             : | yyparse.  |
    1742             : `----------*/
    1743             : 
    1744             : int
    1745        9466 : yyparse (PLpgSQL_stmt_block **plpgsql_parse_result_p, yyscan_t yyscanner)
    1746             : {
    1747             : /* Lookahead token kind.  */
    1748             : int yychar;
    1749             : 
    1750             : 
    1751             : /* The semantic value of the lookahead symbol.  */
    1752             : /* Default value used for initialization, for pacifying older GCCs
    1753             :    or non-GCC compilers.  */
    1754             : YY_INITIAL_VALUE (static YYSTYPE yyval_default;)
    1755             : YYSTYPE yylval YY_INITIAL_VALUE (= yyval_default);
    1756             : 
    1757             : /* Location data for the lookahead symbol.  */
    1758             : static YYLTYPE yyloc_default
    1759             : # if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
    1760             :   = { 1, 1, 1, 1 }
    1761             : # endif
    1762             : ;
    1763        9466 : YYLTYPE yylloc = yyloc_default;
    1764             : 
    1765             :     /* Number of syntax errors so far.  */
    1766        9466 :     int yynerrs = 0;
    1767             : 
    1768        9466 :     yy_state_fast_t yystate = 0;
    1769             :     /* Number of tokens to shift before error messages enabled.  */
    1770        9466 :     int yyerrstatus = 0;
    1771             : 
    1772             :     /* Refer to the stacks through separate pointers, to allow yyoverflow
    1773             :        to reallocate them elsewhere.  */
    1774             : 
    1775             :     /* Their size.  */
    1776        9466 :     YYPTRDIFF_T yystacksize = YYINITDEPTH;
    1777             : 
    1778             :     /* The state stack: array, bottom, top.  */
    1779             :     yy_state_t yyssa[YYINITDEPTH];
    1780        9466 :     yy_state_t *yyss = yyssa;
    1781        9466 :     yy_state_t *yyssp = yyss;
    1782             : 
    1783             :     /* The semantic value stack: array, bottom, top.  */
    1784             :     YYSTYPE yyvsa[YYINITDEPTH];
    1785        9466 :     YYSTYPE *yyvs = yyvsa;
    1786        9466 :     YYSTYPE *yyvsp = yyvs;
    1787             : 
    1788             :     /* The location stack: array, bottom, top.  */
    1789             :     YYLTYPE yylsa[YYINITDEPTH];
    1790        9466 :     YYLTYPE *yyls = yylsa;
    1791        9466 :     YYLTYPE *yylsp = yyls;
    1792             : 
    1793             :   int yyn;
    1794             :   /* The return value of yyparse.  */
    1795             :   int yyresult;
    1796             :   /* Lookahead symbol kind.  */
    1797        9466 :   yysymbol_kind_t yytoken = YYSYMBOL_YYEMPTY;
    1798             :   /* The variables used to return semantic value and location from the
    1799             :      action routines.  */
    1800             :   YYSTYPE yyval;
    1801             :   YYLTYPE yyloc;
    1802             : 
    1803             :   /* The locations where the error started and ended.  */
    1804             :   YYLTYPE yyerror_range[3];
    1805             : 
    1806             : 
    1807             : 
    1808             : #define YYPOPSTACK(N)   (yyvsp -= (N), yyssp -= (N), yylsp -= (N))
    1809             : 
    1810             :   /* The number of symbols on the RHS of the reduced rule.
    1811             :      Keep to zero when no symbol should be popped.  */
    1812        9466 :   int yylen = 0;
    1813             : 
    1814             :   YYDPRINTF ((stderr, "Starting parse\n"));
    1815             : 
    1816        9466 :   yychar = YYEMPTY; /* Cause a token to be read.  */
    1817             : 
    1818        9466 :   yylsp[0] = yylloc;
    1819        9466 :   goto yysetstate;
    1820             : 
    1821             : 
    1822             : /*------------------------------------------------------------.
    1823             : | yynewstate -- push a new state, which is found in yystate.  |
    1824             : `------------------------------------------------------------*/
    1825      427910 : yynewstate:
    1826             :   /* In all cases, when you get here, the value and location stacks
    1827             :      have just been pushed.  So pushing a state here evens the stacks.  */
    1828      427910 :   yyssp++;
    1829             : 
    1830             : 
    1831             : /*--------------------------------------------------------------------.
    1832             : | yysetstate -- set current state (the top of the stack) to yystate.  |
    1833             : `--------------------------------------------------------------------*/
    1834      437376 : yysetstate:
    1835             :   YYDPRINTF ((stderr, "Entering state %d\n", yystate));
    1836             :   YY_ASSERT (0 <= yystate && yystate < YYNSTATES);
    1837             :   YY_IGNORE_USELESS_CAST_BEGIN
    1838      437376 :   *yyssp = YY_CAST (yy_state_t, yystate);
    1839             :   YY_IGNORE_USELESS_CAST_END
    1840             :   YY_STACK_PRINT (yyss, yyssp);
    1841             : 
    1842      437376 :   if (yyss + yystacksize - 1 <= yyssp)
    1843             : #if !defined yyoverflow && !defined YYSTACK_RELOCATE
    1844             :     YYNOMEM;
    1845             : #else
    1846             :     {
    1847             :       /* Get the current used size of the three stacks, in elements.  */
    1848           0 :       YYPTRDIFF_T yysize = yyssp - yyss + 1;
    1849             : 
    1850             : # if defined yyoverflow
    1851             :       {
    1852             :         /* Give user a chance to reallocate the stack.  Use copies of
    1853             :            these so that the &'s don't force the real ones into
    1854             :            memory.  */
    1855             :         yy_state_t *yyss1 = yyss;
    1856             :         YYSTYPE *yyvs1 = yyvs;
    1857             :         YYLTYPE *yyls1 = yyls;
    1858             : 
    1859             :         /* Each stack pointer address is followed by the size of the
    1860             :            data in use in that stack, in bytes.  This used to be a
    1861             :            conditional around just the two extra args, but that might
    1862             :            be undefined if yyoverflow is a macro.  */
    1863             :         yyoverflow (YY_("memory exhausted"),
    1864             :                     &yyss1, yysize * YYSIZEOF (*yyssp),
    1865             :                     &yyvs1, yysize * YYSIZEOF (*yyvsp),
    1866             :                     &yyls1, yysize * YYSIZEOF (*yylsp),
    1867             :                     &yystacksize);
    1868             :         yyss = yyss1;
    1869             :         yyvs = yyvs1;
    1870             :         yyls = yyls1;
    1871             :       }
    1872             : # else /* defined YYSTACK_RELOCATE */
    1873             :       /* Extend the stack our own way.  */
    1874           0 :       if (YYMAXDEPTH <= yystacksize)
    1875           0 :         YYNOMEM;
    1876           0 :       yystacksize *= 2;
    1877           0 :       if (YYMAXDEPTH < yystacksize)
    1878           0 :         yystacksize = YYMAXDEPTH;
    1879             : 
    1880             :       {
    1881           0 :         yy_state_t *yyss1 = yyss;
    1882             :         union yyalloc *yyptr =
    1883           0 :           YY_CAST (union yyalloc *,
    1884             :                    YYSTACK_ALLOC (YY_CAST (YYSIZE_T, YYSTACK_BYTES (yystacksize))));
    1885           0 :         if (! yyptr)
    1886           0 :           YYNOMEM;
    1887           0 :         YYSTACK_RELOCATE (yyss_alloc, yyss);
    1888           0 :         YYSTACK_RELOCATE (yyvs_alloc, yyvs);
    1889           0 :         YYSTACK_RELOCATE (yyls_alloc, yyls);
    1890             : #  undef YYSTACK_RELOCATE
    1891           0 :         if (yyss1 != yyssa)
    1892           0 :           YYSTACK_FREE (yyss1);
    1893             :       }
    1894             : # endif
    1895             : 
    1896           0 :       yyssp = yyss + yysize - 1;
    1897           0 :       yyvsp = yyvs + yysize - 1;
    1898           0 :       yylsp = yyls + yysize - 1;
    1899             : 
    1900             :       YY_IGNORE_USELESS_CAST_BEGIN
    1901             :       YYDPRINTF ((stderr, "Stack size increased to %ld\n",
    1902             :                   YY_CAST (long, yystacksize)));
    1903             :       YY_IGNORE_USELESS_CAST_END
    1904             : 
    1905           0 :       if (yyss + yystacksize - 1 <= yyssp)
    1906           0 :         YYABORT;
    1907             :     }
    1908             : #endif /* !defined yyoverflow && !defined YYSTACK_RELOCATE */
    1909             : 
    1910             : 
    1911      437376 :   if (yystate == YYFINAL)
    1912        9306 :     YYACCEPT;
    1913             : 
    1914      428070 :   goto yybackup;
    1915             : 
    1916             : 
    1917             : /*-----------.
    1918             : | yybackup.  |
    1919             : `-----------*/
    1920      428070 : yybackup:
    1921             :   /* Do appropriate processing given the current state.  Read a
    1922             :      lookahead token if we need one and don't already have one.  */
    1923             : 
    1924             :   /* First try to decide what to do without reference to lookahead token.  */
    1925      428070 :   yyn = yypact[yystate];
    1926      428070 :   if (yypact_value_is_default (yyn))
    1927      229136 :     goto yydefault;
    1928             : 
    1929             :   /* Not known => get a lookahead token if don't already have one.  */
    1930             : 
    1931             :   /* YYCHAR is either empty, or end-of-input, or a valid lookahead.  */
    1932      198934 :   if (yychar == YYEMPTY)
    1933             :     {
    1934             :       YYDPRINTF ((stderr, "Reading a token\n"));
    1935      128276 :       yychar = yylex (&yylval, &yylloc, yyscanner);
    1936             :     }
    1937             : 
    1938      198934 :   if (yychar <= YYEOF)
    1939             :     {
    1940       15566 :       yychar = YYEOF;
    1941       15566 :       yytoken = YYSYMBOL_YYEOF;
    1942             :       YYDPRINTF ((stderr, "Now at end of input.\n"));
    1943             :     }
    1944      183368 :   else if (yychar == YYerror)
    1945             :     {
    1946             :       /* The scanner already issued an error message, process directly
    1947             :          to error recovery.  But do not keep the error token as
    1948             :          lookahead, it is too special and may lead us to an endless
    1949             :          loop in error recovery. */
    1950           0 :       yychar = YYUNDEF;
    1951           0 :       yytoken = YYSYMBOL_YYerror;
    1952           0 :       yyerror_range[1] = yylloc;
    1953           0 :       goto yyerrlab1;
    1954             :     }
    1955             :   else
    1956             :     {
    1957      183368 :       yytoken = YYTRANSLATE (yychar);
    1958             :       YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
    1959             :     }
    1960             : 
    1961             :   /* If the proper action on seeing token YYTOKEN is to reduce or to
    1962             :      detect an error, take that action.  */
    1963      198934 :   yyn += yytoken;
    1964      198934 :   if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken)
    1965       58490 :     goto yydefault;
    1966      140444 :   yyn = yytable[yyn];
    1967      140444 :   if (yyn <= 0)
    1968             :     {
    1969             :       if (yytable_value_is_error (yyn))
    1970             :         goto yyerrlab;
    1971       17990 :       yyn = -yyn;
    1972       17990 :       goto yyreduce;
    1973             :     }
    1974             : 
    1975             :   /* Count tokens shifted since error; after three, turn off error
    1976             :      status.  */
    1977      122454 :   if (yyerrstatus)
    1978           0 :     yyerrstatus--;
    1979             : 
    1980             :   /* Shift the lookahead token.  */
    1981             :   YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
    1982      122454 :   yystate = yyn;
    1983             :   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
    1984      122454 :   *++yyvsp = yylval;
    1985             :   YY_IGNORE_MAYBE_UNINITIALIZED_END
    1986      122454 :   *++yylsp = yylloc;
    1987             : 
    1988             :   /* Discard the shifted token.  */
    1989      122454 :   yychar = YYEMPTY;
    1990      122454 :   goto yynewstate;
    1991             : 
    1992             : 
    1993             : /*-----------------------------------------------------------.
    1994             : | yydefault -- do the default action for the current state.  |
    1995             : `-----------------------------------------------------------*/
    1996      287626 : yydefault:
    1997      287626 :   yyn = yydefact[yystate];
    1998      287626 :   if (yyn == 0)
    1999           2 :     goto yyerrlab;
    2000      287624 :   goto yyreduce;
    2001             : 
    2002             : 
    2003             : /*-----------------------------.
    2004             : | yyreduce -- do a reduction.  |
    2005             : `-----------------------------*/
    2006      305614 : yyreduce:
    2007             :   /* yyn is the number of a rule to reduce with.  */
    2008      305614 :   yylen = yyr2[yyn];
    2009             : 
    2010             :   /* If YYLEN is nonzero, implement the default value of the action:
    2011             :      '$$ = $1'.
    2012             : 
    2013             :      Otherwise, the following line sets YYVAL to garbage.
    2014             :      This behavior is undocumented and Bison
    2015             :      users should not rely upon it.  Assigning to YYVAL
    2016             :      unconditionally makes the parser a bit smaller, and it avoids a
    2017             :      GCC warning that YYVAL may be used uninitialized.  */
    2018      305614 :   yyval = yyvsp[1-yylen];
    2019             : 
    2020             :   /* Default location. */
    2021      305614 :   YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);
    2022      305614 :   yyerror_range[1] = yyloc;
    2023             :   YY_REDUCE_PRINT (yyn);
    2024      305614 :   switch (yyn)
    2025             :     {
    2026        9306 :   case 2: /* pl_function: comp_options pl_block opt_semi  */
    2027             : #line 375 "pl_gram.y"
    2028             :                                         {
    2029             :                         *plpgsql_parse_result_p = (PLpgSQL_stmt_block *) (yyvsp[-1].stmt);
    2030             :                         (void) yynerrs;     /* suppress compiler warning */
    2031             :                     }
    2032             : #line 2033 "pl_gram.c"
    2033        9306 :     break;
    2034             : 
    2035           0 :   case 5: /* comp_option: '#' K_OPTION K_DUMP  */
    2036             : #line 386 "pl_gram.y"
    2037             :                                         {
    2038             :                         plpgsql_DumpExecTree = true;
    2039             :                     }
    2040             : #line 2041 "pl_gram.c"
    2041           0 :     break;
    2042             : 
    2043          12 :   case 6: /* comp_option: '#' K_PRINT_STRICT_PARAMS option_value  */
    2044             : #line 390 "pl_gram.y"
    2045             :                                         {
    2046             :                         if (strcmp((yyvsp[0].str), "on") == 0)
    2047             :                             plpgsql_curr_compile->print_strict_params = true;
    2048             :                         else if (strcmp((yyvsp[0].str), "off") == 0)
    2049             :                             plpgsql_curr_compile->print_strict_params = false;
    2050             :                         else
    2051             :                             elog(ERROR, "unrecognized print_strict_params option %s", (yyvsp[0].str));
    2052             :                     }
    2053             : #line 2054 "pl_gram.c"
    2054          12 :     break;
    2055             : 
    2056           0 :   case 7: /* comp_option: '#' K_VARIABLE_CONFLICT K_ERROR  */
    2057             : #line 399 "pl_gram.y"
    2058             :                                         {
    2059             :                         plpgsql_curr_compile->resolve_option = PLPGSQL_RESOLVE_ERROR;
    2060             :                     }
    2061             : #line 2062 "pl_gram.c"
    2062           0 :     break;
    2063             : 
    2064           6 :   case 8: /* comp_option: '#' K_VARIABLE_CONFLICT K_USE_VARIABLE  */
    2065             : #line 403 "pl_gram.y"
    2066             :                                         {
    2067             :                         plpgsql_curr_compile->resolve_option = PLPGSQL_RESOLVE_VARIABLE;
    2068             :                     }
    2069             : #line 2070 "pl_gram.c"
    2070           6 :     break;
    2071             : 
    2072           6 :   case 9: /* comp_option: '#' K_VARIABLE_CONFLICT K_USE_COLUMN  */
    2073             : #line 407 "pl_gram.y"
    2074             :                                         {
    2075             :                         plpgsql_curr_compile->resolve_option = PLPGSQL_RESOLVE_COLUMN;
    2076             :                     }
    2077             : #line 2078 "pl_gram.c"
    2078           6 :     break;
    2079             : 
    2080          12 :   case 10: /* option_value: T_WORD  */
    2081             : #line 413 "pl_gram.y"
    2082             :                                 {
    2083             :                     (yyval.str) = (yyvsp[0].word).ident;
    2084             :                 }
    2085             : #line 2086 "pl_gram.c"
    2086          12 :     break;
    2087             : 
    2088           0 :   case 11: /* option_value: unreserved_keyword  */
    2089             : #line 417 "pl_gram.y"
    2090             :                                 {
    2091             :                     (yyval.str) = pstrdup((yyvsp[0].keyword));
    2092             :                 }
    2093             : #line 2094 "pl_gram.c"
    2094           0 :     break;
    2095             : 
    2096        9528 :   case 14: /* pl_block: decl_sect K_BEGIN proc_sect exception_sect K_END opt_label  */
    2097             : #line 426 "pl_gram.y"
    2098             :                                         {
    2099             :                         PLpgSQL_stmt_block *new;
    2100             : 
    2101             :                         new = palloc0(sizeof(PLpgSQL_stmt_block));
    2102             : 
    2103             :                         new->cmd_type    = PLPGSQL_STMT_BLOCK;
    2104             :                         new->lineno      = plpgsql_location_to_lineno((yylsp[-4]), yyscanner);
    2105             :                         new->stmtid      = ++plpgsql_curr_compile->nstatements;
    2106             :                         new->label       = (yyvsp[-5].declhdr).label;
    2107             :                         new->n_initvars = (yyvsp[-5].declhdr).n_initvars;
    2108             :                         new->initvarnos = (yyvsp[-5].declhdr).initvarnos;
    2109             :                         new->body        = (yyvsp[-3].list);
    2110             :                         new->exceptions  = (yyvsp[-2].exception_block);
    2111             : 
    2112             :                         check_labels((yyvsp[-5].declhdr).label, (yyvsp[0].str), (yylsp[0]), yyscanner);
    2113             :                         plpgsql_ns_pop();
    2114             : 
    2115             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    2116             :                     }
    2117             : #line 2118 "pl_gram.c"
    2118        9528 :     break;
    2119             : 
    2120        6094 :   case 15: /* decl_sect: opt_block_label  */
    2121             : #line 449 "pl_gram.y"
    2122             :                                         {
    2123             :                         /* done with decls, so resume identifier lookup */
    2124             :                         plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_NORMAL;
    2125             :                         (yyval.declhdr).label     = (yyvsp[0].str);
    2126             :                         (yyval.declhdr).n_initvars = 0;
    2127             :                         (yyval.declhdr).initvarnos = NULL;
    2128             :                     }
    2129             : #line 2130 "pl_gram.c"
    2130        6094 :     break;
    2131             : 
    2132          10 :   case 16: /* decl_sect: opt_block_label decl_start  */
    2133             : #line 457 "pl_gram.y"
    2134             :                                         {
    2135             :                         plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_NORMAL;
    2136             :                         (yyval.declhdr).label     = (yyvsp[-1].str);
    2137             :                         (yyval.declhdr).n_initvars = 0;
    2138             :                         (yyval.declhdr).initvarnos = NULL;
    2139             :                     }
    2140             : #line 2141 "pl_gram.c"
    2141          10 :     break;
    2142             : 
    2143        3552 :   case 17: /* decl_sect: opt_block_label decl_start decl_stmts  */
    2144             : #line 464 "pl_gram.y"
    2145             :                                         {
    2146             :                         plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_NORMAL;
    2147             :                         (yyval.declhdr).label     = (yyvsp[-2].str);
    2148             :                         /* Remember variables declared in decl_stmts */
    2149             :                         (yyval.declhdr).n_initvars = plpgsql_add_initdatums(&((yyval.declhdr).initvarnos));
    2150             :                     }
    2151             : #line 2152 "pl_gram.c"
    2152        3552 :     break;
    2153             : 
    2154        3604 :   case 18: /* decl_start: K_DECLARE  */
    2155             : #line 473 "pl_gram.y"
    2156             :                                         {
    2157             :                         /* Forget any variables created before block */
    2158             :                         plpgsql_add_initdatums(NULL);
    2159             :                         /*
    2160             :                          * Disable scanner lookup of identifiers while
    2161             :                          * we process the decl_stmts
    2162             :                          */
    2163             :                         plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_DECLARE;
    2164             :                     }
    2165             : #line 2166 "pl_gram.c"
    2166        3604 :     break;
    2167             : 
    2168           0 :   case 22: /* decl_stmt: K_DECLARE  */
    2169             : #line 490 "pl_gram.y"
    2170             :                                         {
    2171             :                         /* We allow useless extra DECLAREs */
    2172             :                     }
    2173             : #line 2174 "pl_gram.c"
    2174           0 :     break;
    2175             : 
    2176           0 :   case 23: /* decl_stmt: LESS_LESS any_identifier GREATER_GREATER  */
    2177             : #line 494 "pl_gram.y"
    2178             :                                         {
    2179             :                         /*
    2180             :                          * Throw a helpful error if user tries to put block
    2181             :                          * label just before BEGIN, instead of before DECLARE.
    2182             :                          */
    2183             :                         ereport(ERROR,
    2184             :                                 (errcode(ERRCODE_SYNTAX_ERROR),
    2185             :                                  errmsg("block label must be placed before DECLARE, not after"),
    2186             :                                  parser_errposition((yylsp[-2]))));
    2187             :                     }
    2188             : #line 2189 "pl_gram.c"
    2189             :     break;
    2190             : 
    2191        5822 :   case 24: /* decl_statement: decl_varname decl_const decl_datatype decl_collate decl_notnull decl_defval  */
    2192             : #line 507 "pl_gram.y"
    2193             :                                         {
    2194             :                         PLpgSQL_variable    *var;
    2195             : 
    2196             :                         /*
    2197             :                          * If a collation is supplied, insert it into the
    2198             :                          * datatype.  We assume decl_datatype always returns
    2199             :                          * a freshly built struct not shared with other
    2200             :                          * variables.
    2201             :                          */
    2202             :                         if (OidIsValid((yyvsp[-2].oid)))
    2203             :                         {
    2204             :                             if (!OidIsValid((yyvsp[-3].dtype)->collation))
    2205             :                                 ereport(ERROR,
    2206             :                                         (errcode(ERRCODE_DATATYPE_MISMATCH),
    2207             :                                          errmsg("collations are not supported by type %s",
    2208             :                                                 format_type_be((yyvsp[-3].dtype)->typoid)),
    2209             :                                          parser_errposition((yylsp[-2]))));
    2210             :                             (yyvsp[-3].dtype)->collation = (yyvsp[-2].oid);
    2211             :                         }
    2212             : 
    2213             :                         var = plpgsql_build_variable((yyvsp[-5].varname).name, (yyvsp[-5].varname).lineno,
    2214             :                                                      (yyvsp[-3].dtype), true);
    2215             :                         var->isconst = (yyvsp[-4].boolean);
    2216             :                         var->notnull = (yyvsp[-1].boolean);
    2217             :                         var->default_val = (yyvsp[0].expr);
    2218             : 
    2219             :                         /*
    2220             :                          * The combination of NOT NULL without an initializer
    2221             :                          * can't work, so let's reject it at compile time.
    2222             :                          */
    2223             :                         if (var->notnull && var->default_val == NULL)
    2224             :                             ereport(ERROR,
    2225             :                                     (errcode(ERRCODE_NULL_VALUE_NOT_ALLOWED),
    2226             :                                      errmsg("variable \"%s\" must have a default value, since it's declared NOT NULL",
    2227             :                                             var->refname),
    2228             :                                      parser_errposition((yylsp[-1]))));
    2229             : 
    2230             :                         if (var->default_val != NULL)
    2231             :                             mark_expr_as_assignment_source(var->default_val,
    2232             :                                                            (PLpgSQL_datum *) var);
    2233             :                     }
    2234             : #line 2235 "pl_gram.c"
    2235        5812 :     break;
    2236             : 
    2237          84 :   case 25: /* decl_statement: decl_varname K_ALIAS K_FOR decl_aliasitem ';'  */
    2238             : #line 549 "pl_gram.y"
    2239             :                                         {
    2240             :                         plpgsql_ns_additem((yyvsp[-1].nsitem)->itemtype,
    2241             :                                            (yyvsp[-1].nsitem)->itemno, (yyvsp[-4].varname).name);
    2242             :                     }
    2243             : #line 2244 "pl_gram.c"
    2244          84 :     break;
    2245             : 
    2246         122 :   case 26: /* $@1: %empty  */
    2247             : #line 554 "pl_gram.y"
    2248             :                                         { plpgsql_ns_push((yyvsp[-2].varname).name, PLPGSQL_LABEL_OTHER); }
    2249             : #line 2250 "pl_gram.c"
    2250         122 :     break;
    2251             : 
    2252         122 :   case 27: /* decl_statement: decl_varname opt_scrollable K_CURSOR $@1 decl_cursor_args decl_is_for decl_cursor_query  */
    2253             : #line 556 "pl_gram.y"
    2254             :                                         {
    2255             :                         PLpgSQL_var *new;
    2256             : 
    2257             :                         /* pop local namespace for cursor args */
    2258             :                         plpgsql_ns_pop();
    2259             : 
    2260             :                         new = (PLpgSQL_var *)
    2261             :                             plpgsql_build_variable((yyvsp[-6].varname).name, (yyvsp[-6].varname).lineno,
    2262             :                                                    plpgsql_build_datatype(REFCURSOROID,
    2263             :                                                                           -1,
    2264             :                                                                           InvalidOid,
    2265             :                                                                           NULL),
    2266             :                                                    true);
    2267             : 
    2268             :                         new->cursor_explicit_expr = (yyvsp[0].expr);
    2269             :                         if ((yyvsp[-2].datum) == NULL)
    2270             :                             new->cursor_explicit_argrow = -1;
    2271             :                         else
    2272             :                             new->cursor_explicit_argrow = (yyvsp[-2].datum)->dno;
    2273             :                         new->cursor_options = CURSOR_OPT_FAST_PLAN | (yyvsp[-5].ival);
    2274             :                     }
    2275             : #line 2276 "pl_gram.c"
    2276         122 :     break;
    2277             : 
    2278         110 :   case 28: /* opt_scrollable: %empty  */
    2279             : #line 580 "pl_gram.y"
    2280             :                                         {
    2281             :                         (yyval.ival) = 0;
    2282             :                     }
    2283             : #line 2284 "pl_gram.c"
    2284         110 :     break;
    2285             : 
    2286           6 :   case 29: /* opt_scrollable: K_NO K_SCROLL  */
    2287             : #line 584 "pl_gram.y"
    2288             :                                         {
    2289             :                         (yyval.ival) = CURSOR_OPT_NO_SCROLL;
    2290             :                     }
    2291             : #line 2292 "pl_gram.c"
    2292           6 :     break;
    2293             : 
    2294           6 :   case 30: /* opt_scrollable: K_SCROLL  */
    2295             : #line 588 "pl_gram.y"
    2296             :                                         {
    2297             :                         (yyval.ival) = CURSOR_OPT_SCROLL;
    2298             :                     }
    2299             : #line 2300 "pl_gram.c"
    2300           6 :     break;
    2301             : 
    2302         122 :   case 31: /* decl_cursor_query: %empty  */
    2303             : #line 594 "pl_gram.y"
    2304             :                                         {
    2305             :                         (yyval.expr) = read_sql_stmt(&yylval, &yylloc, yyscanner);
    2306             :                     }
    2307             : #line 2308 "pl_gram.c"
    2308         122 :     break;
    2309             : 
    2310          50 :   case 32: /* decl_cursor_args: %empty  */
    2311             : #line 600 "pl_gram.y"
    2312             :                                         {
    2313             :                         (yyval.datum) = NULL;
    2314             :                     }
    2315             : #line 2316 "pl_gram.c"
    2316          50 :     break;
    2317             : 
    2318          72 :   case 33: /* decl_cursor_args: '(' decl_cursor_arglist ')'  */
    2319             : #line 604 "pl_gram.y"
    2320             :                                         {
    2321             :                         PLpgSQL_row *new;
    2322             :                         int         i;
    2323             :                         ListCell   *l;
    2324             : 
    2325             :                         new = palloc0(sizeof(PLpgSQL_row));
    2326             :                         new->dtype = PLPGSQL_DTYPE_ROW;
    2327             :                         new->refname = "(unnamed row)";
    2328             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-2]), yyscanner);
    2329             :                         new->rowtupdesc = NULL;
    2330             :                         new->nfields = list_length((yyvsp[-1].list));
    2331             :                         new->fieldnames = palloc(new->nfields * sizeof(char *));
    2332             :                         new->varnos = palloc(new->nfields * sizeof(int));
    2333             : 
    2334             :                         i = 0;
    2335             :                         foreach (l, (yyvsp[-1].list))
    2336             :                         {
    2337             :                             PLpgSQL_variable *arg = (PLpgSQL_variable *) lfirst(l);
    2338             :                             Assert(!arg->isconst);
    2339             :                             new->fieldnames[i] = arg->refname;
    2340             :                             new->varnos[i] = arg->dno;
    2341             :                             i++;
    2342             :                         }
    2343             :                         list_free((yyvsp[-1].list));
    2344             : 
    2345             :                         plpgsql_adddatum((PLpgSQL_datum *) new);
    2346             :                         (yyval.datum) = (PLpgSQL_datum *) new;
    2347             :                     }
    2348             : #line 2349 "pl_gram.c"
    2349          72 :     break;
    2350             : 
    2351          72 :   case 34: /* decl_cursor_arglist: decl_cursor_arg  */
    2352             : #line 635 "pl_gram.y"
    2353             :                                         {
    2354             :                         (yyval.list) = list_make1((yyvsp[0].datum));
    2355             :                     }
    2356             : #line 2357 "pl_gram.c"
    2357          72 :     break;
    2358             : 
    2359          72 :   case 35: /* decl_cursor_arglist: decl_cursor_arglist ',' decl_cursor_arg  */
    2360             : #line 639 "pl_gram.y"
    2361             :                                         {
    2362             :                         (yyval.list) = lappend((yyvsp[-2].list), (yyvsp[0].datum));
    2363             :                     }
    2364             : #line 2365 "pl_gram.c"
    2365          72 :     break;
    2366             : 
    2367         144 :   case 36: /* decl_cursor_arg: decl_varname decl_datatype  */
    2368             : #line 645 "pl_gram.y"
    2369             :                                         {
    2370             :                         (yyval.datum) = (PLpgSQL_datum *)
    2371             :                             plpgsql_build_variable((yyvsp[-1].varname).name, (yyvsp[-1].varname).lineno,
    2372             :                                                    (yyvsp[0].dtype), true);
    2373             :                     }
    2374             : #line 2375 "pl_gram.c"
    2375         144 :     break;
    2376             : 
    2377          84 :   case 39: /* decl_aliasitem: T_WORD  */
    2378             : #line 656 "pl_gram.y"
    2379             :                                         {
    2380             :                         PLpgSQL_nsitem *nsi;
    2381             : 
    2382             :                         nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,
    2383             :                                                 (yyvsp[0].word).ident, NULL, NULL,
    2384             :                                                 NULL);
    2385             :                         if (nsi == NULL)
    2386             :                             ereport(ERROR,
    2387             :                                     (errcode(ERRCODE_UNDEFINED_OBJECT),
    2388             :                                      errmsg("variable \"%s\" does not exist",
    2389             :                                             (yyvsp[0].word).ident),
    2390             :                                      parser_errposition((yylsp[0]))));
    2391             :                         (yyval.nsitem) = nsi;
    2392             :                     }
    2393             : #line 2394 "pl_gram.c"
    2394          84 :     break;
    2395             : 
    2396           0 :   case 40: /* decl_aliasitem: unreserved_keyword  */
    2397             : #line 671 "pl_gram.y"
    2398             :                                         {
    2399             :                         PLpgSQL_nsitem *nsi;
    2400             : 
    2401             :                         nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,
    2402             :                                                 (yyvsp[0].keyword), NULL, NULL,
    2403             :                                                 NULL);
    2404             :                         if (nsi == NULL)
    2405             :                             ereport(ERROR,
    2406             :                                     (errcode(ERRCODE_UNDEFINED_OBJECT),
    2407             :                                      errmsg("variable \"%s\" does not exist",
    2408             :                                             (yyvsp[0].keyword)),
    2409             :                                      parser_errposition((yylsp[0]))));
    2410             :                         (yyval.nsitem) = nsi;
    2411             :                     }
    2412             : #line 2413 "pl_gram.c"
    2413           0 :     break;
    2414             : 
    2415           0 :   case 41: /* decl_aliasitem: T_CWORD  */
    2416             : #line 686 "pl_gram.y"
    2417             :                                         {
    2418             :                         PLpgSQL_nsitem *nsi;
    2419             : 
    2420             :                         if (list_length((yyvsp[0].cword).idents) == 2)
    2421             :                             nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,
    2422             :                                                     strVal(linitial((yyvsp[0].cword).idents)),
    2423             :                                                     strVal(lsecond((yyvsp[0].cword).idents)),
    2424             :                                                     NULL,
    2425             :                                                     NULL);
    2426             :                         else if (list_length((yyvsp[0].cword).idents) == 3)
    2427             :                             nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,
    2428             :                                                     strVal(linitial((yyvsp[0].cword).idents)),
    2429             :                                                     strVal(lsecond((yyvsp[0].cword).idents)),
    2430             :                                                     strVal(lthird((yyvsp[0].cword).idents)),
    2431             :                                                     NULL);
    2432             :                         else
    2433             :                             nsi = NULL;
    2434             :                         if (nsi == NULL)
    2435             :                             ereport(ERROR,
    2436             :                                     (errcode(ERRCODE_UNDEFINED_OBJECT),
    2437             :                                      errmsg("variable \"%s\" does not exist",
    2438             :                                             NameListToString((yyvsp[0].cword).idents)),
    2439             :                                      parser_errposition((yylsp[0]))));
    2440             :                         (yyval.nsitem) = nsi;
    2441             :                     }
    2442             : #line 2443 "pl_gram.c"
    2443           0 :     break;
    2444             : 
    2445        6172 :   case 42: /* decl_varname: T_WORD  */
    2446             : #line 714 "pl_gram.y"
    2447             :                                         {
    2448             :                         (yyval.varname).name = (yyvsp[0].word).ident;
    2449             :                         (yyval.varname).lineno = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    2450             :                         /*
    2451             :                          * Check to make sure name isn't already declared
    2452             :                          * in the current block.
    2453             :                          */
    2454             :                         if (plpgsql_ns_lookup(plpgsql_ns_top(), true,
    2455             :                                               (yyvsp[0].word).ident, NULL, NULL,
    2456             :                                               NULL) != NULL)
    2457             :                             yyerror(&yylloc, NULL, yyscanner, "duplicate declaration");
    2458             : 
    2459             :                         if (plpgsql_curr_compile->extra_warnings & PLPGSQL_XCHECK_SHADOWVAR ||
    2460             :                             plpgsql_curr_compile->extra_errors & PLPGSQL_XCHECK_SHADOWVAR)
    2461             :                         {
    2462             :                             PLpgSQL_nsitem *nsi;
    2463             :                             nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,
    2464             :                                                     (yyvsp[0].word).ident, NULL, NULL, NULL);
    2465             :                             if (nsi != NULL)
    2466             :                                 ereport(plpgsql_curr_compile->extra_errors & PLPGSQL_XCHECK_SHADOWVAR ? ERROR : WARNING,
    2467             :                                         (errcode(ERRCODE_DUPLICATE_ALIAS),
    2468             :                                          errmsg("variable \"%s\" shadows a previously defined variable",
    2469             :                                                 (yyvsp[0].word).ident),
    2470             :                                          parser_errposition((yylsp[0]))));
    2471             :                         }
    2472             : 
    2473             :                     }
    2474             : #line 2475 "pl_gram.c"
    2475        6166 :     break;
    2476             : 
    2477          32 :   case 43: /* decl_varname: unreserved_keyword  */
    2478             : #line 742 "pl_gram.y"
    2479             :                                         {
    2480             :                         (yyval.varname).name = pstrdup((yyvsp[0].keyword));
    2481             :                         (yyval.varname).lineno = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    2482             :                         /*
    2483             :                          * Check to make sure name isn't already declared
    2484             :                          * in the current block.
    2485             :                          */
    2486             :                         if (plpgsql_ns_lookup(plpgsql_ns_top(), true,
    2487             :                                               (yyvsp[0].keyword), NULL, NULL,
    2488             :                                               NULL) != NULL)
    2489             :                             yyerror(&yylloc, NULL, yyscanner, "duplicate declaration");
    2490             : 
    2491             :                         if (plpgsql_curr_compile->extra_warnings & PLPGSQL_XCHECK_SHADOWVAR ||
    2492             :                             plpgsql_curr_compile->extra_errors & PLPGSQL_XCHECK_SHADOWVAR)
    2493             :                         {
    2494             :                             PLpgSQL_nsitem *nsi;
    2495             :                             nsi = plpgsql_ns_lookup(plpgsql_ns_top(), false,
    2496             :                                                     (yyvsp[0].keyword), NULL, NULL, NULL);
    2497             :                             if (nsi != NULL)
    2498             :                                 ereport(plpgsql_curr_compile->extra_errors & PLPGSQL_XCHECK_SHADOWVAR ? ERROR : WARNING,
    2499             :                                         (errcode(ERRCODE_DUPLICATE_ALIAS),
    2500             :                                          errmsg("variable \"%s\" shadows a previously defined variable",
    2501             :                                                 (yyvsp[0].keyword)),
    2502             :                                          parser_errposition((yylsp[0]))));
    2503             :                         }
    2504             : 
    2505             :                     }
    2506             : #line 2507 "pl_gram.c"
    2507          32 :     break;
    2508             : 
    2509        5820 :   case 44: /* decl_const: %empty  */
    2510             : #line 772 "pl_gram.y"
    2511             :                                         { (yyval.boolean) = false; }
    2512             : #line 2513 "pl_gram.c"
    2513        5820 :     break;
    2514             : 
    2515          28 :   case 45: /* decl_const: K_CONSTANT  */
    2516             : #line 774 "pl_gram.y"
    2517             :                                         { (yyval.boolean) = true; }
    2518             : #line 2519 "pl_gram.c"
    2519          28 :     break;
    2520             : 
    2521        5992 :   case 46: /* decl_datatype: %empty  */
    2522             : #line 778 "pl_gram.y"
    2523             :                                         {
    2524             :                         /*
    2525             :                          * If there's a lookahead token, read_datatype() will
    2526             :                          * consume it, and then we must tell bison to forget
    2527             :                          * it.
    2528             :                          */
    2529             :                         (yyval.dtype) = read_datatype(yychar, &yylval, &yylloc, yyscanner);
    2530             :                         yyclearin;
    2531             :                     }
    2532             : #line 2533 "pl_gram.c"
    2533        5966 :     break;
    2534             : 
    2535        5798 :   case 47: /* decl_collate: %empty  */
    2536             : #line 790 "pl_gram.y"
    2537             :                                         { (yyval.oid) = InvalidOid; }
    2538             : #line 2539 "pl_gram.c"
    2539        5798 :     break;
    2540             : 
    2541          24 :   case 48: /* decl_collate: K_COLLATE T_WORD  */
    2542             : #line 792 "pl_gram.y"
    2543             :                                         {
    2544             :                         (yyval.oid) = get_collation_oid(list_make1(makeString((yyvsp[0].word).ident)),
    2545             :                                                false);
    2546             :                     }
    2547             : #line 2548 "pl_gram.c"
    2548          24 :     break;
    2549             : 
    2550           0 :   case 49: /* decl_collate: K_COLLATE unreserved_keyword  */
    2551             : #line 797 "pl_gram.y"
    2552             :                                         {
    2553             :                         (yyval.oid) = get_collation_oid(list_make1(makeString(pstrdup((yyvsp[0].keyword)))),
    2554             :                                                false);
    2555             :                     }
    2556             : #line 2557 "pl_gram.c"
    2557           0 :     break;
    2558             : 
    2559           0 :   case 50: /* decl_collate: K_COLLATE T_CWORD  */
    2560             : #line 802 "pl_gram.y"
    2561             :                                         {
    2562             :                         (yyval.oid) = get_collation_oid((yyvsp[0].cword).idents, false);
    2563             :                     }
    2564             : #line 2565 "pl_gram.c"
    2565           0 :     break;
    2566             : 
    2567        5798 :   case 51: /* decl_notnull: %empty  */
    2568             : #line 808 "pl_gram.y"
    2569             :                                         { (yyval.boolean) = false; }
    2570             : #line 2571 "pl_gram.c"
    2571        5798 :     break;
    2572             : 
    2573          24 :   case 52: /* decl_notnull: K_NOT K_NULL  */
    2574             : #line 810 "pl_gram.y"
    2575             :                                         { (yyval.boolean) = true; }
    2576             : #line 2577 "pl_gram.c"
    2577          24 :     break;
    2578             : 
    2579        5010 :   case 53: /* decl_defval: ';'  */
    2580             : #line 814 "pl_gram.y"
    2581             :                                         { (yyval.expr) = NULL; }
    2582             : #line 2583 "pl_gram.c"
    2583        5010 :     break;
    2584             : 
    2585         812 :   case 54: /* decl_defval: decl_defkey  */
    2586             : #line 816 "pl_gram.y"
    2587             :                                         {
    2588             :                         (yyval.expr) = read_sql_expression(';', ";", &yylval, &yylloc, yyscanner);
    2589             :                     }
    2590             : #line 2591 "pl_gram.c"
    2591         812 :     break;
    2592             : 
    2593       19978 :   case 59: /* proc_sect: %empty  */
    2594             : #line 835 "pl_gram.y"
    2595             :                                         { (yyval.list) = NIL; }
    2596             : #line 2597 "pl_gram.c"
    2597       19978 :     break;
    2598             : 
    2599       38560 :   case 60: /* proc_sect: proc_sect proc_stmt  */
    2600             : #line 837 "pl_gram.y"
    2601             :                                         {
    2602             :                         /* don't bother linking null statements into list */
    2603             :                         if ((yyvsp[0].stmt) == NULL)
    2604             :                             (yyval.list) = (yyvsp[-1].list);
    2605             :                         else
    2606             :                             (yyval.list) = lappend((yyvsp[-1].list), (yyvsp[0].stmt));
    2607             :                     }
    2608             : #line 2609 "pl_gram.c"
    2609       38560 :     break;
    2610             : 
    2611         222 :   case 61: /* proc_stmt: pl_block ';'  */
    2612             : #line 847 "pl_gram.y"
    2613             :                                                 { (yyval.stmt) = (yyvsp[-1].stmt); }
    2614             : #line 2615 "pl_gram.c"
    2615         222 :     break;
    2616             : 
    2617        7724 :   case 62: /* proc_stmt: stmt_assign  */
    2618             : #line 849 "pl_gram.y"
    2619             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2620             : #line 2621 "pl_gram.c"
    2621        7724 :     break;
    2622             : 
    2623        5916 :   case 63: /* proc_stmt: stmt_if  */
    2624             : #line 851 "pl_gram.y"
    2625             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2626             : #line 2627 "pl_gram.c"
    2627        5916 :     break;
    2628             : 
    2629          18 :   case 64: /* proc_stmt: stmt_case  */
    2630             : #line 853 "pl_gram.y"
    2631             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2632             : #line 2633 "pl_gram.c"
    2633          18 :     break;
    2634             : 
    2635          76 :   case 65: /* proc_stmt: stmt_loop  */
    2636             : #line 855 "pl_gram.y"
    2637             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2638             : #line 2639 "pl_gram.c"
    2639          76 :     break;
    2640             : 
    2641          80 :   case 66: /* proc_stmt: stmt_while  */
    2642             : #line 857 "pl_gram.y"
    2643             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2644             : #line 2645 "pl_gram.c"
    2645          80 :     break;
    2646             : 
    2647        1518 :   case 67: /* proc_stmt: stmt_for  */
    2648             : #line 859 "pl_gram.y"
    2649             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2650             : #line 2651 "pl_gram.c"
    2651        1518 :     break;
    2652             : 
    2653          62 :   case 68: /* proc_stmt: stmt_foreach_a  */
    2654             : #line 861 "pl_gram.y"
    2655             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2656             : #line 2657 "pl_gram.c"
    2657          62 :     break;
    2658             : 
    2659         174 :   case 69: /* proc_stmt: stmt_exit  */
    2660             : #line 863 "pl_gram.y"
    2661             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2662             : #line 2663 "pl_gram.c"
    2663         174 :     break;
    2664             : 
    2665        8910 :   case 70: /* proc_stmt: stmt_return  */
    2666             : #line 865 "pl_gram.y"
    2667             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2668             : #line 2669 "pl_gram.c"
    2669        8910 :     break;
    2670             : 
    2671        6704 :   case 71: /* proc_stmt: stmt_raise  */
    2672             : #line 867 "pl_gram.y"
    2673             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2674             : #line 2675 "pl_gram.c"
    2675        6704 :     break;
    2676             : 
    2677          54 :   case 72: /* proc_stmt: stmt_assert  */
    2678             : #line 869 "pl_gram.y"
    2679             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2680             : #line 2681 "pl_gram.c"
    2681          54 :     break;
    2682             : 
    2683        4138 :   case 73: /* proc_stmt: stmt_execsql  */
    2684             : #line 871 "pl_gram.y"
    2685             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2686             : #line 2687 "pl_gram.c"
    2687        4138 :     break;
    2688             : 
    2689        1100 :   case 74: /* proc_stmt: stmt_dynexecute  */
    2690             : #line 873 "pl_gram.y"
    2691             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2692             : #line 2693 "pl_gram.c"
    2693        1100 :     break;
    2694             : 
    2695        1132 :   case 75: /* proc_stmt: stmt_perform  */
    2696             : #line 875 "pl_gram.y"
    2697             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2698             : #line 2699 "pl_gram.c"
    2699        1132 :     break;
    2700             : 
    2701         108 :   case 76: /* proc_stmt: stmt_call  */
    2702             : #line 877 "pl_gram.y"
    2703             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2704             : #line 2705 "pl_gram.c"
    2705         108 :     break;
    2706             : 
    2707         136 :   case 77: /* proc_stmt: stmt_getdiag  */
    2708             : #line 879 "pl_gram.y"
    2709             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2710             : #line 2711 "pl_gram.c"
    2711         136 :     break;
    2712             : 
    2713         116 :   case 78: /* proc_stmt: stmt_open  */
    2714             : #line 881 "pl_gram.y"
    2715             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2716             : #line 2717 "pl_gram.c"
    2717         116 :     break;
    2718             : 
    2719         122 :   case 79: /* proc_stmt: stmt_fetch  */
    2720             : #line 883 "pl_gram.y"
    2721             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2722             : #line 2723 "pl_gram.c"
    2723         122 :     break;
    2724             : 
    2725          18 :   case 80: /* proc_stmt: stmt_move  */
    2726             : #line 885 "pl_gram.y"
    2727             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2728             : #line 2729 "pl_gram.c"
    2729          18 :     break;
    2730             : 
    2731          66 :   case 81: /* proc_stmt: stmt_close  */
    2732             : #line 887 "pl_gram.y"
    2733             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2734             : #line 2735 "pl_gram.c"
    2735          66 :     break;
    2736             : 
    2737          38 :   case 82: /* proc_stmt: stmt_null  */
    2738             : #line 889 "pl_gram.y"
    2739             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2740             : #line 2741 "pl_gram.c"
    2741          38 :     break;
    2742             : 
    2743          78 :   case 83: /* proc_stmt: stmt_commit  */
    2744             : #line 891 "pl_gram.y"
    2745             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2746             : #line 2747 "pl_gram.c"
    2747          78 :     break;
    2748             : 
    2749          50 :   case 84: /* proc_stmt: stmt_rollback  */
    2750             : #line 893 "pl_gram.y"
    2751             :                                                 { (yyval.stmt) = (yyvsp[0].stmt); }
    2752             : #line 2753 "pl_gram.c"
    2753          50 :     break;
    2754             : 
    2755        1132 :   case 85: /* stmt_perform: K_PERFORM  */
    2756             : #line 897 "pl_gram.y"
    2757             :                                         {
    2758             :                         PLpgSQL_stmt_perform *new;
    2759             :                         int         startloc;
    2760             : 
    2761             :                         new = palloc0(sizeof(PLpgSQL_stmt_perform));
    2762             :                         new->cmd_type = PLPGSQL_STMT_PERFORM;
    2763             :                         new->lineno   = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    2764             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    2765             :                         plpgsql_push_back_token(K_PERFORM, &yylval, &yylloc, yyscanner);
    2766             : 
    2767             :                         /*
    2768             :                          * Since PERFORM isn't legal SQL, we have to cheat to
    2769             :                          * the extent of substituting "SELECT" for "PERFORM"
    2770             :                          * in the parsed text.  It does not seem worth
    2771             :                          * inventing a separate parse mode for this one case.
    2772             :                          * We can't do syntax-checking until after we make the
    2773             :                          * substitution.
    2774             :                          */
    2775             :                         new->expr = read_sql_construct(';', 0, 0, ";",
    2776             :                                                        RAW_PARSE_DEFAULT,
    2777             :                                                        false, false,
    2778             :                                                        &startloc, NULL,
    2779             :                                                        &yylval, &yylloc, yyscanner);
    2780             :                         /* overwrite "perform" ... */
    2781             :                         memcpy(new->expr->query, " SELECT", 7);
    2782             :                         /* left-justify to get rid of the leading space */
    2783             :                         memmove(new->expr->query, new->expr->query + 1,
    2784             :                                 strlen(new->expr->query));
    2785             :                         /* offset syntax error position to account for that */
    2786             :                         check_sql_expr(new->expr->query, new->expr->parseMode,
    2787             :                                        startloc + 1, yyscanner);
    2788             : 
    2789             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    2790             :                     }
    2791             : #line 2792 "pl_gram.c"
    2792        1132 :     break;
    2793             : 
    2794         106 :   case 86: /* stmt_call: K_CALL  */
    2795             : #line 934 "pl_gram.y"
    2796             :                                         {
    2797             :                         PLpgSQL_stmt_call *new;
    2798             : 
    2799             :                         new = palloc0(sizeof(PLpgSQL_stmt_call));
    2800             :                         new->cmd_type = PLPGSQL_STMT_CALL;
    2801             :                         new->lineno = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    2802             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    2803             :                         plpgsql_push_back_token(K_CALL, &yylval, &yylloc, yyscanner);
    2804             :                         new->expr = read_sql_stmt(&yylval, &yylloc, yyscanner);
    2805             :                         new->is_call = true;
    2806             : 
    2807             :                         /* Remember we may need a procedure resource owner */
    2808             :                         plpgsql_curr_compile->requires_procedure_resowner = true;
    2809             : 
    2810             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    2811             : 
    2812             :                     }
    2813             : #line 2814 "pl_gram.c"
    2814         106 :     break;
    2815             : 
    2816           2 :   case 87: /* stmt_call: K_DO  */
    2817             : #line 952 "pl_gram.y"
    2818             :                                         {
    2819             :                         /* use the same structures as for CALL, for simplicity */
    2820             :                         PLpgSQL_stmt_call *new;
    2821             : 
    2822             :                         new = palloc0(sizeof(PLpgSQL_stmt_call));
    2823             :                         new->cmd_type = PLPGSQL_STMT_CALL;
    2824             :                         new->lineno = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    2825             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    2826             :                         plpgsql_push_back_token(K_DO, &yylval, &yylloc, yyscanner);
    2827             :                         new->expr = read_sql_stmt(&yylval, &yylloc, yyscanner);
    2828             :                         new->is_call = false;
    2829             : 
    2830             :                         /* Remember we may need a procedure resource owner */
    2831             :                         plpgsql_curr_compile->requires_procedure_resowner = true;
    2832             : 
    2833             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    2834             : 
    2835             :                     }
    2836             : #line 2837 "pl_gram.c"
    2837           2 :     break;
    2838             : 
    2839        7730 :   case 88: /* stmt_assign: T_DATUM  */
    2840             : #line 973 "pl_gram.y"
    2841             :                                         {
    2842             :                         PLpgSQL_stmt_assign *new;
    2843             :                         RawParseMode pmode;
    2844             : 
    2845             :                         /* see how many names identify the datum */
    2846             :                         switch ((yyvsp[0].wdatum).ident ? 1 : list_length((yyvsp[0].wdatum).idents))
    2847             :                         {
    2848             :                             case 1:
    2849             :                                 pmode = RAW_PARSE_PLPGSQL_ASSIGN1;
    2850             :                                 break;
    2851             :                             case 2:
    2852             :                                 pmode = RAW_PARSE_PLPGSQL_ASSIGN2;
    2853             :                                 break;
    2854             :                             case 3:
    2855             :                                 pmode = RAW_PARSE_PLPGSQL_ASSIGN3;
    2856             :                                 break;
    2857             :                             default:
    2858             :                                 elog(ERROR, "unexpected number of names");
    2859             :                                 pmode = 0; /* keep compiler quiet */
    2860             :                         }
    2861             : 
    2862             :                         check_assignable((yyvsp[0].wdatum).datum, (yylsp[0]), yyscanner);
    2863             :                         new = palloc0(sizeof(PLpgSQL_stmt_assign));
    2864             :                         new->cmd_type = PLPGSQL_STMT_ASSIGN;
    2865             :                         new->lineno = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    2866             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    2867             :                         new->varno = (yyvsp[0].wdatum).datum->dno;
    2868             :                         /* Push back the head name to include it in the stmt */
    2869             :                         plpgsql_push_back_token(T_DATUM, &yylval, &yylloc, yyscanner);
    2870             :                         new->expr = read_sql_construct(';', 0, 0, ";",
    2871             :                                                        pmode,
    2872             :                                                        false, true,
    2873             :                                                        NULL, NULL,
    2874             :                                                        &yylval, &yylloc, yyscanner);
    2875             :                         mark_expr_as_assignment_source(new->expr, (yyvsp[0].wdatum).datum);
    2876             : 
    2877             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    2878             :                     }
    2879             : #line 2880 "pl_gram.c"
    2880        7724 :     break;
    2881             : 
    2882         136 :   case 89: /* stmt_getdiag: K_GET getdiag_area_opt K_DIAGNOSTICS getdiag_list ';'  */
    2883             : #line 1014 "pl_gram.y"
    2884             :                                         {
    2885             :                         PLpgSQL_stmt_getdiag *new;
    2886             :                         ListCell       *lc;
    2887             : 
    2888             :                         new = palloc0(sizeof(PLpgSQL_stmt_getdiag));
    2889             :                         new->cmd_type = PLPGSQL_STMT_GETDIAG;
    2890             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-4]), yyscanner);
    2891             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    2892             :                         new->is_stacked = (yyvsp[-3].boolean);
    2893             :                         new->diag_items = (yyvsp[-1].list);
    2894             : 
    2895             :                         /*
    2896             :                          * Check information items are valid for area option.
    2897             :                          */
    2898             :                         foreach(lc, new->diag_items)
    2899             :                         {
    2900             :                             PLpgSQL_diag_item *ditem = (PLpgSQL_diag_item *) lfirst(lc);
    2901             : 
    2902             :                             switch (ditem->kind)
    2903             :                             {
    2904             :                                 /* these fields are disallowed in stacked case */
    2905             :                                 case PLPGSQL_GETDIAG_ROW_COUNT:
    2906             :                                 case PLPGSQL_GETDIAG_ROUTINE_OID:
    2907             :                                     if (new->is_stacked)
    2908             :                                         ereport(ERROR,
    2909             :                                                 (errcode(ERRCODE_SYNTAX_ERROR),
    2910             :                                                  errmsg("diagnostics item %s is not allowed in GET STACKED DIAGNOSTICS",
    2911             :                                                         plpgsql_getdiag_kindname(ditem->kind)),
    2912             :                                                  parser_errposition((yylsp[-4]))));
    2913             :                                     break;
    2914             :                                 /* these fields are disallowed in current case */
    2915             :                                 case PLPGSQL_GETDIAG_ERROR_CONTEXT:
    2916             :                                 case PLPGSQL_GETDIAG_ERROR_DETAIL:
    2917             :                                 case PLPGSQL_GETDIAG_ERROR_HINT:
    2918             :                                 case PLPGSQL_GETDIAG_RETURNED_SQLSTATE:
    2919             :                                 case PLPGSQL_GETDIAG_COLUMN_NAME:
    2920             :                                 case PLPGSQL_GETDIAG_CONSTRAINT_NAME:
    2921             :                                 case PLPGSQL_GETDIAG_DATATYPE_NAME:
    2922             :                                 case PLPGSQL_GETDIAG_MESSAGE_TEXT:
    2923             :                                 case PLPGSQL_GETDIAG_TABLE_NAME:
    2924             :                                 case PLPGSQL_GETDIAG_SCHEMA_NAME:
    2925             :                                     if (!new->is_stacked)
    2926             :                                         ereport(ERROR,
    2927             :                                                 (errcode(ERRCODE_SYNTAX_ERROR),
    2928             :                                                  errmsg("diagnostics item %s is not allowed in GET CURRENT DIAGNOSTICS",
    2929             :                                                         plpgsql_getdiag_kindname(ditem->kind)),
    2930             :                                                  parser_errposition((yylsp[-4]))));
    2931             :                                     break;
    2932             :                                 /* these fields are allowed in either case */
    2933             :                                 case PLPGSQL_GETDIAG_CONTEXT:
    2934             :                                     break;
    2935             :                                 default:
    2936             :                                     elog(ERROR, "unrecognized diagnostic item kind: %d",
    2937             :                                          ditem->kind);
    2938             :                                     break;
    2939             :                             }
    2940             :                         }
    2941             : 
    2942             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    2943             :                     }
    2944             : #line 2945 "pl_gram.c"
    2945         136 :     break;
    2946             : 
    2947         114 :   case 90: /* getdiag_area_opt: %empty  */
    2948             : #line 1077 "pl_gram.y"
    2949             :                                         {
    2950             :                         (yyval.boolean) = false;
    2951             :                     }
    2952             : #line 2953 "pl_gram.c"
    2953         114 :     break;
    2954             : 
    2955           0 :   case 91: /* getdiag_area_opt: K_CURRENT  */
    2956             : #line 1081 "pl_gram.y"
    2957             :                                         {
    2958             :                         (yyval.boolean) = false;
    2959             :                     }
    2960             : #line 2961 "pl_gram.c"
    2961           0 :     break;
    2962             : 
    2963          28 :   case 92: /* getdiag_area_opt: K_STACKED  */
    2964             : #line 1085 "pl_gram.y"
    2965             :                                         {
    2966             :                         (yyval.boolean) = true;
    2967             :                     }
    2968             : #line 2969 "pl_gram.c"
    2969          28 :     break;
    2970             : 
    2971          76 :   case 93: /* getdiag_list: getdiag_list ',' getdiag_list_item  */
    2972             : #line 1091 "pl_gram.y"
    2973             :                                         {
    2974             :                         (yyval.list) = lappend((yyvsp[-2].list), (yyvsp[0].diagitem));
    2975             :                     }
    2976             : #line 2977 "pl_gram.c"
    2977          76 :     break;
    2978             : 
    2979         136 :   case 94: /* getdiag_list: getdiag_list_item  */
    2980             : #line 1095 "pl_gram.y"
    2981             :                                         {
    2982             :                         (yyval.list) = list_make1((yyvsp[0].diagitem));
    2983             :                     }
    2984             : #line 2985 "pl_gram.c"
    2985         136 :     break;
    2986             : 
    2987         212 :   case 95: /* getdiag_list_item: getdiag_target assign_operator getdiag_item  */
    2988             : #line 1101 "pl_gram.y"
    2989             :                                         {
    2990             :                         PLpgSQL_diag_item *new;
    2991             : 
    2992             :                         new = palloc(sizeof(PLpgSQL_diag_item));
    2993             :                         new->target = (yyvsp[-2].datum)->dno;
    2994             :                         new->kind = (yyvsp[0].ival);
    2995             : 
    2996             :                         (yyval.diagitem) = new;
    2997             :                     }
    2998             : #line 2999 "pl_gram.c"
    2999         212 :     break;
    3000             : 
    3001         212 :   case 96: /* getdiag_item: %empty  */
    3002             : #line 1113 "pl_gram.y"
    3003             :                                         {
    3004             :                         int         tok = yylex(&yylval, &yylloc, yyscanner);
    3005             : 
    3006             :                         if (tok_is_keyword(tok, &yylval,
    3007             :                                            K_ROW_COUNT, "row_count"))
    3008             :                             (yyval.ival) = PLPGSQL_GETDIAG_ROW_COUNT;
    3009             :                         else if (tok_is_keyword(tok, &yylval,
    3010             :                                                 K_PG_ROUTINE_OID, "pg_routine_oid"))
    3011             :                             (yyval.ival) = PLPGSQL_GETDIAG_ROUTINE_OID;
    3012             :                         else if (tok_is_keyword(tok, &yylval,
    3013             :                                                 K_PG_CONTEXT, "pg_context"))
    3014             :                             (yyval.ival) = PLPGSQL_GETDIAG_CONTEXT;
    3015             :                         else if (tok_is_keyword(tok, &yylval,
    3016             :                                                 K_PG_EXCEPTION_DETAIL, "pg_exception_detail"))
    3017             :                             (yyval.ival) = PLPGSQL_GETDIAG_ERROR_DETAIL;
    3018             :                         else if (tok_is_keyword(tok, &yylval,
    3019             :                                                 K_PG_EXCEPTION_HINT, "pg_exception_hint"))
    3020             :                             (yyval.ival) = PLPGSQL_GETDIAG_ERROR_HINT;
    3021             :                         else if (tok_is_keyword(tok, &yylval,
    3022             :                                                 K_PG_EXCEPTION_CONTEXT, "pg_exception_context"))
    3023             :                             (yyval.ival) = PLPGSQL_GETDIAG_ERROR_CONTEXT;
    3024             :                         else if (tok_is_keyword(tok, &yylval,
    3025             :                                                 K_COLUMN_NAME, "column_name"))
    3026             :                             (yyval.ival) = PLPGSQL_GETDIAG_COLUMN_NAME;
    3027             :                         else if (tok_is_keyword(tok, &yylval,
    3028             :                                                 K_CONSTRAINT_NAME, "constraint_name"))
    3029             :                             (yyval.ival) = PLPGSQL_GETDIAG_CONSTRAINT_NAME;
    3030             :                         else if (tok_is_keyword(tok, &yylval,
    3031             :                                                 K_PG_DATATYPE_NAME, "pg_datatype_name"))
    3032             :                             (yyval.ival) = PLPGSQL_GETDIAG_DATATYPE_NAME;
    3033             :                         else if (tok_is_keyword(tok, &yylval,
    3034             :                                                 K_MESSAGE_TEXT, "message_text"))
    3035             :                             (yyval.ival) = PLPGSQL_GETDIAG_MESSAGE_TEXT;
    3036             :                         else if (tok_is_keyword(tok, &yylval,
    3037             :                                                 K_TABLE_NAME, "table_name"))
    3038             :                             (yyval.ival) = PLPGSQL_GETDIAG_TABLE_NAME;
    3039             :                         else if (tok_is_keyword(tok, &yylval,
    3040             :                                                 K_SCHEMA_NAME, "schema_name"))
    3041             :                             (yyval.ival) = PLPGSQL_GETDIAG_SCHEMA_NAME;
    3042             :                         else if (tok_is_keyword(tok, &yylval,
    3043             :                                                 K_RETURNED_SQLSTATE, "returned_sqlstate"))
    3044             :                             (yyval.ival) = PLPGSQL_GETDIAG_RETURNED_SQLSTATE;
    3045             :                         else
    3046             :                             yyerror(&yylloc, NULL, yyscanner, "unrecognized GET DIAGNOSTICS item");
    3047             :                     }
    3048             : #line 3049 "pl_gram.c"
    3049         212 :     break;
    3050             : 
    3051         218 :   case 97: /* getdiag_target: T_DATUM  */
    3052             : #line 1161 "pl_gram.y"
    3053             :                                         {
    3054             :                         /*
    3055             :                          * In principle we should support a getdiag_target
    3056             :                          * that is an array element, but for now we don't, so
    3057             :                          * just throw an error if next token is '['.
    3058             :                          */
    3059             :                         if ((yyvsp[0].wdatum).datum->dtype == PLPGSQL_DTYPE_ROW ||
    3060             :                             (yyvsp[0].wdatum).datum->dtype == PLPGSQL_DTYPE_REC ||
    3061             :                             plpgsql_peek(yyscanner) == '[')
    3062             :                             ereport(ERROR,
    3063             :                                     (errcode(ERRCODE_SYNTAX_ERROR),
    3064             :                                      errmsg("\"%s\" is not a scalar variable",
    3065             :                                             NameOfDatum(&((yyvsp[0].wdatum)))),
    3066             :                                      parser_errposition((yylsp[0]))));
    3067             :                         check_assignable((yyvsp[0].wdatum).datum, (yylsp[0]), yyscanner);
    3068             :                         (yyval.datum) = (yyvsp[0].wdatum).datum;
    3069             :                     }
    3070             : #line 3071 "pl_gram.c"
    3071         212 :     break;
    3072             : 
    3073           0 :   case 98: /* getdiag_target: T_WORD  */
    3074             : #line 1179 "pl_gram.y"
    3075             :                                         {
    3076             :                         /* just to give a better message than "syntax error" */
    3077             :                         word_is_not_variable(&((yyvsp[0].word)), (yylsp[0]), yyscanner);
    3078             :                     }
    3079             : #line 3080 "pl_gram.c"
    3080           0 :     break;
    3081             : 
    3082           0 :   case 99: /* getdiag_target: T_CWORD  */
    3083             : #line 1184 "pl_gram.y"
    3084             :                                         {
    3085             :                         /* just to give a better message than "syntax error" */
    3086             :                         cword_is_not_variable(&((yyvsp[0].cword)), (yylsp[0]), yyscanner);
    3087             :                     }
    3088             : #line 3089 "pl_gram.c"
    3089           0 :     break;
    3090             : 
    3091        5916 :   case 100: /* stmt_if: K_IF expr_until_then proc_sect stmt_elsifs stmt_else K_END K_IF ';'  */
    3092             : #line 1191 "pl_gram.y"
    3093             :                                         {
    3094             :                         PLpgSQL_stmt_if *new;
    3095             : 
    3096             :                         new = palloc0(sizeof(PLpgSQL_stmt_if));
    3097             :                         new->cmd_type = PLPGSQL_STMT_IF;
    3098             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-7]), yyscanner);
    3099             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    3100             :                         new->cond = (yyvsp[-6].expr);
    3101             :                         new->then_body = (yyvsp[-5].list);
    3102             :                         new->elsif_list = (yyvsp[-4].list);
    3103             :                         new->else_body = (yyvsp[-3].list);
    3104             : 
    3105             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    3106             :                     }
    3107             : #line 3108 "pl_gram.c"
    3108        5916 :     break;
    3109             : 
    3110        5916 :   case 101: /* stmt_elsifs: %empty  */
    3111             : #line 1208 "pl_gram.y"
    3112             :                                         {
    3113             :                         (yyval.list) = NIL;
    3114             :                     }
    3115             : #line 3116 "pl_gram.c"
    3116        5916 :     break;
    3117             : 
    3118        1130 :   case 102: /* stmt_elsifs: stmt_elsifs K_ELSIF expr_until_then proc_sect  */
    3119             : #line 1212 "pl_gram.y"
    3120             :                                         {
    3121             :                         PLpgSQL_if_elsif *new;
    3122             : 
    3123             :                         new = palloc0(sizeof(PLpgSQL_if_elsif));
    3124             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-2]), yyscanner);
    3125             :                         new->cond = (yyvsp[-1].expr);
    3126             :                         new->stmts = (yyvsp[0].list);
    3127             : 
    3128             :                         (yyval.list) = lappend((yyvsp[-3].list), new);
    3129             :                     }
    3130             : #line 3131 "pl_gram.c"
    3131        1130 :     break;
    3132             : 
    3133        4898 :   case 103: /* stmt_else: %empty  */
    3134             : #line 1225 "pl_gram.y"
    3135             :                                         {
    3136             :                         (yyval.list) = NIL;
    3137             :                     }
    3138             : #line 3139 "pl_gram.c"
    3139        4898 :     break;
    3140             : 
    3141        1018 :   case 104: /* stmt_else: K_ELSE proc_sect  */
    3142             : #line 1229 "pl_gram.y"
    3143             :                                         {
    3144             :                         (yyval.list) = (yyvsp[0].list);
    3145             :                     }
    3146             : #line 3147 "pl_gram.c"
    3147        1018 :     break;
    3148             : 
    3149          18 :   case 105: /* stmt_case: K_CASE opt_expr_until_when case_when_list opt_case_else K_END K_CASE ';'  */
    3150             : #line 1235 "pl_gram.y"
    3151             :                                         {
    3152             :                         (yyval.stmt) = make_case((yylsp[-6]), (yyvsp[-5].expr), (yyvsp[-4].list), (yyvsp[-3].list), yyscanner);
    3153             :                     }
    3154             : #line 3155 "pl_gram.c"
    3155          18 :     break;
    3156             : 
    3157          18 :   case 106: /* opt_expr_until_when: %empty  */
    3158             : #line 1241 "pl_gram.y"
    3159             :                                         {
    3160             :                         PLpgSQL_expr *expr = NULL;
    3161             :                         int         tok = yylex(&yylval, &yylloc, yyscanner);
    3162             : 
    3163             :                         if (tok != K_WHEN)
    3164             :                         {
    3165             :                             plpgsql_push_back_token(tok, &yylval, &yylloc, yyscanner);
    3166             :                             expr = read_sql_expression(K_WHEN, "WHEN", &yylval, &yylloc, yyscanner);
    3167             :                         }
    3168             :                         plpgsql_push_back_token(K_WHEN, &yylval, &yylloc, yyscanner);
    3169             :                         (yyval.expr) = expr;
    3170             :                     }
    3171             : #line 3172 "pl_gram.c"
    3172          18 :     break;
    3173             : 
    3174          22 :   case 107: /* case_when_list: case_when_list case_when  */
    3175             : #line 1256 "pl_gram.y"
    3176             :                                         {
    3177             :                         (yyval.list) = lappend((yyvsp[-1].list), (yyvsp[0].casewhen));
    3178             :                     }
    3179             : #line 3180 "pl_gram.c"
    3180          22 :     break;
    3181             : 
    3182          18 :   case 108: /* case_when_list: case_when  */
    3183             : #line 1260 "pl_gram.y"
    3184             :                                         {
    3185             :                         (yyval.list) = list_make1((yyvsp[0].casewhen));
    3186             :                     }
    3187             : #line 3188 "pl_gram.c"
    3188          18 :     break;
    3189             : 
    3190          40 :   case 109: /* case_when: K_WHEN expr_until_then proc_sect  */
    3191             : #line 1266 "pl_gram.y"
    3192             :                                         {
    3193             :                         PLpgSQL_case_when *new = palloc(sizeof(PLpgSQL_case_when));
    3194             : 
    3195             :                         new->lineno  = plpgsql_location_to_lineno((yylsp[-2]), yyscanner);
    3196             :                         new->expr = (yyvsp[-1].expr);
    3197             :                         new->stmts = (yyvsp[0].list);
    3198             :                         (yyval.casewhen) = new;
    3199             :                     }
    3200             : #line 3201 "pl_gram.c"
    3201          40 :     break;
    3202             : 
    3203          14 :   case 110: /* opt_case_else: %empty  */
    3204             : #line 1277 "pl_gram.y"
    3205             :                                         {
    3206             :                         (yyval.list) = NIL;
    3207             :                     }
    3208             : #line 3209 "pl_gram.c"
    3209          14 :     break;
    3210             : 
    3211           4 :   case 111: /* opt_case_else: K_ELSE proc_sect  */
    3212             : #line 1281 "pl_gram.y"
    3213             :                                         {
    3214             :                         /*
    3215             :                          * proc_sect could return an empty list, but we
    3216             :                          * must distinguish that from not having ELSE at all.
    3217             :                          * Simplest fix is to return a list with one NULL
    3218             :                          * pointer, which make_case() must take care of.
    3219             :                          */
    3220             :                         if ((yyvsp[0].list) != NIL)
    3221             :                             (yyval.list) = (yyvsp[0].list);
    3222             :                         else
    3223             :                             (yyval.list) = list_make1(NULL);
    3224             :                     }
    3225             : #line 3226 "pl_gram.c"
    3226           4 :     break;
    3227             : 
    3228          76 :   case 112: /* stmt_loop: opt_loop_label K_LOOP loop_body  */
    3229             : #line 1296 "pl_gram.y"
    3230             :                                         {
    3231             :                         PLpgSQL_stmt_loop *new;
    3232             : 
    3233             :                         new = palloc0(sizeof(PLpgSQL_stmt_loop));
    3234             :                         new->cmd_type = PLPGSQL_STMT_LOOP;
    3235             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-1]), yyscanner);
    3236             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    3237             :                         new->label = (yyvsp[-2].str);
    3238             :                         new->body = (yyvsp[0].loop_body).stmts;
    3239             : 
    3240             :                         check_labels((yyvsp[-2].str), (yyvsp[0].loop_body).end_label, (yyvsp[0].loop_body).end_label_location, yyscanner);
    3241             :                         plpgsql_ns_pop();
    3242             : 
    3243             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    3244             :                     }
    3245             : #line 3246 "pl_gram.c"
    3246          76 :     break;
    3247             : 
    3248          80 :   case 113: /* stmt_while: opt_loop_label K_WHILE expr_until_loop loop_body  */
    3249             : #line 1314 "pl_gram.y"
    3250             :                                         {
    3251             :                         PLpgSQL_stmt_while *new;
    3252             : 
    3253             :                         new = palloc0(sizeof(PLpgSQL_stmt_while));
    3254             :                         new->cmd_type = PLPGSQL_STMT_WHILE;
    3255             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-2]), yyscanner);
    3256             :                         new->stmtid  = ++plpgsql_curr_compile->nstatements;
    3257             :                         new->label = (yyvsp[-3].str);
    3258             :                         new->cond = (yyvsp[-1].expr);
    3259             :                         new->body = (yyvsp[0].loop_body).stmts;
    3260             : 
    3261             :                         check_labels((yyvsp[-3].str), (yyvsp[0].loop_body).end_label, (yyvsp[0].loop_body).end_label_location, yyscanner);
    3262             :                         plpgsql_ns_pop();
    3263             : 
    3264             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    3265             :                     }
    3266             : #line 3267 "pl_gram.c"
    3267          80 :     break;
    3268             : 
    3269        1524 :   case 114: /* stmt_for: opt_loop_label K_FOR for_control loop_body  */
    3270             : #line 1333 "pl_gram.y"
    3271             :                                         {
    3272             :                         /* This runs after we've scanned the loop body */
    3273             :                         if ((yyvsp[-1].stmt)->cmd_type == PLPGSQL_STMT_FORI)
    3274             :                         {
    3275             :                             PLpgSQL_stmt_fori *new;
    3276             : 
    3277             :                             new = (PLpgSQL_stmt_fori *) (yyvsp[-1].stmt);
    3278             :                             new->lineno = plpgsql_location_to_lineno((yylsp[-2]), yyscanner);
    3279             :                             new->label = (yyvsp[-3].str);
    3280             :                             new->body = (yyvsp[0].loop_body).stmts;
    3281             :                             (yyval.stmt) = (PLpgSQL_stmt *) new;
    3282             :                         }
    3283             :                         else
    3284             :                         {
    3285             :                             PLpgSQL_stmt_forq *new;
    3286             : 
    3287             :                             Assert((yyvsp[-1].stmt)->cmd_type == PLPGSQL_STMT_FORS ||
    3288             :                                    (yyvsp[-1].stmt)->cmd_type == PLPGSQL_STMT_FORC ||
    3289             :                                    (yyvsp[-1].stmt)->cmd_type == PLPGSQL_STMT_DYNFORS);
    3290             :                             /* forq is the common supertype of all three */
    3291             :                             new = (PLpgSQL_stmt_forq *) (yyvsp[-1].stmt);
    3292             :                             new->lineno = plpgsql_location_to_lineno((yylsp[-2]), yyscanner);
    3293             :                             new->label = (yyvsp[-3].str);
    3294             :                             new->body = (yyvsp[0].loop_body).stmts;
    3295             :                             (yyval.stmt) = (PLpgSQL_stmt *) new;
    3296             :                         }
    3297             : 
    3298             :                         check_labels((yyvsp[-3].str), (yyvsp[0].loop_body).end_label, (yyvsp[0].loop_body).end_label_location, yyscanner);
    3299             :                         /* close namespace started in opt_loop_label */
    3300             :                         plpgsql_ns_pop();
    3301             :                     }
    3302             : #line 3303 "pl_gram.c"
    3303        1518 :     break;
    3304             : 
    3305        1536 :   case 115: /* for_control: for_variable K_IN  */
    3306             : #line 1367 "pl_gram.y"
    3307             :                                         {
    3308             :                         int         tok = yylex(&yylval, &yylloc, yyscanner);
    3309             :                         int         tokloc = yylloc;
    3310             : 
    3311             :                         if (tok_is_keyword(tok, &yylval,
    3312             :                                            K_EXECUTE, "execute"))
    3313             :                         {
    3314             :                             /* EXECUTE means it's a dynamic FOR loop */
    3315             :                             PLpgSQL_stmt_dynfors *new;
    3316             :                             PLpgSQL_expr *expr;
    3317             :                             int         term;
    3318             : 
    3319             :                             expr = read_sql_expression2(K_LOOP, K_USING,
    3320             :                                                         "LOOP or USING",
    3321             :                                                         &term, &yylval, &yylloc, yyscanner);
    3322             : 
    3323             :                             new = palloc0(sizeof(PLpgSQL_stmt_dynfors));
    3324             :                             new->cmd_type = PLPGSQL_STMT_DYNFORS;
    3325             :                             new->stmtid = ++plpgsql_curr_compile->nstatements;
    3326             :                             if ((yyvsp[-1].forvariable).row)
    3327             :                             {
    3328             :                                 new->var = (PLpgSQL_variable *) (yyvsp[-1].forvariable).row;
    3329             :                                 check_assignable((yyvsp[-1].forvariable).row, (yylsp[-1]), yyscanner);
    3330             :                             }
    3331             :                             else if ((yyvsp[-1].forvariable).scalar)
    3332             :                             {
    3333             :                                 /* convert single scalar to list */
    3334             :                                 new->var = (PLpgSQL_variable *)
    3335             :                                     make_scalar_list1((yyvsp[-1].forvariable).name, (yyvsp[-1].forvariable).scalar,
    3336             :                                                       (yyvsp[-1].forvariable).lineno, (yylsp[-1]), yyscanner);
    3337             :                                 /* make_scalar_list1 did check_assignable */
    3338             :                             }
    3339             :                             else
    3340             :                             {
    3341             :                                 ereport(ERROR,
    3342             :                                         (errcode(ERRCODE_DATATYPE_MISMATCH),
    3343             :                                          errmsg("loop variable of loop over rows must be a record variable or list of scalar variables"),
    3344             :                                          parser_errposition((yylsp[-1]))));
    3345             :                             }
    3346             :                             new->query = expr;
    3347             : 
    3348             :                             if (term == K_USING)
    3349             :                             {
    3350             :                                 do
    3351             :                                 {
    3352             :                                     expr = read_sql_expression2(',', K_LOOP,
    3353             :                                                                 ", or LOOP",
    3354             :                                                                 &term, &yylval, &yylloc, yyscanner);
    3355             :                                     new->params = lappend(new->params, expr);
    3356             :                                 } while (term == ',');
    3357             :                             }
    3358             : 
    3359             :                             (yyval.stmt) = (PLpgSQL_stmt *) new;
    3360             :                         }
    3361             :                         else if (tok == T_DATUM &&
    3362             :                                  yylval.wdatum.datum->dtype == PLPGSQL_DTYPE_VAR &&
    3363             :                                  ((PLpgSQL_var *) yylval.wdatum.datum)->datatype->typoid == REFCURSOROID)
    3364             :                         {
    3365             :                             /* It's FOR var IN cursor */
    3366             :                             PLpgSQL_stmt_forc *new;
    3367             :                             PLpgSQL_var *cursor = (PLpgSQL_var *) yylval.wdatum.datum;
    3368             : 
    3369             :                             new = (PLpgSQL_stmt_forc *) palloc0(sizeof(PLpgSQL_stmt_forc));
    3370             :                             new->cmd_type = PLPGSQL_STMT_FORC;
    3371             :                             new->stmtid = ++plpgsql_curr_compile->nstatements;
    3372             :                             new->curvar = cursor->dno;
    3373             : 
    3374             :                             /* Should have had a single variable name */
    3375             :                             if ((yyvsp[-1].forvariable).scalar && (yyvsp[-1].forvariable).row)
    3376             :                                 ereport(ERROR,
    3377             :                                         (errcode(ERRCODE_SYNTAX_ERROR),
    3378             :                                          errmsg("cursor FOR loop must have only one target variable"),
    3379             :                                          parser_errposition((yylsp[-1]))));
    3380             : 
    3381             :                             /* can't use an unbound cursor this way */
    3382             :                             if (cursor->cursor_explicit_expr == NULL)
    3383             :                                 ereport(ERROR,
    3384             :                                         (errcode(ERRCODE_SYNTAX_ERROR),
    3385             :                                          errmsg("cursor FOR loop must use a bound cursor variable"),
    3386             :                                          parser_errposition(tokloc)));
    3387             : 
    3388             :                             /* collect cursor's parameters if any */
    3389             :                             new->argquery = read_cursor_args(cursor, K_LOOP, &yylval, &yylloc, yyscanner);
    3390             : 
    3391             :                             /* create loop's private RECORD variable */
    3392             :                             new->var = (PLpgSQL_variable *)
    3393             :                                 plpgsql_build_record((yyvsp[-1].forvariable).name,
    3394             :                                                      (yyvsp[-1].forvariable).lineno,
    3395             :                                                      NULL,
    3396             :                                                      RECORDOID,
    3397             :                                                      true);
    3398             : 
    3399             :                             (yyval.stmt) = (PLpgSQL_stmt *) new;
    3400             :                         }
    3401             :                         else
    3402             :                         {
    3403             :                             PLpgSQL_expr *expr1;
    3404             :                             int         expr1loc;
    3405             :                             bool        reverse = false;
    3406             : 
    3407             :                             /*
    3408             :                              * We have to distinguish between two
    3409             :                              * alternatives: FOR var IN a .. b and FOR
    3410             :                              * var IN query. Unfortunately this is
    3411             :                              * tricky, since the query in the second
    3412             :                              * form needn't start with a SELECT
    3413             :                              * keyword.  We use the ugly hack of
    3414             :                              * looking for two periods after the first
    3415             :                              * token. We also check for the REVERSE
    3416             :                              * keyword, which means it must be an
    3417             :                              * integer loop.
    3418             :                              */
    3419             :                             if (tok_is_keyword(tok, &yylval,
    3420             :                                                K_REVERSE, "reverse"))
    3421             :                                 reverse = true;
    3422             :                             else
    3423             :                                 plpgsql_push_back_token(tok, &yylval, &yylloc, yyscanner);
    3424             : 
    3425             :                             /*
    3426             :                              * Read tokens until we see either a ".."
    3427             :                              * or a LOOP.  The text we read may be either
    3428             :                              * an expression or a whole SQL statement, so
    3429             :                              * we need to invoke read_sql_construct directly,
    3430             :                              * and tell it not to check syntax yet.
    3431             :                              */
    3432             :                             expr1 = read_sql_construct(DOT_DOT,
    3433             :                                                        K_LOOP,
    3434             :                                                        0,
    3435             :                                                        "LOOP",
    3436             :                                                        RAW_PARSE_DEFAULT,
    3437             :                                                        true,
    3438             :                                                        false,
    3439             :                                                        &expr1loc,
    3440             :                                                        &tok,
    3441             :                                                        &yylval, &yylloc, yyscanner);
    3442             : 
    3443             :                             if (tok == DOT_DOT)
    3444             :                             {
    3445             :                                 /* Saw "..", so it must be an integer loop */
    3446             :                                 PLpgSQL_expr *expr2;
    3447             :                                 PLpgSQL_expr *expr_by;
    3448             :                                 PLpgSQL_var *fvar;
    3449             :                                 PLpgSQL_stmt_fori *new;
    3450             : 
    3451             :                                 /*
    3452             :                                  * Relabel first expression as an expression;
    3453             :                                  * then we can check its syntax.
    3454             :                                  */
    3455             :                                 expr1->parseMode = RAW_PARSE_PLPGSQL_EXPR;
    3456             :                                 check_sql_expr(expr1->query, expr1->parseMode,
    3457             :                                                expr1loc, yyscanner);
    3458             : 
    3459             :                                 /* Read and check the second one */
    3460             :                                 expr2 = read_sql_expression2(K_LOOP, K_BY,
    3461             :                                                              "LOOP",
    3462             :                                                              &tok, &yylval, &yylloc, yyscanner);
    3463             : 
    3464             :                                 /* Get the BY clause if any */
    3465             :                                 if (tok == K_BY)
    3466             :                                     expr_by = read_sql_expression(K_LOOP,
    3467             :                                                                   "LOOP", &yylval, &yylloc, yyscanner);
    3468             :                                 else
    3469             :                                     expr_by = NULL;
    3470             : 
    3471             :                                 /* Should have had a single variable name */
    3472             :                                 if ((yyvsp[-1].forvariable).scalar && (yyvsp[-1].forvariable).row)
    3473             :                                     ereport(ERROR,
    3474             :                                             (errcode(ERRCODE_SYNTAX_ERROR),
    3475             :                                              errmsg("integer FOR loop must have only one target variable"),
    3476             :                                              parser_errposition((yylsp[-1]))));
    3477             : 
    3478             :                                 /* create loop's private variable */
    3479             :                                 fvar = (PLpgSQL_var *)
    3480             :                                     plpgsql_build_variable((yyvsp[-1].forvariable).name,
    3481             :                                                            (yyvsp[-1].forvariable).lineno,
    3482             :                                                            plpgsql_build_datatype(INT4OID,
    3483             :                                                                                   -1,
    3484             :                                                                                   InvalidOid,
    3485             :                                                                                   NULL),
    3486             :                                                            true);
    3487             : 
    3488             :                                 new = palloc0(sizeof(PLpgSQL_stmt_fori));
    3489             :                                 new->cmd_type = PLPGSQL_STMT_FORI;
    3490             :                                 new->stmtid  = ++plpgsql_curr_compile->nstatements;
    3491             :                                 new->var = fvar;
    3492             :                                 new->reverse = reverse;
    3493             :                                 new->lower = expr1;
    3494             :                                 new->upper = expr2;
    3495             :                                 new->step = expr_by;
    3496             : 
    3497             :                                 (yyval.stmt) = (PLpgSQL_stmt *) new;
    3498             :                             }
    3499             :                             else
    3500             :                             {
    3501             :                                 /*
    3502             :                                  * No "..", so it must be a query loop.
    3503             :                                  */
    3504             :                                 PLpgSQL_stmt_fors *new;
    3505             : 
    3506             :                                 if (reverse)
    3507             :                                     ereport(ERROR,
    3508             :                                             (errcode(ERRCODE_SYNTAX_ERROR),
    3509             :                                              errmsg("cannot specify REVERSE in query FOR loop"),
    3510             :                                              parser_errposition(tokloc)));
    3511             : 
    3512             :                                 /* Check syntax as a regular query */
    3513             :                                 check_sql_expr(expr1->query, expr1->parseMode,
    3514             :                                                expr1loc, yyscanner);
    3515             : 
    3516             :                                 new = palloc0(sizeof(PLpgSQL_stmt_fors));
    3517             :                                 new->cmd_type = PLPGSQL_STMT_FORS;
    3518             :                                 new->stmtid = ++plpgsql_curr_compile->nstatements;
    3519             :                                 if ((yyvsp[-1].forvariable).row)
    3520             :                                 {
    3521             :                                     new->var = (PLpgSQL_variable *) (yyvsp[-1].forvariable).row;
    3522             :                                     check_assignable((yyvsp[-1].forvariable).row, (yylsp[-1]), yyscanner);
    3523             :                                 }
    3524             :                                 else if ((yyvsp[-1].forvariable).scalar)
    3525             :                                 {
    3526             :                                     /* convert single scalar to list */
    3527             :                                     new->var = (PLpgSQL_variable *)
    3528             :                                         make_scalar_list1((yyvsp[-1].forvariable).name, (yyvsp[-1].forvariable).scalar,
    3529             :                                                           (yyvsp[-1].forvariable).lineno, (yylsp[-1]), yyscanner);
    3530             :                                     /* make_scalar_list1 did check_assignable */
    3531             :                                 }
    3532             :                                 else
    3533             :                                 {
    3534             :                                     ereport(ERROR,
    3535             :                                             (errcode(ERRCODE_SYNTAX_ERROR),
    3536             :                                              errmsg("loop variable of loop over rows must be a record variable or list of scalar variables"),
    3537             :                                              parser_errposition((yylsp[-1]))));
    3538             :                                 }
    3539             : 
    3540             :                                 new->query = expr1;
    3541             :                                 (yyval.stmt) = (PLpgSQL_stmt *) new;
    3542             :                             }
    3543             :                         }
    3544             :                     }
    3545             : #line 3546 "pl_gram.c"
    3546        1524 :     break;
    3547             : 
    3548         740 :   case 116: /* for_variable: T_DATUM  */
    3549             : #line 1626 "pl_gram.y"
    3550             :                                         {
    3551             :                         (yyval.forvariable).name = NameOfDatum(&((yyvsp[0].wdatum)));
    3552             :                         (yyval.forvariable).lineno = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    3553             :                         if ((yyvsp[0].wdatum).datum->dtype == PLPGSQL_DTYPE_ROW ||
    3554             :                             (yyvsp[0].wdatum).datum->dtype == PLPGSQL_DTYPE_REC)
    3555             :                         {
    3556             :                             (yyval.forvariable).scalar = NULL;
    3557             :                             (yyval.forvariable).row = (yyvsp[0].wdatum).datum;
    3558             :                         }
    3559             :                         else
    3560             :                         {
    3561             :                             int         tok;
    3562             : 
    3563             :                             (yyval.forvariable).scalar = (yyvsp[0].wdatum).datum;
    3564             :                             (yyval.forvariable).row = NULL;
    3565             :                             /* check for comma-separated list */
    3566             :                             tok = yylex(&yylval, &yylloc, yyscanner);
    3567             :                             plpgsql_push_back_token(tok, &yylval, &yylloc, yyscanner);
    3568             :                             if (tok == ',')
    3569             :                                 (yyval.forvariable).row = (PLpgSQL_datum *)
    3570             :                                     read_into_scalar_list((yyval.forvariable).name,
    3571             :                                                           (yyval.forvariable).scalar,
    3572             :                                                           (yylsp[0]),
    3573             :                                                           &yylval, &yylloc,
    3574             :                                                           yyscanner);
    3575             :                         }
    3576             :                     }
    3577             : #line 3578 "pl_gram.c"
    3578         736 :     break;
    3579             : 
    3580         864 :   case 117: /* for_variable: T_WORD  */
    3581             : #line 1654 "pl_gram.y"
    3582             :                                         {
    3583             :                         int         tok;
    3584             : 
    3585             :                         (yyval.forvariable).name = (yyvsp[0].word).ident;
    3586             :                         (yyval.forvariable).lineno = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    3587             :                         (yyval.forvariable).scalar = NULL;
    3588             :                         (yyval.forvariable).row = NULL;
    3589             :                         /* check for comma-separated list */
    3590             :                         tok = yylex(&yylval, &yylloc, yyscanner);
    3591             :                         plpgsql_push_back_token(tok, &yylval, &yylloc, yyscanner);
    3592             :                         if (tok == ',')
    3593             :                             word_is_not_variable(&((yyvsp[0].word)), (yylsp[0]), yyscanner);
    3594             :                     }
    3595             : #line 3596 "pl_gram.c"
    3596         864 :     break;
    3597             : 
    3598           0 :   case 118: /* for_variable: T_CWORD  */
    3599             : #line 1668 "pl_gram.y"
    3600             :                                         {
    3601             :                         /* just to give a better message than "syntax error" */
    3602             :                         cword_is_not_variable(&((yyvsp[0].cword)), (yylsp[0]), yyscanner);
    3603             :                     }
    3604             : #line 3605 "pl_gram.c"
    3605           0 :     break;
    3606             : 
    3607          62 :   case 119: /* stmt_foreach_a: opt_loop_label K_FOREACH for_variable foreach_slice K_IN K_ARRAY expr_until_loop loop_body  */
    3608             : #line 1675 "pl_gram.y"
    3609             :                                         {
    3610             :                         PLpgSQL_stmt_foreach_a *new;
    3611             : 
    3612             :                         new = palloc0(sizeof(PLpgSQL_stmt_foreach_a));
    3613             :                         new->cmd_type = PLPGSQL_STMT_FOREACH_A;
    3614             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-6]), yyscanner);
    3615             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    3616             :                         new->label = (yyvsp[-7].str);
    3617             :                         new->slice = (yyvsp[-4].ival);
    3618             :                         new->expr = (yyvsp[-1].expr);
    3619             :                         new->body = (yyvsp[0].loop_body).stmts;
    3620             : 
    3621             :                         if ((yyvsp[-5].forvariable).row)
    3622             :                         {
    3623             :                             new->varno = (yyvsp[-5].forvariable).row->dno;
    3624             :                             check_assignable((yyvsp[-5].forvariable).row, (yylsp[-5]), yyscanner);
    3625             :                         }
    3626             :                         else if ((yyvsp[-5].forvariable).scalar)
    3627             :                         {
    3628             :                             new->varno = (yyvsp[-5].forvariable).scalar->dno;
    3629             :                             check_assignable((yyvsp[-5].forvariable).scalar, (yylsp[-5]), yyscanner);
    3630             :                         }
    3631             :                         else
    3632             :                         {
    3633             :                             ereport(ERROR,
    3634             :                                     (errcode(ERRCODE_SYNTAX_ERROR),
    3635             :                                      errmsg("loop variable of FOREACH must be a known variable or list of variables"),
    3636             :                                              parser_errposition((yylsp[-5]))));
    3637             :                         }
    3638             : 
    3639             :                         check_labels((yyvsp[-7].str), (yyvsp[0].loop_body).end_label, (yyvsp[0].loop_body).end_label_location, yyscanner);
    3640             :                         plpgsql_ns_pop();
    3641             : 
    3642             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    3643             :                     }
    3644             : #line 3645 "pl_gram.c"
    3645          62 :     break;
    3646             : 
    3647          32 :   case 120: /* foreach_slice: %empty  */
    3648             : #line 1713 "pl_gram.y"
    3649             :                                         {
    3650             :                         (yyval.ival) = 0;
    3651             :                     }
    3652             : #line 3653 "pl_gram.c"
    3653          32 :     break;
    3654             : 
    3655          30 :   case 121: /* foreach_slice: K_SLICE ICONST  */
    3656             : #line 1717 "pl_gram.y"
    3657             :                                         {
    3658             :                         (yyval.ival) = (yyvsp[0].ival);
    3659             :                     }
    3660             : #line 3661 "pl_gram.c"
    3661          30 :     break;
    3662             : 
    3663         184 :   case 122: /* stmt_exit: exit_type opt_label opt_exitcond  */
    3664             : #line 1723 "pl_gram.y"
    3665             :                                         {
    3666             :                         PLpgSQL_stmt_exit *new;
    3667             : 
    3668             :                         new = palloc0(sizeof(PLpgSQL_stmt_exit));
    3669             :                         new->cmd_type = PLPGSQL_STMT_EXIT;
    3670             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    3671             :                         new->is_exit = (yyvsp[-2].boolean);
    3672             :                         new->lineno  = plpgsql_location_to_lineno((yylsp[-2]), yyscanner);
    3673             :                         new->label = (yyvsp[-1].str);
    3674             :                         new->cond = (yyvsp[0].expr);
    3675             : 
    3676             :                         if ((yyvsp[-1].str))
    3677             :                         {
    3678             :                             /* We have a label, so verify it exists */
    3679             :                             PLpgSQL_nsitem *label;
    3680             : 
    3681             :                             label = plpgsql_ns_lookup_label(plpgsql_ns_top(), (yyvsp[-1].str));
    3682             :                             if (label == NULL)
    3683             :                                 ereport(ERROR,
    3684             :                                         (errcode(ERRCODE_SYNTAX_ERROR),
    3685             :                                          errmsg("there is no label \"%s\" "
    3686             :                                                 "attached to any block or loop enclosing this statement",
    3687             :                                                 (yyvsp[-1].str)),
    3688             :                                          parser_errposition((yylsp[-1]))));
    3689             :                             /* CONTINUE only allows loop labels */
    3690             :                             if (label->itemno != PLPGSQL_LABEL_LOOP && !new->is_exit)
    3691             :                                 ereport(ERROR,
    3692             :                                         (errcode(ERRCODE_SYNTAX_ERROR),
    3693             :                                          errmsg("block label \"%s\" cannot be used in CONTINUE",
    3694             :                                                 (yyvsp[-1].str)),
    3695             :                                          parser_errposition((yylsp[-1]))));
    3696             :                         }
    3697             :                         else
    3698             :                         {
    3699             :                             /*
    3700             :                              * No label, so make sure there is some loop (an
    3701             :                              * unlabeled EXIT does not match a block, so this
    3702             :                              * is the same test for both EXIT and CONTINUE)
    3703             :                              */
    3704             :                             if (plpgsql_ns_find_nearest_loop(plpgsql_ns_top()) == NULL)
    3705             :                                 ereport(ERROR,
    3706             :                                         (errcode(ERRCODE_SYNTAX_ERROR),
    3707             :                                          new->is_exit ?
    3708             :                                          errmsg("EXIT cannot be used outside a loop, unless it has a label") :
    3709             :                                          errmsg("CONTINUE cannot be used outside a loop"),
    3710             :                                          parser_errposition((yylsp[-2]))));
    3711             :                         }
    3712             : 
    3713             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    3714             :                     }
    3715             : #line 3716 "pl_gram.c"
    3716         174 :     break;
    3717             : 
    3718         112 :   case 123: /* exit_type: K_EXIT  */
    3719             : #line 1776 "pl_gram.y"
    3720             :                                         {
    3721             :                         (yyval.boolean) = true;
    3722             :                     }
    3723             : #line 3724 "pl_gram.c"
    3724         112 :     break;
    3725             : 
    3726          72 :   case 124: /* exit_type: K_CONTINUE  */
    3727             : #line 1780 "pl_gram.y"
    3728             :                                         {
    3729             :                         (yyval.boolean) = false;
    3730             :                     }
    3731             : #line 3732 "pl_gram.c"
    3732          72 :     break;
    3733             : 
    3734        8936 :   case 125: /* stmt_return: K_RETURN  */
    3735             : #line 1786 "pl_gram.y"
    3736             :                                         {
    3737             :                         int         tok;
    3738             : 
    3739             :                         tok = yylex(&yylval, &yylloc, yyscanner);
    3740             :                         if (tok == 0)
    3741             :                             yyerror(&yylloc, NULL, yyscanner, "unexpected end of function definition");
    3742             : 
    3743             :                         if (tok_is_keyword(tok, &yylval,
    3744             :                                            K_NEXT, "next"))
    3745             :                         {
    3746             :                             (yyval.stmt) = make_return_next_stmt((yylsp[0]), &yylval, &yylloc, yyscanner);
    3747             :                         }
    3748             :                         else if (tok_is_keyword(tok, &yylval,
    3749             :                                                 K_QUERY, "query"))
    3750             :                         {
    3751             :                             (yyval.stmt) = make_return_query_stmt((yylsp[0]), &yylval, &yylloc, yyscanner);
    3752             :                         }
    3753             :                         else
    3754             :                         {
    3755             :                             plpgsql_push_back_token(tok, &yylval, &yylloc, yyscanner);
    3756             :                             (yyval.stmt) = make_return_stmt((yylsp[0]), &yylval, &yylloc, yyscanner);
    3757             :                         }
    3758             :                     }
    3759             : #line 3760 "pl_gram.c"
    3760        8910 :     break;
    3761             : 
    3762        6716 :   case 126: /* stmt_raise: K_RAISE  */
    3763             : #line 1812 "pl_gram.y"
    3764             :                                         {
    3765             :                         PLpgSQL_stmt_raise *new;
    3766             :                         int         tok;
    3767             : 
    3768             :                         new = palloc(sizeof(PLpgSQL_stmt_raise));
    3769             : 
    3770             :                         new->cmd_type = PLPGSQL_STMT_RAISE;
    3771             :                         new->lineno = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    3772             :                         new->stmtid  = ++plpgsql_curr_compile->nstatements;
    3773             :                         new->elog_level = ERROR; /* default */
    3774             :                         new->condname = NULL;
    3775             :                         new->message = NULL;
    3776             :                         new->params = NIL;
    3777             :                         new->options = NIL;
    3778             : 
    3779             :                         tok = yylex(&yylval, &yylloc, yyscanner);
    3780             :                         if (tok == 0)
    3781             :                             yyerror(&yylloc, NULL, yyscanner, "unexpected end of function definition");
    3782             : 
    3783             :                         /*
    3784             :                          * We could have just RAISE, meaning to re-throw
    3785             :                          * the current error.
    3786             :                          */
    3787             :                         if (tok != ';')
    3788             :                         {
    3789             :                             /*
    3790             :                              * First is an optional elog severity level.
    3791             :                              */
    3792             :                             if (tok_is_keyword(tok, &yylval,
    3793             :                                                K_EXCEPTION, "exception"))
    3794             :                             {
    3795             :                                 new->elog_level = ERROR;
    3796             :                                 tok = yylex(&yylval, &yylloc, yyscanner);
    3797             :                             }
    3798             :                             else if (tok_is_keyword(tok, &yylval,
    3799             :                                                     K_WARNING, "warning"))
    3800             :                             {
    3801             :                                 new->elog_level = WARNING;
    3802             :                                 tok = yylex(&yylval, &yylloc, yyscanner);
    3803             :                             }
    3804             :                             else if (tok_is_keyword(tok, &yylval,
    3805             :                                                     K_NOTICE, "notice"))
    3806             :                             {
    3807             :                                 new->elog_level = NOTICE;
    3808             :                                 tok = yylex(&yylval, &yylloc, yyscanner);
    3809             :                             }
    3810             :                             else if (tok_is_keyword(tok, &yylval,
    3811             :                                                     K_INFO, "info"))
    3812             :                             {
    3813             :                                 new->elog_level = INFO;
    3814             :                                 tok = yylex(&yylval, &yylloc, yyscanner);
    3815             :                             }
    3816             :                             else if (tok_is_keyword(tok, &yylval,
    3817             :                                                     K_LOG, "log"))
    3818             :                             {
    3819             :                                 new->elog_level = LOG;
    3820             :                                 tok = yylex(&yylval, &yylloc, yyscanner);
    3821             :                             }
    3822             :                             else if (tok_is_keyword(tok, &yylval,
    3823             :                                                     K_DEBUG, "debug"))
    3824             :                             {
    3825             :                                 new->elog_level = DEBUG1;
    3826             :                                 tok = yylex(&yylval, &yylloc, yyscanner);
    3827             :                             }
    3828             :                             if (tok == 0)
    3829             :                                 yyerror(&yylloc, NULL, yyscanner, "unexpected end of function definition");
    3830             : 
    3831             :                             /*
    3832             :                              * Next we can have a condition name, or
    3833             :                              * equivalently SQLSTATE 'xxxxx', or a string
    3834             :                              * literal that is the old-style message format,
    3835             :                              * or USING to start the option list immediately.
    3836             :                              */
    3837             :                             if (tok == SCONST)
    3838             :                             {
    3839             :                                 /* old style message and parameters */
    3840             :                                 new->message = yylval.str;
    3841             :                                 /*
    3842             :                                  * We expect either a semi-colon, which
    3843             :                                  * indicates no parameters, or a comma that
    3844             :                                  * begins the list of parameter expressions,
    3845             :                                  * or USING to begin the options list.
    3846             :                                  */
    3847             :                                 tok = yylex(&yylval, &yylloc, yyscanner);
    3848             :                                 if (tok != ',' && tok != ';' && tok != K_USING)
    3849             :                                     yyerror(&yylloc, NULL, yyscanner, "syntax error");
    3850             : 
    3851             :                                 while (tok == ',')
    3852             :                                 {
    3853             :                                     PLpgSQL_expr *expr;
    3854             : 
    3855             :                                     expr = read_sql_construct(',', ';', K_USING,
    3856             :                                                               ", or ; or USING",
    3857             :                                                               RAW_PARSE_PLPGSQL_EXPR,
    3858             :                                                               true, true,
    3859             :                                                               NULL, &tok,
    3860             :                                                               &yylval, &yylloc, yyscanner);
    3861             :                                     new->params = lappend(new->params, expr);
    3862             :                                 }
    3863             :                             }
    3864             :                             else if (tok != K_USING)
    3865             :                             {
    3866             :                                 /* must be condition name or SQLSTATE */
    3867             :                                 if (tok_is_keyword(tok, &yylval,
    3868             :                                                    K_SQLSTATE, "sqlstate"))
    3869             :                                 {
    3870             :                                     /* next token should be a string literal */
    3871             :                                     char       *sqlstatestr;
    3872             : 
    3873             :                                     if (yylex(&yylval, &yylloc, yyscanner) != SCONST)
    3874             :                                         yyerror(&yylloc, NULL, yyscanner, "syntax error");
    3875             :                                     sqlstatestr = yylval.str;
    3876             : 
    3877             :                                     if (strlen(sqlstatestr) != 5)
    3878             :                                         yyerror(&yylloc, NULL, yyscanner, "invalid SQLSTATE code");
    3879             :                                     if (strspn(sqlstatestr, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") != 5)
    3880             :                                         yyerror(&yylloc, NULL, yyscanner, "invalid SQLSTATE code");
    3881             :                                     new->condname = sqlstatestr;
    3882             :                                 }
    3883             :                                 else
    3884             :                                 {
    3885             :                                     if (tok == T_WORD)
    3886             :                                         new->condname = yylval.word.ident;
    3887             :                                     else if (plpgsql_token_is_unreserved_keyword(tok))
    3888             :                                         new->condname = pstrdup(yylval.keyword);
    3889             :                                     else
    3890             :                                         yyerror(&yylloc, NULL, yyscanner, "syntax error");
    3891             :                                     plpgsql_recognize_err_condition(new->condname,
    3892             :                                                                     false);
    3893             :                                 }
    3894             :                                 tok = yylex(&yylval, &yylloc, yyscanner);
    3895             :                                 if (tok != ';' && tok != K_USING)
    3896             :                                     yyerror(&yylloc, NULL, yyscanner, "syntax error");
    3897             :                             }
    3898             : 
    3899             :                             if (tok == K_USING)
    3900             :                                 new->options = read_raise_options(&yylval, &yylloc, yyscanner);
    3901             :                         }
    3902             : 
    3903             :                         check_raise_parameters(new);
    3904             : 
    3905             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    3906             :                     }
    3907             : #line 3908 "pl_gram.c"
    3908        6704 :     break;
    3909             : 
    3910          54 :   case 127: /* stmt_assert: K_ASSERT  */
    3911             : #line 1958 "pl_gram.y"
    3912             :                                         {
    3913             :                         PLpgSQL_stmt_assert *new;
    3914             :                         int         tok;
    3915             : 
    3916             :                         new = palloc(sizeof(PLpgSQL_stmt_assert));
    3917             : 
    3918             :                         new->cmd_type = PLPGSQL_STMT_ASSERT;
    3919             :                         new->lineno = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    3920             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    3921             : 
    3922             :                         new->cond = read_sql_expression2(',', ';',
    3923             :                                                          ", or ;",
    3924             :                                                          &tok, &yylval, &yylloc, yyscanner);
    3925             : 
    3926             :                         if (tok == ',')
    3927             :                             new->message = read_sql_expression(';', ";", &yylval, &yylloc, yyscanner);
    3928             :                         else
    3929             :                             new->message = NULL;
    3930             : 
    3931             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    3932             :                     }
    3933             : #line 3934 "pl_gram.c"
    3934          54 :     break;
    3935             : 
    3936        1742 :   case 128: /* loop_body: proc_sect K_END K_LOOP opt_label ';'  */
    3937             : #line 1982 "pl_gram.y"
    3938             :                                         {
    3939             :                         (yyval.loop_body).stmts = (yyvsp[-4].list);
    3940             :                         (yyval.loop_body).end_label = (yyvsp[-1].str);
    3941             :                         (yyval.loop_body).end_label_location = (yylsp[-1]);
    3942             :                     }
    3943             : #line 3944 "pl_gram.c"
    3944        1742 :     break;
    3945             : 
    3946           0 :   case 129: /* stmt_execsql: K_IMPORT  */
    3947             : #line 2000 "pl_gram.y"
    3948             :                                         {
    3949             :                         (yyval.stmt) = make_execsql_stmt(K_IMPORT, (yylsp[0]), NULL, &yylval, &yylloc, yyscanner);
    3950             :                     }
    3951             : #line 3952 "pl_gram.c"
    3952           0 :     break;
    3953             : 
    3954         898 :   case 130: /* stmt_execsql: K_INSERT  */
    3955             : #line 2004 "pl_gram.y"
    3956             :                                         {
    3957             :                         (yyval.stmt) = make_execsql_stmt(K_INSERT, (yylsp[0]), NULL, &yylval, &yylloc, yyscanner);
    3958             :                     }
    3959             : #line 3960 "pl_gram.c"
    3960         898 :     break;
    3961             : 
    3962          54 :   case 131: /* stmt_execsql: K_MERGE  */
    3963             : #line 2008 "pl_gram.y"
    3964             :                                         {
    3965             :                         (yyval.stmt) = make_execsql_stmt(K_MERGE, (yylsp[0]), NULL, &yylval, &yylloc, yyscanner);
    3966             :                     }
    3967             : #line 3968 "pl_gram.c"
    3968          54 :     break;
    3969             : 
    3970        3192 :   case 132: /* stmt_execsql: T_WORD  */
    3971             : #line 2012 "pl_gram.y"
    3972             :                                         {
    3973             :                         int         tok;
    3974             : 
    3975             :                         tok = yylex(&yylval, &yylloc, yyscanner);
    3976             :                         plpgsql_push_back_token(tok, &yylval, &yylloc, yyscanner);
    3977             :                         if (tok == '=' || tok == COLON_EQUALS ||
    3978             :                             tok == '[' || tok == '.')
    3979             :                             word_is_not_variable(&((yyvsp[0].word)), (yylsp[0]), yyscanner);
    3980             :                         (yyval.stmt) = make_execsql_stmt(T_WORD, (yylsp[0]), &((yyvsp[0].word)), &yylval, &yylloc, yyscanner);
    3981             :                     }
    3982             : #line 3983 "pl_gram.c"
    3983        3186 :     break;
    3984             : 
    3985           4 :   case 133: /* stmt_execsql: T_CWORD  */
    3986             : #line 2023 "pl_gram.y"
    3987             :                                         {
    3988             :                         int         tok;
    3989             : 
    3990             :                         tok = yylex(&yylval, &yylloc, yyscanner);
    3991             :                         plpgsql_push_back_token(tok, &yylval, &yylloc, yyscanner);
    3992             :                         if (tok == '=' || tok == COLON_EQUALS ||
    3993             :                             tok == '[' || tok == '.')
    3994             :                             cword_is_not_variable(&((yyvsp[0].cword)), (yylsp[0]), yyscanner);
    3995             :                         (yyval.stmt) = make_execsql_stmt(T_CWORD, (yylsp[0]), NULL, &yylval, &yylloc, yyscanner);
    3996             :                     }
    3997             : #line 3998 "pl_gram.c"
    3998           0 :     break;
    3999             : 
    4000        1100 :   case 134: /* stmt_dynexecute: K_EXECUTE  */
    4001             : #line 2036 "pl_gram.y"
    4002             :                                         {
    4003             :                         PLpgSQL_stmt_dynexecute *new;
    4004             :                         PLpgSQL_expr *expr;
    4005             :                         int         endtoken;
    4006             : 
    4007             :                         expr = read_sql_construct(K_INTO, K_USING, ';',
    4008             :                                                   "INTO or USING or ;",
    4009             :                                                   RAW_PARSE_PLPGSQL_EXPR,
    4010             :                                                   true, true,
    4011             :                                                   NULL, &endtoken,
    4012             :                                                   &yylval, &yylloc, yyscanner);
    4013             : 
    4014             :                         new = palloc(sizeof(PLpgSQL_stmt_dynexecute));
    4015             :                         new->cmd_type = PLPGSQL_STMT_DYNEXECUTE;
    4016             :                         new->lineno = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    4017             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    4018             :                         new->query = expr;
    4019             :                         new->into = false;
    4020             :                         new->strict = false;
    4021             :                         new->target = NULL;
    4022             :                         new->params = NIL;
    4023             : 
    4024             :                         /*
    4025             :                          * We loop to allow the INTO and USING clauses to
    4026             :                          * appear in either order, since people easily get
    4027             :                          * that wrong.  This coding also prevents "INTO foo"
    4028             :                          * from getting absorbed into a USING expression,
    4029             :                          * which is *really* confusing.
    4030             :                          */
    4031             :                         for (;;)
    4032             :                         {
    4033             :                             if (endtoken == K_INTO)
    4034             :                             {
    4035             :                                 if (new->into)           /* multiple INTO */
    4036             :                                     yyerror(&yylloc, NULL, yyscanner, "syntax error");
    4037             :                                 new->into = true;
    4038             :                                 read_into_target(&new->target, &new->strict, &yylval, &yylloc, yyscanner);
    4039             :                                 endtoken = yylex(&yylval, &yylloc, yyscanner);
    4040             :                             }
    4041             :                             else if (endtoken == K_USING)
    4042             :                             {
    4043             :                                 if (new->params)     /* multiple USING */
    4044             :                                     yyerror(&yylloc, NULL, yyscanner, "syntax error");
    4045             :                                 do
    4046             :                                 {
    4047             :                                     expr = read_sql_construct(',', ';', K_INTO,
    4048             :                                                               ", or ; or INTO",
    4049             :                                                               RAW_PARSE_PLPGSQL_EXPR,
    4050             :                                                               true, true,
    4051             :                                                               NULL, &endtoken,
    4052             :                                                               &yylval, &yylloc, yyscanner);
    4053             :                                     new->params = lappend(new->params, expr);
    4054             :                                 } while (endtoken == ',');
    4055             :                             }
    4056             :                             else if (endtoken == ';')
    4057             :                                 break;
    4058             :                             else
    4059             :                                 yyerror(&yylloc, NULL, yyscanner, "syntax error");
    4060             :                         }
    4061             : 
    4062             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    4063             :                     }
    4064             : #line 4065 "pl_gram.c"
    4065        1100 :     break;
    4066             : 
    4067         140 :   case 135: /* stmt_open: K_OPEN cursor_variable  */
    4068             : #line 2102 "pl_gram.y"
    4069             :                                         {
    4070             :                         PLpgSQL_stmt_open *new;
    4071             :                         int         tok;
    4072             : 
    4073             :                         new = palloc0(sizeof(PLpgSQL_stmt_open));
    4074             :                         new->cmd_type = PLPGSQL_STMT_OPEN;
    4075             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-1]), yyscanner);
    4076             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    4077             :                         new->curvar = (yyvsp[0].var)->dno;
    4078             :                         new->cursor_options = CURSOR_OPT_FAST_PLAN;
    4079             : 
    4080             :                         if ((yyvsp[0].var)->cursor_explicit_expr == NULL)
    4081             :                         {
    4082             :                             /* be nice if we could use opt_scrollable here */
    4083             :                             tok = yylex(&yylval, &yylloc, yyscanner);
    4084             :                             if (tok_is_keyword(tok, &yylval,
    4085             :                                                K_NO, "no"))
    4086             :                             {
    4087             :                                 tok = yylex(&yylval, &yylloc, yyscanner);
    4088             :                                 if (tok_is_keyword(tok, &yylval,
    4089             :                                                    K_SCROLL, "scroll"))
    4090             :                                 {
    4091             :                                     new->cursor_options |= CURSOR_OPT_NO_SCROLL;
    4092             :                                     tok = yylex(&yylval, &yylloc, yyscanner);
    4093             :                                 }
    4094             :                             }
    4095             :                             else if (tok_is_keyword(tok, &yylval,
    4096             :                                                     K_SCROLL, "scroll"))
    4097             :                             {
    4098             :                                 new->cursor_options |= CURSOR_OPT_SCROLL;
    4099             :                                 tok = yylex(&yylval, &yylloc, yyscanner);
    4100             :                             }
    4101             : 
    4102             :                             if (tok != K_FOR)
    4103             :                                 yyerror(&yylloc, NULL, yyscanner, "syntax error, expected \"FOR\"");
    4104             : 
    4105             :                             tok = yylex(&yylval, &yylloc, yyscanner);
    4106             :                             if (tok_is_keyword(tok, &yylval,
    4107             :                                                K_EXECUTE, "execute"))
    4108             :                             {
    4109             :                                 int         endtoken;
    4110             : 
    4111             :                                 new->dynquery =
    4112             :                                     read_sql_expression2(K_USING, ';',
    4113             :                                                          "USING or ;",
    4114             :                                                          &endtoken, &yylval, &yylloc, yyscanner);
    4115             : 
    4116             :                                 /* If we found "USING", collect argument(s) */
    4117             :                                 if (endtoken == K_USING)
    4118             :                                 {
    4119             :                                     PLpgSQL_expr *expr;
    4120             : 
    4121             :                                     do
    4122             :                                     {
    4123             :                                         expr = read_sql_expression2(',', ';',
    4124             :                                                                     ", or ;",
    4125             :                                                                     &endtoken, &yylval, &yylloc, yyscanner);
    4126             :                                         new->params = lappend(new->params,
    4127             :                                                               expr);
    4128             :                                     } while (endtoken == ',');
    4129             :                                 }
    4130             :                             }
    4131             :                             else
    4132             :                             {
    4133             :                                 plpgsql_push_back_token(tok, &yylval, &yylloc, yyscanner);
    4134             :                                 new->query = read_sql_stmt(&yylval, &yylloc, yyscanner);
    4135             :                             }
    4136             :                         }
    4137             :                         else
    4138             :                         {
    4139             :                             /* predefined cursor query, so read args */
    4140             :                             new->argquery = read_cursor_args((yyvsp[0].var), ';', &yylval, &yylloc, yyscanner);
    4141             :                         }
    4142             : 
    4143             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    4144             :                     }
    4145             : #line 4146 "pl_gram.c"
    4146         116 :     break;
    4147             : 
    4148         122 :   case 136: /* stmt_fetch: K_FETCH opt_fetch_direction cursor_variable K_INTO  */
    4149             : #line 2181 "pl_gram.y"
    4150             :                                         {
    4151             :                         PLpgSQL_stmt_fetch *fetch = (yyvsp[-2].fetch);
    4152             :                         PLpgSQL_variable *target;
    4153             : 
    4154             :                         /* We have already parsed everything through the INTO keyword */
    4155             :                         read_into_target(&target, NULL, &yylval, &yylloc, yyscanner);
    4156             : 
    4157             :                         if (yylex(&yylval, &yylloc, yyscanner) != ';')
    4158             :                             yyerror(&yylloc, NULL, yyscanner, "syntax error");
    4159             : 
    4160             :                         /*
    4161             :                          * We don't allow multiple rows in PL/pgSQL's FETCH
    4162             :                          * statement, only in MOVE.
    4163             :                          */
    4164             :                         if (fetch->returns_multiple_rows)
    4165             :                             ereport(ERROR,
    4166             :                                     (errcode(ERRCODE_FEATURE_NOT_SUPPORTED),
    4167             :                                      errmsg("FETCH statement cannot return multiple rows"),
    4168             :                                      parser_errposition((yylsp[-3]))));
    4169             : 
    4170             :                         fetch->lineno = plpgsql_location_to_lineno((yylsp[-3]), yyscanner);
    4171             :                         fetch->target    = target;
    4172             :                         fetch->curvar    = (yyvsp[-1].var)->dno;
    4173             :                         fetch->is_move   = false;
    4174             : 
    4175             :                         (yyval.stmt) = (PLpgSQL_stmt *) fetch;
    4176             :                     }
    4177             : #line 4178 "pl_gram.c"
    4178         122 :     break;
    4179             : 
    4180          18 :   case 137: /* stmt_move: K_MOVE opt_fetch_direction cursor_variable ';'  */
    4181             : #line 2211 "pl_gram.y"
    4182             :                                         {
    4183             :                         PLpgSQL_stmt_fetch *fetch = (yyvsp[-2].fetch);
    4184             : 
    4185             :                         fetch->lineno = plpgsql_location_to_lineno((yylsp[-3]), yyscanner);
    4186             :                         fetch->curvar = (yyvsp[-1].var)->dno;
    4187             :                         fetch->is_move = true;
    4188             : 
    4189             :                         (yyval.stmt) = (PLpgSQL_stmt *) fetch;
    4190             :                     }
    4191             : #line 4192 "pl_gram.c"
    4192          18 :     break;
    4193             : 
    4194         140 :   case 138: /* opt_fetch_direction: %empty  */
    4195             : #line 2223 "pl_gram.y"
    4196             :                                         {
    4197             :                         (yyval.fetch) = read_fetch_direction(&yylval, &yylloc, yyscanner);
    4198             :                     }
    4199             : #line 4200 "pl_gram.c"
    4200         140 :     break;
    4201             : 
    4202          66 :   case 139: /* stmt_close: K_CLOSE cursor_variable ';'  */
    4203             : #line 2229 "pl_gram.y"
    4204             :                                         {
    4205             :                         PLpgSQL_stmt_close *new;
    4206             : 
    4207             :                         new = palloc(sizeof(PLpgSQL_stmt_close));
    4208             :                         new->cmd_type = PLPGSQL_STMT_CLOSE;
    4209             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-2]), yyscanner);
    4210             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    4211             :                         new->curvar = (yyvsp[-1].var)->dno;
    4212             : 
    4213             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    4214             :                     }
    4215             : #line 4216 "pl_gram.c"
    4216          66 :     break;
    4217             : 
    4218          38 :   case 140: /* stmt_null: K_NULL ';'  */
    4219             : #line 2243 "pl_gram.y"
    4220             :                                         {
    4221             :                         /* We do not bother building a node for NULL */
    4222             :                         (yyval.stmt) = NULL;
    4223             :                     }
    4224             : #line 4225 "pl_gram.c"
    4225          38 :     break;
    4226             : 
    4227          78 :   case 141: /* stmt_commit: K_COMMIT opt_transaction_chain ';'  */
    4228             : #line 2250 "pl_gram.y"
    4229             :                                         {
    4230             :                         PLpgSQL_stmt_commit *new;
    4231             : 
    4232             :                         new = palloc(sizeof(PLpgSQL_stmt_commit));
    4233             :                         new->cmd_type = PLPGSQL_STMT_COMMIT;
    4234             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-2]), yyscanner);
    4235             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    4236             :                         new->chain = (yyvsp[-1].ival);
    4237             : 
    4238             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    4239             :                     }
    4240             : #line 4241 "pl_gram.c"
    4241          78 :     break;
    4242             : 
    4243          50 :   case 142: /* stmt_rollback: K_ROLLBACK opt_transaction_chain ';'  */
    4244             : #line 2264 "pl_gram.y"
    4245             :                                         {
    4246             :                         PLpgSQL_stmt_rollback *new;
    4247             : 
    4248             :                         new = palloc(sizeof(PLpgSQL_stmt_rollback));
    4249             :                         new->cmd_type = PLPGSQL_STMT_ROLLBACK;
    4250             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-2]), yyscanner);
    4251             :                         new->stmtid = ++plpgsql_curr_compile->nstatements;
    4252             :                         new->chain = (yyvsp[-1].ival);
    4253             : 
    4254             :                         (yyval.stmt) = (PLpgSQL_stmt *) new;
    4255             :                     }
    4256             : #line 4257 "pl_gram.c"
    4257          50 :     break;
    4258             : 
    4259           4 :   case 143: /* opt_transaction_chain: K_AND K_CHAIN  */
    4260             : #line 2278 "pl_gram.y"
    4261             :                                                         { (yyval.ival) = true; }
    4262             : #line 4263 "pl_gram.c"
    4263           4 :     break;
    4264             : 
    4265           0 :   case 144: /* opt_transaction_chain: K_AND K_NO K_CHAIN  */
    4266             : #line 2279 "pl_gram.y"
    4267             :                                                 { (yyval.ival) = false; }
    4268             : #line 4269 "pl_gram.c"
    4269           0 :     break;
    4270             : 
    4271         124 :   case 145: /* opt_transaction_chain: %empty  */
    4272             : #line 2280 "pl_gram.y"
    4273             :                                                         { (yyval.ival) = false; }
    4274             : #line 4275 "pl_gram.c"
    4275         124 :     break;
    4276             : 
    4277         346 :   case 146: /* cursor_variable: T_DATUM  */
    4278             : #line 2285 "pl_gram.y"
    4279             :                                         {
    4280             :                         /*
    4281             :                          * In principle we should support a cursor_variable
    4282             :                          * that is an array element, but for now we don't, so
    4283             :                          * just throw an error if next token is '['.
    4284             :                          */
    4285             :                         if ((yyvsp[0].wdatum).datum->dtype != PLPGSQL_DTYPE_VAR ||
    4286             :                             plpgsql_peek(yyscanner) == '[')
    4287             :                             ereport(ERROR,
    4288             :                                     (errcode(ERRCODE_DATATYPE_MISMATCH),
    4289             :                                      errmsg("cursor variable must be a simple variable"),
    4290             :                                      parser_errposition((yylsp[0]))));
    4291             : 
    4292             :                         if (((PLpgSQL_var *) (yyvsp[0].wdatum).datum)->datatype->typoid != REFCURSOROID)
    4293             :                             ereport(ERROR,
    4294             :                                     (errcode(ERRCODE_DATATYPE_MISMATCH),
    4295             :                                      errmsg("variable \"%s\" must be of type cursor or refcursor",
    4296             :                                             ((PLpgSQL_var *) (yyvsp[0].wdatum).datum)->refname),
    4297             :                                      parser_errposition((yylsp[0]))));
    4298             :                         (yyval.var) = (PLpgSQL_var *) (yyvsp[0].wdatum).datum;
    4299             :                     }
    4300             : #line 4301 "pl_gram.c"
    4301         346 :     break;
    4302             : 
    4303           0 :   case 147: /* cursor_variable: T_WORD  */
    4304             : #line 2307 "pl_gram.y"
    4305             :                                         {
    4306             :                         /* just to give a better message than "syntax error" */
    4307             :                         word_is_not_variable(&((yyvsp[0].word)), (yylsp[0]), yyscanner);
    4308             :                     }
    4309             : #line 4310 "pl_gram.c"
    4310           0 :     break;
    4311             : 
    4312           0 :   case 148: /* cursor_variable: T_CWORD  */
    4313             : #line 2312 "pl_gram.y"
    4314             :                                         {
    4315             :                         /* just to give a better message than "syntax error" */
    4316             :                         cword_is_not_variable(&((yyvsp[0].cword)), (yylsp[0]), yyscanner);
    4317             :                     }
    4318             : #line 4319 "pl_gram.c"
    4319           0 :     break;
    4320             : 
    4321        9074 :   case 149: /* exception_sect: %empty  */
    4322             : #line 2319 "pl_gram.y"
    4323             :                                         { (yyval.exception_block) = NULL; }
    4324             : #line 4325 "pl_gram.c"
    4325        9074 :     break;
    4326             : 
    4327         454 :   case 150: /* @2: %empty  */
    4328             : #line 2321 "pl_gram.y"
    4329             :                                         {
    4330             :                         /*
    4331             :                          * We use a mid-rule action to add these
    4332             :                          * special variables to the namespace before
    4333             :                          * parsing the WHEN clauses themselves.  The
    4334             :                          * scope of the names extends to the end of the
    4335             :                          * current block.
    4336             :                          */
    4337             :                         int         lineno = plpgsql_location_to_lineno((yylsp[0]), yyscanner);
    4338             :                         PLpgSQL_exception_block *new = palloc(sizeof(PLpgSQL_exception_block));
    4339             :                         PLpgSQL_variable *var;
    4340             : 
    4341             :                         plpgsql_curr_compile->has_exception_block = true;
    4342             : 
    4343             :                         var = plpgsql_build_variable("sqlstate", lineno,
    4344             :                                                      plpgsql_build_datatype(TEXTOID,
    4345             :                                                                             -1,
    4346             :                                                                             plpgsql_curr_compile->fn_input_collation,
    4347             :                                                                             NULL),
    4348             :                                                      true);
    4349             :                         var->isconst = true;
    4350             :                         new->sqlstate_varno = var->dno;
    4351             : 
    4352             :                         var = plpgsql_build_variable("sqlerrm", lineno,
    4353             :                                                      plpgsql_build_datatype(TEXTOID,
    4354             :                                                                             -1,
    4355             :                                                                             plpgsql_curr_compile->fn_input_collation,
    4356             :                                                                             NULL),
    4357             :                                                      true);
    4358             :                         var->isconst = true;
    4359             :                         new->sqlerrm_varno = var->dno;
    4360             : 
    4361             :                         (yyval.exception_block) = new;
    4362             :                     }
    4363             : #line 4364 "pl_gram.c"
    4364         454 :     break;
    4365             : 
    4366         454 :   case 151: /* exception_sect: K_EXCEPTION @2 proc_exceptions  */
    4367             : #line 2356 "pl_gram.y"
    4368             :                                         {
    4369             :                         PLpgSQL_exception_block *new = (yyvsp[-1].exception_block);
    4370             :                         new->exc_list = (yyvsp[0].list);
    4371             : 
    4372             :                         (yyval.exception_block) = new;
    4373             :                     }
    4374             : #line 4375 "pl_gram.c"
    4375         454 :     break;
    4376             : 
    4377          12 :   case 152: /* proc_exceptions: proc_exceptions proc_exception  */
    4378             : #line 2365 "pl_gram.y"
    4379             :                                                 {
    4380             :                             (yyval.list) = lappend((yyvsp[-1].list), (yyvsp[0].exception));
    4381             :                         }
    4382             : #line 4383 "pl_gram.c"
    4383          12 :     break;
    4384             : 
    4385         454 :   case 153: /* proc_exceptions: proc_exception  */
    4386             : #line 2369 "pl_gram.y"
    4387             :                                                 {
    4388             :                             (yyval.list) = list_make1((yyvsp[0].exception));
    4389             :                         }
    4390             : #line 4391 "pl_gram.c"
    4391         454 :     break;
    4392             : 
    4393         466 :   case 154: /* proc_exception: K_WHEN proc_conditions K_THEN proc_sect  */
    4394             : #line 2375 "pl_gram.y"
    4395             :                                         {
    4396             :                         PLpgSQL_exception *new;
    4397             : 
    4398             :                         new = palloc0(sizeof(PLpgSQL_exception));
    4399             :                         new->lineno = plpgsql_location_to_lineno((yylsp[-3]), yyscanner);
    4400             :                         new->conditions = (yyvsp[-2].condition);
    4401             :                         new->action = (yyvsp[0].list);
    4402             : 
    4403             :                         (yyval.exception) = new;
    4404             :                     }
    4405             : #line 4406 "pl_gram.c"
    4406         466 :     break;
    4407             : 
    4408          14 :   case 155: /* proc_conditions: proc_conditions K_OR proc_condition  */
    4409             : #line 2388 "pl_gram.y"
    4410             :                                                 {
    4411             :                             PLpgSQL_condition   *old;
    4412             : 
    4413             :                             for (old = (yyvsp[-2].condition); old->next != NULL; old = old->next)
    4414             :                                 /* skip */ ;
    4415             :                             old->next = (yyvsp[0].condition);
    4416             :                             (yyval.condition) = (yyvsp[-2].condition);
    4417             :                         }
    4418             : #line 4419 "pl_gram.c"
    4419          14 :     break;
    4420             : 
    4421         466 :   case 156: /* proc_conditions: proc_condition  */
    4422             : #line 2397 "pl_gram.y"
    4423             :                                                 {
    4424             :                             (yyval.condition) = (yyvsp[0].condition);
    4425             :                         }
    4426             : #line 4427 "pl_gram.c"
    4427         466 :     break;
    4428             : 
    4429         480 :   case 157: /* proc_condition: any_identifier  */
    4430             : #line 2403 "pl_gram.y"
    4431             :                                                 {
    4432             :                             if (strcmp((yyvsp[0].str), "sqlstate") != 0)
    4433             :                             {
    4434             :                                 (yyval.condition) = plpgsql_parse_err_condition((yyvsp[0].str));
    4435             :                             }
    4436             :                             else
    4437             :                             {
    4438             :                                 PLpgSQL_condition *new;
    4439             :                                 char   *sqlstatestr;
    4440             : 
    4441             :                                 /* next token should be a string literal */
    4442             :                                 if (yylex(&yylval, &yylloc, yyscanner) != SCONST)
    4443             :                                     yyerror(&yylloc, NULL, yyscanner, "syntax error");
    4444             :                                 sqlstatestr = yylval.str;
    4445             : 
    4446             :                                 if (strlen(sqlstatestr) != 5)
    4447             :                                     yyerror(&yylloc, NULL, yyscanner, "invalid SQLSTATE code");
    4448             :                                 if (strspn(sqlstatestr, "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ") != 5)
    4449             :                                     yyerror(&yylloc, NULL, yyscanner, "invalid SQLSTATE code");
    4450             : 
    4451             :                                 new = palloc(sizeof(PLpgSQL_condition));
    4452             :                                 new->sqlerrstate =
    4453             :                                     MAKE_SQLSTATE(sqlstatestr[0],
    4454             :                                                   sqlstatestr[1],
    4455             :                                                   sqlstatestr[2],
    4456             :                                                   sqlstatestr[3],
    4457             :                                                   sqlstatestr[4]);
    4458             :                                 new->condname = sqlstatestr;
    4459             :                                 new->next = NULL;
    4460             : 
    4461             :                                 (yyval.condition) = new;
    4462             :                             }
    4463             :                         }
    4464             : #line 4465 "pl_gram.c"
    4465         480 :     break;
    4466             : 
    4467         100 :   case 158: /* expr_until_semi: %empty  */
    4468             : #line 2439 "pl_gram.y"
    4469             :                                         { (yyval.expr) = read_sql_expression(';', ";", &yylval, &yylloc, yyscanner); }
    4470             : #line 4471 "pl_gram.c"
    4471         100 :     break;
    4472             : 
    4473        7086 :   case 159: /* expr_until_then: %empty  */
    4474             : #line 2443 "pl_gram.y"
    4475             :                                         { (yyval.expr) = read_sql_expression(K_THEN, "THEN", &yylval, &yylloc, yyscanner); }
    4476             : #line 4477 "pl_gram.c"
    4477        7086 :     break;
    4478             : 
    4479         142 :   case 160: /* expr_until_loop: %empty  */
    4480             : #line 2447 "pl_gram.y"
    4481             :                                         { (yyval.expr) = read_sql_expression(K_LOOP, "LOOP", &yylval, &yylloc, yyscanner); }
    4482             : #line 4483 "pl_gram.c"
    4483         142 :     break;
    4484             : 
    4485        9636 :   case 161: /* opt_block_label: %empty  */
    4486             : #line 2451 "pl_gram.y"
    4487             :                                         {
    4488             :                         plpgsql_ns_push(NULL, PLPGSQL_LABEL_BLOCK);
    4489             :                         (yyval.str) = NULL;
    4490             :                     }
    4491             : #line 4492 "pl_gram.c"
    4492        9636 :     break;
    4493             : 
    4494          62 :   case 162: /* opt_block_label: LESS_LESS any_identifier GREATER_GREATER  */
    4495             : #line 2456 "pl_gram.y"
    4496             :                                         {
    4497             :                         plpgsql_ns_push((yyvsp[-1].str), PLPGSQL_LABEL_BLOCK);
    4498             :                         (yyval.str) = (yyvsp[-1].str);
    4499             :                     }
    4500             : #line 4501 "pl_gram.c"
    4501          62 :     break;
    4502             : 
    4503        1736 :   case 163: /* opt_loop_label: %empty  */
    4504             : #line 2463 "pl_gram.y"
    4505             :                                         {
    4506             :                         plpgsql_ns_push(NULL, PLPGSQL_LABEL_LOOP);
    4507             :                         (yyval.str) = NULL;
    4508             :                     }
    4509             : #line 4510 "pl_gram.c"
    4510        1736 :     break;
    4511             : 
    4512          30 :   case 164: /* opt_loop_label: LESS_LESS any_identifier GREATER_GREATER  */
    4513             : #line 2468 "pl_gram.y"
    4514             :                                         {
    4515             :                         plpgsql_ns_push((yyvsp[-1].str), PLPGSQL_LABEL_LOOP);
    4516             :                         (yyval.str) = (yyvsp[-1].str);
    4517             :                     }
    4518             : #line 4519 "pl_gram.c"
    4519          30 :     break;
    4520             : 
    4521       11412 :   case 165: /* opt_label: %empty  */
    4522             : #line 2475 "pl_gram.y"
    4523             :                                         {
    4524             :                         (yyval.str) = NULL;
    4525             :                     }
    4526             : #line 4527 "pl_gram.c"
    4527       11412 :     break;
    4528             : 
    4529          42 :   case 166: /* opt_label: any_identifier  */
    4530             : #line 2479 "pl_gram.y"
    4531             :                                         {
    4532             :                         /* label validity will be checked by outer production */
    4533             :                         (yyval.str) = (yyvsp[0].str);
    4534             :                     }
    4535             : #line 4536 "pl_gram.c"
    4536          42 :     break;
    4537             : 
    4538          84 :   case 167: /* opt_exitcond: ';'  */
    4539             : #line 2486 "pl_gram.y"
    4540             :                                         { (yyval.expr) = NULL; }
    4541             : #line 4542 "pl_gram.c"
    4542          84 :     break;
    4543             : 
    4544         100 :   case 168: /* opt_exitcond: K_WHEN expr_until_semi  */
    4545             : #line 2488 "pl_gram.y"
    4546             :                                         { (yyval.expr) = (yyvsp[0].expr); }
    4547             : #line 4548 "pl_gram.c"
    4548         100 :     break;
    4549             : 
    4550         586 :   case 169: /* any_identifier: T_WORD  */
    4551             : #line 2495 "pl_gram.y"
    4552             :                                         {
    4553             :                         (yyval.str) = (yyvsp[0].word).ident;
    4554             :                     }
    4555             : #line 4556 "pl_gram.c"
    4556         586 :     break;
    4557             : 
    4558           0 :   case 170: /* any_identifier: unreserved_keyword  */
    4559             : #line 2499 "pl_gram.y"
    4560             :                                         {
    4561             :                         (yyval.str) = pstrdup((yyvsp[0].keyword));
    4562             :                     }
    4563             : #line 4564 "pl_gram.c"
    4564           0 :     break;
    4565             : 
    4566          28 :   case 171: /* any_identifier: T_DATUM  */
    4567             : #line 2503 "pl_gram.y"
    4568             :                                         {
    4569             :                         if ((yyvsp[0].wdatum).ident == NULL) /* composite name not OK */
    4570             :                             yyerror(&yylloc, NULL, yyscanner, "syntax error");
    4571             :                         (yyval.str) = (yyvsp[0].wdatum).ident;
    4572             :                     }
    4573             : #line 4574 "pl_gram.c"
    4574          28 :     break;
    4575             : 
    4576             : 
    4577             : #line 4578 "pl_gram.c"
    4578             : 
    4579       32822 :       default: break;
    4580             :     }
    4581             :   /* User semantic actions sometimes alter yychar, and that requires
    4582             :      that yytoken be updated with the new translation.  We take the
    4583             :      approach of translating immediately before every use of yytoken.
    4584             :      One alternative is translating here after every semantic action,
    4585             :      but that translation would be missed if the semantic action invokes
    4586             :      YYABORT, YYACCEPT, or YYERROR immediately after altering yychar or
    4587             :      if it invokes YYBACKUP.  In the case of YYABORT or YYACCEPT, an
    4588             :      incorrect destructor might then be invoked immediately.  In the
    4589             :      case of YYERROR or YYBACKUP, subsequent parser actions might lead
    4590             :      to an incorrect destructor call or verbose syntax error message
    4591             :      before the lookahead is translated.  */
    4592             :   YY_SYMBOL_PRINT ("-> $$ =", YY_CAST (yysymbol_kind_t, yyr1[yyn]), &yyval, &yyloc);
    4593             : 
    4594      305456 :   YYPOPSTACK (yylen);
    4595      305456 :   yylen = 0;
    4596             : 
    4597      305456 :   *++yyvsp = yyval;
    4598      305456 :   *++yylsp = yyloc;
    4599             : 
    4600             :   /* Now 'shift' the result of the reduction.  Determine what state
    4601             :      that goes to, based on the state we popped back to and the rule
    4602             :      number reduced by.  */
    4603             :   {
    4604      305456 :     const int yylhs = yyr1[yyn] - YYNTOKENS;
    4605      305456 :     const int yyi = yypgoto[yylhs] + *yyssp;
    4606      128136 :     yystate = (0 <= yyi && yyi <= YYLAST && yycheck[yyi] == *yyssp
    4607       81270 :                ? yytable[yyi]
    4608      433592 :                : yydefgoto[yylhs]);
    4609             :   }
    4610             : 
    4611      305456 :   goto yynewstate;
    4612             : 
    4613             : 
    4614             : /*--------------------------------------.
    4615             : | yyerrlab -- here on detecting error.  |
    4616             : `--------------------------------------*/
    4617           2 : yyerrlab:
    4618             :   /* Make sure we have latest lookahead translation.  See comments at
    4619             :      user semantic actions for why this is necessary.  */
    4620           2 :   yytoken = yychar == YYEMPTY ? YYSYMBOL_YYEMPTY : YYTRANSLATE (yychar);
    4621             :   /* If not already recovering from an error, report this error.  */
    4622           2 :   if (!yyerrstatus)
    4623             :     {
    4624           2 :       ++yynerrs;
    4625           2 :       yyerror (&yylloc, plpgsql_parse_result_p, yyscanner, YY_("syntax error"));
    4626             :     }
    4627             : 
    4628           0 :   yyerror_range[1] = yylloc;
    4629           0 :   if (yyerrstatus == 3)
    4630             :     {
    4631             :       /* If just tried and failed to reuse lookahead token after an
    4632             :          error, discard it.  */
    4633             : 
    4634           0 :       if (yychar <= YYEOF)
    4635             :         {
    4636             :           /* Return failure if at end of input.  */
    4637           0 :           if (yychar == YYEOF)
    4638           0 :             YYABORT;
    4639             :         }
    4640             :       else
    4641             :         {
    4642           0 :           yydestruct ("Error: discarding",
    4643             :                       yytoken, &yylval, &yylloc, plpgsql_parse_result_p, yyscanner);
    4644           0 :           yychar = YYEMPTY;
    4645             :         }
    4646             :     }
    4647             : 
    4648             :   /* Else will try to reuse lookahead token after shifting the error
    4649             :      token.  */
    4650           0 :   goto yyerrlab1;
    4651             : 
    4652             : 
    4653             : /*---------------------------------------------------.
    4654             : | yyerrorlab -- error raised explicitly by YYERROR.  |
    4655             : `---------------------------------------------------*/
    4656             : yyerrorlab:
    4657             :   /* Pacify compilers when the user code never invokes YYERROR and the
    4658             :      label yyerrorlab therefore never appears in user code.  */
    4659             :   if (0)
    4660             :     YYERROR;
    4661             :   ++yynerrs;
    4662             : 
    4663             :   /* Do not reclaim the symbols of the rule whose action triggered
    4664             :      this YYERROR.  */
    4665             :   YYPOPSTACK (yylen);
    4666             :   yylen = 0;
    4667             :   YY_STACK_PRINT (yyss, yyssp);
    4668             :   yystate = *yyssp;
    4669             :   goto yyerrlab1;
    4670             : 
    4671             : 
    4672             : /*-------------------------------------------------------------.
    4673             : | yyerrlab1 -- common code for both syntax error and YYERROR.  |
    4674             : `-------------------------------------------------------------*/
    4675           0 : yyerrlab1:
    4676           0 :   yyerrstatus = 3;      /* Each real token shifted decrements this.  */
    4677             : 
    4678             :   /* Pop stack until we find a state that shifts the error token.  */
    4679             :   for (;;)
    4680             :     {
    4681           0 :       yyn = yypact[yystate];
    4682           0 :       if (!yypact_value_is_default (yyn))
    4683             :         {
    4684           0 :           yyn += YYSYMBOL_YYerror;
    4685           0 :           if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYSYMBOL_YYerror)
    4686             :             {
    4687           0 :               yyn = yytable[yyn];
    4688           0 :               if (0 < yyn)
    4689           0 :                 break;
    4690             :             }
    4691             :         }
    4692             : 
    4693             :       /* Pop the current state because it cannot handle the error token.  */
    4694           0 :       if (yyssp == yyss)
    4695           0 :         YYABORT;
    4696             : 
    4697           0 :       yyerror_range[1] = *yylsp;
    4698           0 :       yydestruct ("Error: popping",
    4699           0 :                   YY_ACCESSING_SYMBOL (yystate), yyvsp, yylsp, plpgsql_parse_result_p, yyscanner);
    4700           0 :       YYPOPSTACK (1);
    4701           0 :       yystate = *yyssp;
    4702             :       YY_STACK_PRINT (yyss, yyssp);
    4703             :     }
    4704             : 
    4705             :   YY_IGNORE_MAYBE_UNINITIALIZED_BEGIN
    4706           0 :   *++yyvsp = yylval;
    4707             :   YY_IGNORE_MAYBE_UNINITIALIZED_END
    4708             : 
    4709           0 :   yyerror_range[2] = yylloc;
    4710           0 :   ++yylsp;
    4711           0 :   YYLLOC_DEFAULT (*yylsp, yyerror_range, 2);
    4712             : 
    4713             :   /* Shift the error token.  */
    4714             :   YY_SYMBOL_PRINT ("Shifting", YY_ACCESSING_SYMBOL (yyn), yyvsp, yylsp);
    4715             : 
    4716           0 :   yystate = yyn;
    4717           0 :   goto yynewstate;
    4718             : 
    4719             : 
    4720             : /*-------------------------------------.
    4721             : | yyacceptlab -- YYACCEPT comes here.  |
    4722             : `-------------------------------------*/
    4723        9306 : yyacceptlab:
    4724        9306 :   yyresult = 0;
    4725        9306 :   goto yyreturnlab;
    4726             : 
    4727             : 
    4728             : /*-----------------------------------.
    4729             : | yyabortlab -- YYABORT comes here.  |
    4730             : `-----------------------------------*/
    4731           0 : yyabortlab:
    4732           0 :   yyresult = 1;
    4733           0 :   goto yyreturnlab;
    4734             : 
    4735             : 
    4736             : /*-----------------------------------------------------------.
    4737             : | yyexhaustedlab -- YYNOMEM (memory exhaustion) comes here.  |
    4738             : `-----------------------------------------------------------*/
    4739           0 : yyexhaustedlab:
    4740           0 :   yyerror (&yylloc, plpgsql_parse_result_p, yyscanner, YY_("memory exhausted"));
    4741             :   yyresult = 2;
    4742             :   goto yyreturnlab;
    4743             : 
    4744             : 
    4745             : /*----------------------------------------------------------.
    4746             : | yyreturnlab -- parsing is finished, clean up and return.  |
    4747             : `----------------------------------------------------------*/
    4748        9306 : yyreturnlab:
    4749        9306 :   if (yychar != YYEMPTY)
    4750             :     {
    4751             :       /* Make sure we have latest lookahead translation.  See comments at
    4752             :          user semantic actions for why this is necessary.  */
    4753           0 :       yytoken = YYTRANSLATE (yychar);
    4754           0 :       yydestruct ("Cleanup: discarding lookahead",
    4755             :                   yytoken, &yylval, &yylloc, plpgsql_parse_result_p, yyscanner);
    4756             :     }
    4757             :   /* Do not reclaim the symbols of the rule whose action triggered
    4758             :      this YYABORT or YYACCEPT.  */
    4759        9306 :   YYPOPSTACK (yylen);
    4760             :   YY_STACK_PRINT (yyss, yyssp);
    4761       27918 :   while (yyssp != yyss)
    4762             :     {
    4763       18612 :       yydestruct ("Cleanup: popping",
    4764       18612 :                   YY_ACCESSING_SYMBOL (+*yyssp), yyvsp, yylsp, plpgsql_parse_result_p, yyscanner);
    4765       18612 :       YYPOPSTACK (1);
    4766             :     }
    4767             : #ifndef yyoverflow
    4768        9306 :   if (yyss != yyssa)
    4769           0 :     YYSTACK_FREE (yyss);
    4770             : #endif
    4771             : 
    4772        9306 :   return yyresult;
    4773             : }
    4774             : 
    4775             : #line 2597 "pl_gram.y"
    4776             : 
    4777             : 
    4778             : /*
    4779             :  * Check whether a token represents an "unreserved keyword".
    4780             :  * We have various places where we want to recognize a keyword in preference
    4781             :  * to a variable name, but not reserve that keyword in other contexts.
    4782             :  * Hence, this kluge.
    4783             :  */
    4784             : static bool
    4785             : tok_is_keyword(int token, union YYSTYPE *lval,
    4786             :                int kw_token, const char *kw_str)
    4787             : {
    4788             :     if (token == kw_token)
    4789             :     {
    4790             :         /* Normal case, was recognized by scanner (no conflicting variable) */
    4791             :         return true;
    4792             :     }
    4793             :     else if (token == T_DATUM)
    4794             :     {
    4795             :         /*
    4796             :          * It's a variable, so recheck the string name.  Note we will not
    4797             :          * match composite names (hence an unreserved word followed by "."
    4798             :          * will not be recognized).
    4799             :          */
    4800             :         if (!lval->wdatum.quoted && lval->wdatum.ident != NULL &&
    4801             :             strcmp(lval->wdatum.ident, kw_str) == 0)
    4802             :             return true;
    4803             :     }
    4804             :     return false;               /* not the keyword */
    4805             : }
    4806             : 
    4807             : /*
    4808             :  * Convenience routine to complain when we expected T_DATUM and got T_WORD,
    4809             :  * ie, unrecognized variable.
    4810             :  */
    4811             : static void
    4812             : word_is_not_variable(PLword *word, int location, yyscan_t yyscanner)
    4813             : {
    4814             :     ereport(ERROR,
    4815             :             (errcode(ERRCODE_SYNTAX_ERROR),
    4816             :              errmsg("\"%s\" is not a known variable",
    4817             :                     word->ident),
    4818             :              parser_errposition(location)));
    4819             : }
    4820             : 
    4821             : /* Same, for a CWORD */
    4822             : static void
    4823             : cword_is_not_variable(PLcword *cword, int location, yyscan_t yyscanner)
    4824             : {
    4825             :     ereport(ERROR,
    4826             :             (errcode(ERRCODE_SYNTAX_ERROR),
    4827             :              errmsg("\"%s\" is not a known variable",
    4828             :                     NameListToString(cword->idents)),
    4829             :              parser_errposition(location)));
    4830             : }
    4831             : 
    4832             : /*
    4833             :  * Convenience routine to complain when we expected T_DATUM and got
    4834             :  * something else.  "tok" must be the current token, since we also
    4835             :  * look at yylval and yylloc.
    4836             :  */
    4837             : static void
    4838             : current_token_is_not_variable(int tok, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    4839             : {
    4840             :     if (tok == T_WORD)
    4841             :         word_is_not_variable(&(yylvalp->word), *yyllocp, yyscanner);
    4842             :     else if (tok == T_CWORD)
    4843             :         cword_is_not_variable(&(yylvalp->cword), *yyllocp, yyscanner);
    4844             :     else
    4845             :         yyerror(yyllocp, NULL, yyscanner, "syntax error");
    4846             : }
    4847             : 
    4848             : /* Convenience routine to construct a PLpgSQL_expr struct */
    4849             : static PLpgSQL_expr *
    4850             : make_plpgsql_expr(const char *query,
    4851             :                   RawParseMode parsemode)
    4852             : {
    4853             :     PLpgSQL_expr *expr = palloc0(sizeof(PLpgSQL_expr));
    4854             : 
    4855             :     expr->query = pstrdup(query);
    4856             :     expr->parseMode = parsemode;
    4857             :     expr->func = plpgsql_curr_compile;
    4858             :     expr->ns = plpgsql_ns_top();
    4859             :     /* might get changed later during parsing: */
    4860             :     expr->target_param = -1;
    4861             :     expr->target_is_local = false;
    4862             :     /* other fields are left as zeroes until first execution */
    4863             :     return expr;
    4864             : }
    4865             : 
    4866             : /* Mark a PLpgSQL_expr as being the source of an assignment to target */
    4867             : static void
    4868             : mark_expr_as_assignment_source(PLpgSQL_expr *expr, PLpgSQL_datum *target)
    4869             : {
    4870             :     /*
    4871             :      * Mark the expression as being an assignment source, if target is a
    4872             :      * simple variable.  We don't currently support optimized assignments to
    4873             :      * other DTYPEs, so no need to mark in other cases.
    4874             :      */
    4875             :     if (target->dtype == PLPGSQL_DTYPE_VAR)
    4876             :     {
    4877             :         expr->target_param = target->dno;
    4878             : 
    4879             :         /*
    4880             :          * For now, assume the target is local to the nearest enclosing
    4881             :          * exception block.  That's correct if the function contains no
    4882             :          * exception blocks; otherwise we'll update this later.
    4883             :          */
    4884             :         expr->target_is_local = true;
    4885             :     }
    4886             :     else
    4887             :     {
    4888             :         expr->target_param = -1; /* should be that already */
    4889             :         expr->target_is_local = false; /* ditto */
    4890             :     }
    4891             : }
    4892             : 
    4893             : /* Convenience routine to read an expression with one possible terminator */
    4894             : static PLpgSQL_expr *
    4895             : read_sql_expression(int until, const char *expected, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    4896             : {
    4897             :     return read_sql_construct(until, 0, 0, expected,
    4898             :                               RAW_PARSE_PLPGSQL_EXPR,
    4899             :                               true, true, NULL, NULL,
    4900             :                               yylvalp, yyllocp, yyscanner);
    4901             : }
    4902             : 
    4903             : /* Convenience routine to read an expression with two possible terminators */
    4904             : static PLpgSQL_expr *
    4905             : read_sql_expression2(int until, int until2, const char *expected,
    4906             :                      int *endtoken, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    4907             : {
    4908             :     return read_sql_construct(until, until2, 0, expected,
    4909             :                               RAW_PARSE_PLPGSQL_EXPR,
    4910             :                               true, true, NULL, endtoken,
    4911             :                               yylvalp, yyllocp, yyscanner);
    4912             : }
    4913             : 
    4914             : /* Convenience routine to read a SQL statement that must end with ';' */
    4915             : static PLpgSQL_expr *
    4916             : read_sql_stmt(YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    4917             : {
    4918             :     return read_sql_construct(';', 0, 0, ";",
    4919             :                               RAW_PARSE_DEFAULT,
    4920             :                               false, true, NULL, NULL,
    4921             :                               yylvalp, yyllocp, yyscanner);
    4922             : }
    4923             : 
    4924             : /*
    4925             :  * Read a SQL construct and build a PLpgSQL_expr for it.
    4926             :  *
    4927             :  * until:       token code for expected terminator
    4928             :  * until2:      token code for alternate terminator (pass 0 if none)
    4929             :  * until3:      token code for another alternate terminator (pass 0 if none)
    4930             :  * expected:    text to use in complaining that terminator was not found
    4931             :  * parsemode:   raw_parser() mode to use
    4932             :  * isexpression: whether to say we're reading an "expression" or a "statement"
    4933             :  * valid_sql:   whether to check the syntax of the expr
    4934             :  * startloc:    if not NULL, location of first token is stored at *startloc
    4935             :  * endtoken:    if not NULL, ending token is stored at *endtoken
    4936             :  *              (this is only interesting if until2 or until3 isn't zero)
    4937             :  */
    4938             : static PLpgSQL_expr *
    4939             : read_sql_construct(int until,
    4940             :                    int until2,
    4941             :                    int until3,
    4942             :                    const char *expected,
    4943             :                    RawParseMode parsemode,
    4944             :                    bool isexpression,
    4945             :                    bool valid_sql,
    4946             :                    int *startloc,
    4947             :                    int *endtoken,
    4948             :                    YYSTYPE *yylvalp, YYLTYPE *yyllocp,
    4949             :                    yyscan_t yyscanner)
    4950             : {
    4951             :     int         tok;
    4952             :     StringInfoData ds;
    4953             :     IdentifierLookup save_IdentifierLookup;
    4954             :     int         startlocation = -1;
    4955             :     int         endlocation = -1;
    4956             :     int         parenlevel = 0;
    4957             :     PLpgSQL_expr *expr;
    4958             : 
    4959             :     initStringInfo(&ds);
    4960             : 
    4961             :     /* special lookup mode for identifiers within the SQL text */
    4962             :     save_IdentifierLookup = plpgsql_IdentifierLookup;
    4963             :     plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_EXPR;
    4964             : 
    4965             :     for (;;)
    4966             :     {
    4967             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    4968             :         if (startlocation < 0)   /* remember loc of first token */
    4969             :             startlocation = *yyllocp;
    4970             :         if (tok == until && parenlevel == 0)
    4971             :             break;
    4972             :         if (tok == until2 && parenlevel == 0)
    4973             :             break;
    4974             :         if (tok == until3 && parenlevel == 0)
    4975             :             break;
    4976             :         if (tok == '(' || tok == '[')
    4977             :             parenlevel++;
    4978             :         else if (tok == ')' || tok == ']')
    4979             :         {
    4980             :             parenlevel--;
    4981             :             if (parenlevel < 0)
    4982             :                 yyerror(yyllocp, NULL, yyscanner, "mismatched parentheses");
    4983             :         }
    4984             : 
    4985             :         /*
    4986             :          * End of function definition is an error, and we don't expect to hit
    4987             :          * a semicolon either (unless it's the until symbol, in which case we
    4988             :          * should have fallen out above).
    4989             :          */
    4990             :         if (tok == 0 || tok == ';')
    4991             :         {
    4992             :             if (parenlevel != 0)
    4993             :                 yyerror(yyllocp, NULL, yyscanner, "mismatched parentheses");
    4994             :             if (isexpression)
    4995             :                 ereport(ERROR,
    4996             :                         (errcode(ERRCODE_SYNTAX_ERROR),
    4997             :                          errmsg("missing \"%s\" at end of SQL expression",
    4998             :                                 expected),
    4999             :                          parser_errposition(*yyllocp)));
    5000             :             else
    5001             :                 ereport(ERROR,
    5002             :                         (errcode(ERRCODE_SYNTAX_ERROR),
    5003             :                          errmsg("missing \"%s\" at end of SQL statement",
    5004             :                                 expected),
    5005             :                          parser_errposition(*yyllocp)));
    5006             :         }
    5007             :         /* Remember end+1 location of last accepted token */
    5008             :         endlocation = *yyllocp + plpgsql_token_length(yyscanner);
    5009             :     }
    5010             : 
    5011             :     plpgsql_IdentifierLookup = save_IdentifierLookup;
    5012             : 
    5013             :     if (startloc)
    5014             :         *startloc = startlocation;
    5015             :     if (endtoken)
    5016             :         *endtoken = tok;
    5017             : 
    5018             :     /* give helpful complaint about empty input */
    5019             :     if (startlocation >= endlocation)
    5020             :     {
    5021             :         if (isexpression)
    5022             :             yyerror(yyllocp, NULL, yyscanner, "missing expression");
    5023             :         else
    5024             :             yyerror(yyllocp, NULL, yyscanner, "missing SQL statement");
    5025             :     }
    5026             : 
    5027             :     /*
    5028             :      * We save only the text from startlocation to endlocation-1.  This
    5029             :      * suppresses the "until" token as well as any whitespace or comments
    5030             :      * following the last accepted token.  (We used to strip such trailing
    5031             :      * whitespace by hand, but that causes problems if there's a "-- comment"
    5032             :      * in front of said whitespace.)
    5033             :      */
    5034             :     plpgsql_append_source_text(&ds, startlocation, endlocation, yyscanner);
    5035             : 
    5036             :     expr = make_plpgsql_expr(ds.data, parsemode);
    5037             :     pfree(ds.data);
    5038             : 
    5039             :     if (valid_sql)
    5040             :         check_sql_expr(expr->query, expr->parseMode, startlocation, yyscanner);
    5041             : 
    5042             :     return expr;
    5043             : }
    5044             : 
    5045             : /*
    5046             :  * Read a datatype declaration, consuming the current lookahead token if any.
    5047             :  * Returns a PLpgSQL_type struct.
    5048             :  */
    5049             : static PLpgSQL_type *
    5050             : read_datatype(int tok, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    5051             : {
    5052             :     StringInfoData ds;
    5053             :     char       *type_name;
    5054             :     int         startlocation;
    5055             :     PLpgSQL_type *result = NULL;
    5056             :     int         parenlevel = 0;
    5057             : 
    5058             :     /* Should only be called while parsing DECLARE sections */
    5059             :     Assert(plpgsql_IdentifierLookup == IDENTIFIER_LOOKUP_DECLARE);
    5060             : 
    5061             :     /* Often there will be a lookahead token, but if not, get one */
    5062             :     if (tok == YYEMPTY)
    5063             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    5064             : 
    5065             :     /* The current token is the start of what we'll pass to parse_datatype */
    5066             :     startlocation = *yyllocp;
    5067             : 
    5068             :     /*
    5069             :      * If we have a simple or composite identifier, check for %TYPE and
    5070             :      * %ROWTYPE constructs.
    5071             :      */
    5072             :     if (tok == T_WORD)
    5073             :     {
    5074             :         char       *dtname = yylvalp->word.ident;
    5075             : 
    5076             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    5077             :         if (tok == '%')
    5078             :         {
    5079             :             tok = yylex(yylvalp, yyllocp, yyscanner);
    5080             :             if (tok_is_keyword(tok, yylvalp,
    5081             :                                K_TYPE, "type"))
    5082             :                 result = plpgsql_parse_wordtype(dtname);
    5083             :             else if (tok_is_keyword(tok, yylvalp,
    5084             :                                     K_ROWTYPE, "rowtype"))
    5085             :                 result = plpgsql_parse_wordrowtype(dtname);
    5086             :         }
    5087             :     }
    5088             :     else if (plpgsql_token_is_unreserved_keyword(tok))
    5089             :     {
    5090             :         char       *dtname = pstrdup(yylvalp->keyword);
    5091             : 
    5092             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    5093             :         if (tok == '%')
    5094             :         {
    5095             :             tok = yylex(yylvalp, yyllocp, yyscanner);
    5096             :             if (tok_is_keyword(tok, yylvalp,
    5097             :                                K_TYPE, "type"))
    5098             :                 result = plpgsql_parse_wordtype(dtname);
    5099             :             else if (tok_is_keyword(tok, yylvalp,
    5100             :                                     K_ROWTYPE, "rowtype"))
    5101             :                 result = plpgsql_parse_wordrowtype(dtname);
    5102             :         }
    5103             :     }
    5104             :     else if (tok == T_CWORD)
    5105             :     {
    5106             :         List       *dtnames = yylvalp->cword.idents;
    5107             : 
    5108             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    5109             :         if (tok == '%')
    5110             :         {
    5111             :             tok = yylex(yylvalp, yyllocp, yyscanner);
    5112             :             if (tok_is_keyword(tok, yylvalp,
    5113             :                                K_TYPE, "type"))
    5114             :                 result = plpgsql_parse_cwordtype(dtnames);
    5115             :             else if (tok_is_keyword(tok, yylvalp,
    5116             :                                     K_ROWTYPE, "rowtype"))
    5117             :                 result = plpgsql_parse_cwordrowtype(dtnames);
    5118             :         }
    5119             :     }
    5120             : 
    5121             :     /*
    5122             :      * If we recognized a %TYPE or %ROWTYPE construct, see if it is followed
    5123             :      * by array decoration: [ ARRAY ] [ '[' [ iconst ] ']' [ ... ] ]
    5124             :      *
    5125             :      * Like the core parser, we ignore the specific numbers and sizes of
    5126             :      * dimensions; arrays of different dimensionality are still the same type
    5127             :      * in Postgres.
    5128             :      */
    5129             :     if (result)
    5130             :     {
    5131             :         bool        is_array = false;
    5132             : 
    5133             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    5134             :         if (tok_is_keyword(tok, yylvalp,
    5135             :                            K_ARRAY, "array"))
    5136             :         {
    5137             :             is_array = true;
    5138             :             tok = yylex(yylvalp, yyllocp, yyscanner);
    5139             :         }
    5140             :         while (tok == '[')
    5141             :         {
    5142             :             is_array = true;
    5143             :             tok = yylex(yylvalp, yyllocp, yyscanner);
    5144             :             if (tok == ICONST)
    5145             :                 tok = yylex(yylvalp, yyllocp, yyscanner);
    5146             :             if (tok != ']')
    5147             :                 yyerror(yyllocp, NULL, yyscanner, "syntax error, expected \"]\"");
    5148             :             tok = yylex(yylvalp, yyllocp, yyscanner);
    5149             :         }
    5150             :         plpgsql_push_back_token(tok, yylvalp, yyllocp, yyscanner);
    5151             : 
    5152             :         if (is_array)
    5153             :             result = plpgsql_build_datatype_arrayof(result);
    5154             : 
    5155             :         return result;
    5156             :     }
    5157             : 
    5158             :     /*
    5159             :      * Not %TYPE or %ROWTYPE, so scan to the end of the datatype declaration,
    5160             :      * which could include typmod or array decoration.  We are not very picky
    5161             :      * here, instead relying on parse_datatype to complain about garbage.  But
    5162             :      * we must count parens to handle typmods within cursor_arg correctly.
    5163             :      */
    5164             :     while (tok != ';')
    5165             :     {
    5166             :         if (tok == 0)
    5167             :         {
    5168             :             if (parenlevel != 0)
    5169             :                 yyerror(yyllocp, NULL, yyscanner, "mismatched parentheses");
    5170             :             else
    5171             :                 yyerror(yyllocp, NULL, yyscanner, "incomplete data type declaration");
    5172             :         }
    5173             :         /* Possible followers for datatype in a declaration */
    5174             :         if (tok == K_COLLATE || tok == K_NOT ||
    5175             :             tok == '=' || tok == COLON_EQUALS || tok == K_DEFAULT)
    5176             :             break;
    5177             :         /* Possible followers for datatype in a cursor_arg list */
    5178             :         if ((tok == ',' || tok == ')') && parenlevel == 0)
    5179             :             break;
    5180             :         if (tok == '(')
    5181             :             parenlevel++;
    5182             :         else if (tok == ')')
    5183             :             parenlevel--;
    5184             : 
    5185             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    5186             :     }
    5187             : 
    5188             :     /* set up ds to contain complete typename text */
    5189             :     initStringInfo(&ds);
    5190             :     plpgsql_append_source_text(&ds, startlocation, *yyllocp, yyscanner);
    5191             :     type_name = ds.data;
    5192             : 
    5193             :     if (type_name[0] == '\0')
    5194             :         yyerror(yyllocp, NULL, yyscanner, "missing data type declaration");
    5195             : 
    5196             :     result = parse_datatype(type_name, startlocation, yyscanner);
    5197             : 
    5198             :     pfree(ds.data);
    5199             : 
    5200             :     plpgsql_push_back_token(tok, yylvalp, yyllocp, yyscanner);
    5201             : 
    5202             :     return result;
    5203             : }
    5204             : 
    5205             : /*
    5206             :  * Read a generic SQL statement.  We have already read its first token;
    5207             :  * firsttoken is that token's code and location its starting location.
    5208             :  * If firsttoken == T_WORD, pass its yylval value as "word", else pass NULL.
    5209             :  */
    5210             : static PLpgSQL_stmt *
    5211             : make_execsql_stmt(int firsttoken, int location, PLword *word, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    5212             : {
    5213             :     StringInfoData ds;
    5214             :     IdentifierLookup save_IdentifierLookup;
    5215             :     PLpgSQL_stmt_execsql *execsql;
    5216             :     PLpgSQL_expr *expr;
    5217             :     PLpgSQL_variable *target = NULL;
    5218             :     int         tok;
    5219             :     int         prev_tok;
    5220             :     bool        have_into = false;
    5221             :     bool        have_strict = false;
    5222             :     int         into_start_loc = -1;
    5223             :     int         into_end_loc = -1;
    5224             :     int         paren_depth = 0;
    5225             :     int         begin_depth = 0;
    5226             :     bool        in_routine_definition = false;
    5227             :     int         token_count = 0;
    5228             :     char        tokens[4];      /* records the first few tokens */
    5229             : 
    5230             :     initStringInfo(&ds);
    5231             : 
    5232             :     memset(tokens, 0, sizeof(tokens));
    5233             : 
    5234             :     /* special lookup mode for identifiers within the SQL text */
    5235             :     save_IdentifierLookup = plpgsql_IdentifierLookup;
    5236             :     plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_EXPR;
    5237             : 
    5238             :     /*
    5239             :      * Scan to the end of the SQL command.  Identify any INTO-variables clause
    5240             :      * lurking within it, and parse that via read_into_target().
    5241             :      *
    5242             :      * The end of the statement is defined by a semicolon ... except that
    5243             :      * semicolons within parentheses or BEGIN/END blocks don't terminate a
    5244             :      * statement.  We follow psql's lead in not recognizing BEGIN/END except
    5245             :      * after CREATE [OR REPLACE] {FUNCTION|PROCEDURE}.  END can also appear
    5246             :      * within a CASE construct, so we treat CASE/END like BEGIN/END.
    5247             :      *
    5248             :      * Because INTO is sometimes used in the main SQL grammar, we have to be
    5249             :      * careful not to take any such usage of INTO as a PL/pgSQL INTO clause.
    5250             :      * There are currently three such cases:
    5251             :      *
    5252             :      * 1. SELECT ... INTO.  We don't care, we just override that with the
    5253             :      * PL/pgSQL definition.
    5254             :      *
    5255             :      * 2. INSERT INTO.  This is relatively easy to recognize since the words
    5256             :      * must appear adjacently; but we can't assume INSERT starts the command,
    5257             :      * because it can appear in CREATE RULE or WITH.  Unfortunately, INSERT is
    5258             :      * *not* fully reserved, so that means there is a chance of a false match;
    5259             :      * but it's not very likely.
    5260             :      *
    5261             :      * 3. IMPORT FOREIGN SCHEMA ... INTO.  This is not allowed in CREATE RULE
    5262             :      * or WITH, so we just check for IMPORT as the command's first token. (If
    5263             :      * IMPORT FOREIGN SCHEMA returned data someone might wish to capture with
    5264             :      * an INTO-variables clause, we'd have to work much harder here.)
    5265             :      *
    5266             :      * Fortunately, INTO is a fully reserved word in the main grammar, so at
    5267             :      * least we need not worry about it appearing as an identifier.
    5268             :      *
    5269             :      * Any future additional uses of INTO in the main grammar will doubtless
    5270             :      * break this logic again ... beware!
    5271             :      */
    5272             :     tok = firsttoken;
    5273             :     if (tok == T_WORD && strcmp(word->ident, "create") == 0)
    5274             :         tokens[token_count] = 'c';
    5275             :     token_count++;
    5276             : 
    5277             :     for (;;)
    5278             :     {
    5279             :         prev_tok = tok;
    5280             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    5281             :         if (have_into && into_end_loc < 0)
    5282             :             into_end_loc = *yyllocp;    /* token after the INTO part */
    5283             :         /* Detect CREATE [OR REPLACE] {FUNCTION|PROCEDURE} */
    5284             :         if (tokens[0] == 'c' && token_count < sizeof(tokens))
    5285             :         {
    5286             :             if (tok == K_OR)
    5287             :                 tokens[token_count] = 'o';
    5288             :             else if (tok == T_WORD &&
    5289             :                      strcmp(yylvalp->word.ident, "replace") == 0)
    5290             :                 tokens[token_count] = 'r';
    5291             :             else if (tok == T_WORD &&
    5292             :                      strcmp(yylvalp->word.ident, "function") == 0)
    5293             :                 tokens[token_count] = 'f';
    5294             :             else if (tok == T_WORD &&
    5295             :                      strcmp(yylvalp->word.ident, "procedure") == 0)
    5296             :                 tokens[token_count] = 'f';  /* treat same as "function" */
    5297             :             if (tokens[1] == 'f' ||
    5298             :                 (tokens[1] == 'o' && tokens[2] == 'r' && tokens[3] == 'f'))
    5299             :                 in_routine_definition = true;
    5300             :             token_count++;
    5301             :         }
    5302             :         /* Track paren nesting (needed for CREATE RULE syntax) */
    5303             :         if (tok == '(')
    5304             :             paren_depth++;
    5305             :         else if (tok == ')' && paren_depth > 0)
    5306             :             paren_depth--;
    5307             :         /* We need track BEGIN/END nesting only in a routine definition */
    5308             :         if (in_routine_definition && paren_depth == 0)
    5309             :         {
    5310             :             if (tok == K_BEGIN || tok == K_CASE)
    5311             :                 begin_depth++;
    5312             :             else if (tok == K_END && begin_depth > 0)
    5313             :                 begin_depth--;
    5314             :         }
    5315             :         /* Command-ending semicolon? */
    5316             :         if (tok == ';' && paren_depth == 0 && begin_depth == 0)
    5317             :             break;
    5318             :         if (tok == 0)
    5319             :             yyerror(yyllocp, NULL, yyscanner, "unexpected end of function definition");
    5320             :         if (tok == K_INTO)
    5321             :         {
    5322             :             if (prev_tok == K_INSERT)
    5323             :                 continue;       /* INSERT INTO is not an INTO-target */
    5324             :             if (prev_tok == K_MERGE)
    5325             :                 continue;       /* MERGE INTO is not an INTO-target */
    5326             :             if (firsttoken == K_IMPORT)
    5327             :                 continue;       /* IMPORT ... INTO is not an INTO-target */
    5328             :             if (have_into)
    5329             :                 yyerror(yyllocp, NULL, yyscanner, "INTO specified more than once");
    5330             :             have_into = true;
    5331             :             into_start_loc = *yyllocp;
    5332             :             plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_NORMAL;
    5333             :             read_into_target(&target, &have_strict, yylvalp, yyllocp, yyscanner);
    5334             :             plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_EXPR;
    5335             :         }
    5336             :     }
    5337             : 
    5338             :     plpgsql_IdentifierLookup = save_IdentifierLookup;
    5339             : 
    5340             :     if (have_into)
    5341             :     {
    5342             :         /*
    5343             :          * Insert an appropriate number of spaces corresponding to the INTO
    5344             :          * text, so that locations within the redacted SQL statement still
    5345             :          * line up with those in the original source text.
    5346             :          */
    5347             :         plpgsql_append_source_text(&ds, location, into_start_loc, yyscanner);
    5348             :         appendStringInfoSpaces(&ds, into_end_loc - into_start_loc);
    5349             :         plpgsql_append_source_text(&ds, into_end_loc, *yyllocp, yyscanner);
    5350             :     }
    5351             :     else
    5352             :         plpgsql_append_source_text(&ds, location, *yyllocp, yyscanner);
    5353             : 
    5354             :     /* trim any trailing whitespace, for neatness */
    5355             :     while (ds.len > 0 && scanner_isspace(ds.data[ds.len - 1]))
    5356             :         ds.data[--ds.len] = '\0';
    5357             : 
    5358             :     expr = make_plpgsql_expr(ds.data, RAW_PARSE_DEFAULT);
    5359             :     pfree(ds.data);
    5360             : 
    5361             :     check_sql_expr(expr->query, expr->parseMode, location, yyscanner);
    5362             : 
    5363             :     execsql = palloc0(sizeof(PLpgSQL_stmt_execsql));
    5364             :     execsql->cmd_type = PLPGSQL_STMT_EXECSQL;
    5365             :     execsql->lineno = plpgsql_location_to_lineno(location, yyscanner);
    5366             :     execsql->stmtid = ++plpgsql_curr_compile->nstatements;
    5367             :     execsql->sqlstmt = expr;
    5368             :     execsql->into = have_into;
    5369             :     execsql->strict = have_strict;
    5370             :     execsql->target = target;
    5371             : 
    5372             :     return (PLpgSQL_stmt *) execsql;
    5373             : }
    5374             : 
    5375             : 
    5376             : /*
    5377             :  * Read FETCH or MOVE direction clause (everything through FROM/IN).
    5378             :  */
    5379             : static PLpgSQL_stmt_fetch *
    5380             : read_fetch_direction(YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    5381             : {
    5382             :     PLpgSQL_stmt_fetch *fetch;
    5383             :     int         tok;
    5384             :     bool        check_FROM = true;
    5385             : 
    5386             :     /*
    5387             :      * We create the PLpgSQL_stmt_fetch struct here, but only fill in the
    5388             :      * fields arising from the optional direction clause
    5389             :      */
    5390             :     fetch = (PLpgSQL_stmt_fetch *) palloc0(sizeof(PLpgSQL_stmt_fetch));
    5391             :     fetch->cmd_type = PLPGSQL_STMT_FETCH;
    5392             :     fetch->stmtid = ++plpgsql_curr_compile->nstatements;
    5393             :     /* set direction defaults: */
    5394             :     fetch->direction = FETCH_FORWARD;
    5395             :     fetch->how_many = 1;
    5396             :     fetch->expr = NULL;
    5397             :     fetch->returns_multiple_rows = false;
    5398             : 
    5399             :     tok = yylex(yylvalp, yyllocp, yyscanner);
    5400             :     if (tok == 0)
    5401             :         yyerror(yyllocp, NULL, yyscanner, "unexpected end of function definition");
    5402             : 
    5403             :     if (tok_is_keyword(tok, yylvalp,
    5404             :                        K_NEXT, "next"))
    5405             :     {
    5406             :         /* use defaults */
    5407             :     }
    5408             :     else if (tok_is_keyword(tok, yylvalp,
    5409             :                             K_PRIOR, "prior"))
    5410             :     {
    5411             :         fetch->direction = FETCH_BACKWARD;
    5412             :     }
    5413             :     else if (tok_is_keyword(tok, yylvalp,
    5414             :                             K_FIRST, "first"))
    5415             :     {
    5416             :         fetch->direction = FETCH_ABSOLUTE;
    5417             :     }
    5418             :     else if (tok_is_keyword(tok, yylvalp,
    5419             :                             K_LAST, "last"))
    5420             :     {
    5421             :         fetch->direction = FETCH_ABSOLUTE;
    5422             :         fetch->how_many = -1;
    5423             :     }
    5424             :     else if (tok_is_keyword(tok, yylvalp,
    5425             :                             K_ABSOLUTE, "absolute"))
    5426             :     {
    5427             :         fetch->direction = FETCH_ABSOLUTE;
    5428             :         fetch->expr = read_sql_expression2(K_FROM, K_IN,
    5429             :                                            "FROM or IN",
    5430             :                                            NULL, yylvalp, yyllocp, yyscanner);
    5431             :         check_FROM = false;
    5432             :     }
    5433             :     else if (tok_is_keyword(tok, yylvalp,
    5434             :                             K_RELATIVE, "relative"))
    5435             :     {
    5436             :         fetch->direction = FETCH_RELATIVE;
    5437             :         fetch->expr = read_sql_expression2(K_FROM, K_IN,
    5438             :                                            "FROM or IN",
    5439             :                                            NULL, yylvalp, yyllocp, yyscanner);
    5440             :         check_FROM = false;
    5441             :     }
    5442             :     else if (tok_is_keyword(tok, yylvalp,
    5443             :                             K_ALL, "all"))
    5444             :     {
    5445             :         fetch->how_many = FETCH_ALL;
    5446             :         fetch->returns_multiple_rows = true;
    5447             :     }
    5448             :     else if (tok_is_keyword(tok, yylvalp,
    5449             :                             K_FORWARD, "forward"))
    5450             :     {
    5451             :         complete_direction(fetch, &check_FROM, yylvalp, yyllocp, yyscanner);
    5452             :     }
    5453             :     else if (tok_is_keyword(tok, yylvalp,
    5454             :                             K_BACKWARD, "backward"))
    5455             :     {
    5456             :         fetch->direction = FETCH_BACKWARD;
    5457             :         complete_direction(fetch, &check_FROM, yylvalp, yyllocp, yyscanner);
    5458             :     }
    5459             :     else if (tok == K_FROM || tok == K_IN)
    5460             :     {
    5461             :         /* empty direction */
    5462             :         check_FROM = false;
    5463             :     }
    5464             :     else if (tok == T_DATUM)
    5465             :     {
    5466             :         /* Assume there's no direction clause and tok is a cursor name */
    5467             :         plpgsql_push_back_token(tok, yylvalp, yyllocp, yyscanner);
    5468             :         check_FROM = false;
    5469             :     }
    5470             :     else
    5471             :     {
    5472             :         /*
    5473             :          * Assume it's a count expression with no preceding keyword. Note: we
    5474             :          * allow this syntax because core SQL does, but it's ambiguous with
    5475             :          * the case of an omitted direction clause; for instance, "MOVE n IN
    5476             :          * c" will fail if n is a variable, because the preceding else-arm
    5477             :          * will trigger.  Perhaps this can be improved someday, but it hardly
    5478             :          * seems worth a lot of work.
    5479             :          */
    5480             :         plpgsql_push_back_token(tok, yylvalp, yyllocp, yyscanner);
    5481             :         fetch->expr = read_sql_expression2(K_FROM, K_IN,
    5482             :                                            "FROM or IN",
    5483             :                                            NULL, yylvalp, yyllocp, yyscanner);
    5484             :         fetch->returns_multiple_rows = true;
    5485             :         check_FROM = false;
    5486             :     }
    5487             : 
    5488             :     /* check FROM or IN keyword after direction's specification */
    5489             :     if (check_FROM)
    5490             :     {
    5491             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    5492             :         if (tok != K_FROM && tok != K_IN)
    5493             :             yyerror(yyllocp, NULL, yyscanner, "expected FROM or IN");
    5494             :     }
    5495             : 
    5496             :     return fetch;
    5497             : }
    5498             : 
    5499             : /*
    5500             :  * Process remainder of FETCH/MOVE direction after FORWARD or BACKWARD.
    5501             :  * Allows these cases:
    5502             :  *   FORWARD expr,  FORWARD ALL,  FORWARD
    5503             :  *   BACKWARD expr, BACKWARD ALL, BACKWARD
    5504             :  */
    5505             : static void
    5506             : complete_direction(PLpgSQL_stmt_fetch *fetch, bool *check_FROM, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    5507             : {
    5508             :     int         tok;
    5509             : 
    5510             :     tok = yylex(yylvalp, yyllocp, yyscanner);
    5511             :     if (tok == 0)
    5512             :         yyerror(yyllocp, NULL, yyscanner, "unexpected end of function definition");
    5513             : 
    5514             :     if (tok == K_FROM || tok == K_IN)
    5515             :     {
    5516             :         *check_FROM = false;
    5517             :         return;
    5518             :     }
    5519             : 
    5520             :     if (tok == K_ALL)
    5521             :     {
    5522             :         fetch->how_many = FETCH_ALL;
    5523             :         fetch->returns_multiple_rows = true;
    5524             :         *check_FROM = true;
    5525             :         return;
    5526             :     }
    5527             : 
    5528             :     plpgsql_push_back_token(tok, yylvalp, yyllocp, yyscanner);
    5529             :     fetch->expr = read_sql_expression2(K_FROM, K_IN,
    5530             :                                        "FROM or IN",
    5531             :                                        NULL, yylvalp, yyllocp, yyscanner);
    5532             :     fetch->returns_multiple_rows = true;
    5533             :     *check_FROM = false;
    5534             : }
    5535             : 
    5536             : 
    5537             : static PLpgSQL_stmt *
    5538             : make_return_stmt(int location, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    5539             : {
    5540             :     PLpgSQL_stmt_return *new;
    5541             : 
    5542             :     new = palloc0(sizeof(PLpgSQL_stmt_return));
    5543             :     new->cmd_type = PLPGSQL_STMT_RETURN;
    5544             :     new->lineno = plpgsql_location_to_lineno(location, yyscanner);
    5545             :     new->stmtid = ++plpgsql_curr_compile->nstatements;
    5546             :     new->expr = NULL;
    5547             :     new->retvarno = -1;
    5548             : 
    5549             :     if (plpgsql_curr_compile->fn_retset)
    5550             :     {
    5551             :         if (yylex(yylvalp, yyllocp, yyscanner) != ';')
    5552             :             ereport(ERROR,
    5553             :                     (errcode(ERRCODE_DATATYPE_MISMATCH),
    5554             :                      errmsg("RETURN cannot have a parameter in function returning set"),
    5555             :                      errhint("Use RETURN NEXT or RETURN QUERY."),
    5556             :                      parser_errposition(*yyllocp)));
    5557             :     }
    5558             :     else if (plpgsql_curr_compile->fn_rettype == VOIDOID)
    5559             :     {
    5560             :         if (yylex(yylvalp, yyllocp, yyscanner) != ';')
    5561             :         {
    5562             :             if (plpgsql_curr_compile->fn_prokind == PROKIND_PROCEDURE)
    5563             :                 ereport(ERROR,
    5564             :                         (errcode(ERRCODE_SYNTAX_ERROR),
    5565             :                          errmsg("RETURN cannot have a parameter in a procedure"),
    5566             :                          parser_errposition(*yyllocp)));
    5567             :             else
    5568             :                 ereport(ERROR,
    5569             :                         (errcode(ERRCODE_DATATYPE_MISMATCH),
    5570             :                          errmsg("RETURN cannot have a parameter in function returning void"),
    5571             :                          parser_errposition(*yyllocp)));
    5572             :         }
    5573             :     }
    5574             :     else if (plpgsql_curr_compile->out_param_varno >= 0)
    5575             :     {
    5576             :         if (yylex(yylvalp, yyllocp, yyscanner) != ';')
    5577             :             ereport(ERROR,
    5578             :                     (errcode(ERRCODE_DATATYPE_MISMATCH),
    5579             :                      errmsg("RETURN cannot have a parameter in function with OUT parameters"),
    5580             :                      parser_errposition(*yyllocp)));
    5581             :         new->retvarno = plpgsql_curr_compile->out_param_varno;
    5582             :     }
    5583             :     else
    5584             :     {
    5585             :         /*
    5586             :          * We want to special-case simple variable references for efficiency.
    5587             :          * So peek ahead to see if that's what we have.
    5588             :          */
    5589             :         int         tok = yylex(yylvalp, yyllocp, yyscanner);
    5590             : 
    5591             :         if (tok == T_DATUM && plpgsql_peek(yyscanner) == ';' &&
    5592             :             (yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_VAR ||
    5593             :              yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_PROMISE ||
    5594             :              yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_ROW ||
    5595             :              yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_REC))
    5596             :         {
    5597             :             new->retvarno = yylvalp->wdatum.datum->dno;
    5598             :             /* eat the semicolon token that we only peeked at above */
    5599             :             tok = yylex(yylvalp, yyllocp, yyscanner);
    5600             :             Assert(tok == ';');
    5601             :         }
    5602             :         else
    5603             :         {
    5604             :             /*
    5605             :              * Not (just) a variable name, so treat as expression.
    5606             :              *
    5607             :              * Note that a well-formed expression is _required_ here; anything
    5608             :              * else is a compile-time error.
    5609             :              */
    5610             :             plpgsql_push_back_token(tok, yylvalp, yyllocp, yyscanner);
    5611             :             new->expr = read_sql_expression(';', ";", yylvalp, yyllocp, yyscanner);
    5612             :         }
    5613             :     }
    5614             : 
    5615             :     return (PLpgSQL_stmt *) new;
    5616             : }
    5617             : 
    5618             : 
    5619             : static PLpgSQL_stmt *
    5620             : make_return_next_stmt(int location, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    5621             : {
    5622             :     PLpgSQL_stmt_return_next *new;
    5623             : 
    5624             :     if (!plpgsql_curr_compile->fn_retset)
    5625             :         ereport(ERROR,
    5626             :                 (errcode(ERRCODE_DATATYPE_MISMATCH),
    5627             :                  errmsg("cannot use RETURN NEXT in a non-SETOF function"),
    5628             :                  parser_errposition(location)));
    5629             : 
    5630             :     new = palloc0(sizeof(PLpgSQL_stmt_return_next));
    5631             :     new->cmd_type = PLPGSQL_STMT_RETURN_NEXT;
    5632             :     new->lineno = plpgsql_location_to_lineno(location, yyscanner);
    5633             :     new->stmtid = ++plpgsql_curr_compile->nstatements;
    5634             :     new->expr = NULL;
    5635             :     new->retvarno = -1;
    5636             : 
    5637             :     if (plpgsql_curr_compile->out_param_varno >= 0)
    5638             :     {
    5639             :         if (yylex(yylvalp, yyllocp, yyscanner) != ';')
    5640             :             ereport(ERROR,
    5641             :                     (errcode(ERRCODE_DATATYPE_MISMATCH),
    5642             :                      errmsg("RETURN NEXT cannot have a parameter in function with OUT parameters"),
    5643             :                      parser_errposition(*yyllocp)));
    5644             :         new->retvarno = plpgsql_curr_compile->out_param_varno;
    5645             :     }
    5646             :     else
    5647             :     {
    5648             :         /*
    5649             :          * We want to special-case simple variable references for efficiency.
    5650             :          * So peek ahead to see if that's what we have.
    5651             :          */
    5652             :         int         tok = yylex(yylvalp, yyllocp, yyscanner);
    5653             : 
    5654             :         if (tok == T_DATUM && plpgsql_peek(yyscanner) == ';' &&
    5655             :             (yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_VAR ||
    5656             :              yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_PROMISE ||
    5657             :              yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_ROW ||
    5658             :              yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_REC))
    5659             :         {
    5660             :             new->retvarno = yylvalp->wdatum.datum->dno;
    5661             :             /* eat the semicolon token that we only peeked at above */
    5662             :             tok = yylex(yylvalp, yyllocp, yyscanner);
    5663             :             Assert(tok == ';');
    5664             :         }
    5665             :         else
    5666             :         {
    5667             :             /*
    5668             :              * Not (just) a variable name, so treat as expression.
    5669             :              *
    5670             :              * Note that a well-formed expression is _required_ here; anything
    5671             :              * else is a compile-time error.
    5672             :              */
    5673             :             plpgsql_push_back_token(tok, yylvalp, yyllocp, yyscanner);
    5674             :             new->expr = read_sql_expression(';', ";", yylvalp, yyllocp, yyscanner);
    5675             :         }
    5676             :     }
    5677             : 
    5678             :     return (PLpgSQL_stmt *) new;
    5679             : }
    5680             : 
    5681             : 
    5682             : static PLpgSQL_stmt *
    5683             : make_return_query_stmt(int location, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    5684             : {
    5685             :     PLpgSQL_stmt_return_query *new;
    5686             :     int         tok;
    5687             : 
    5688             :     if (!plpgsql_curr_compile->fn_retset)
    5689             :         ereport(ERROR,
    5690             :                 (errcode(ERRCODE_DATATYPE_MISMATCH),
    5691             :                  errmsg("cannot use RETURN QUERY in a non-SETOF function"),
    5692             :                  parser_errposition(location)));
    5693             : 
    5694             :     new = palloc0(sizeof(PLpgSQL_stmt_return_query));
    5695             :     new->cmd_type = PLPGSQL_STMT_RETURN_QUERY;
    5696             :     new->lineno = plpgsql_location_to_lineno(location, yyscanner);
    5697             :     new->stmtid = ++plpgsql_curr_compile->nstatements;
    5698             : 
    5699             :     /* check for RETURN QUERY EXECUTE */
    5700             :     tok = yylex(yylvalp, yyllocp, yyscanner);
    5701             :     if (!tok_is_keyword(tok, yylvalp, K_EXECUTE, "execute"))
    5702             :     {
    5703             :         /* ordinary static query */
    5704             :         plpgsql_push_back_token(tok, yylvalp, yyllocp, yyscanner);
    5705             :         new->query = read_sql_stmt(yylvalp, yyllocp, yyscanner);
    5706             :     }
    5707             :     else
    5708             :     {
    5709             :         /* dynamic SQL */
    5710             :         int         term;
    5711             : 
    5712             :         new->dynquery = read_sql_expression2(';', K_USING, "; or USING",
    5713             :                                              &term, yylvalp, yyllocp, yyscanner);
    5714             :         if (term == K_USING)
    5715             :         {
    5716             :             do
    5717             :             {
    5718             :                 PLpgSQL_expr *expr;
    5719             : 
    5720             :                 expr = read_sql_expression2(',', ';', ", or ;", &term, yylvalp, yyllocp, yyscanner);
    5721             :                 new->params = lappend(new->params, expr);
    5722             :             } while (term == ',');
    5723             :         }
    5724             :     }
    5725             : 
    5726             :     return (PLpgSQL_stmt *) new;
    5727             : }
    5728             : 
    5729             : 
    5730             : /* convenience routine to fetch the name of a T_DATUM */
    5731             : static char *
    5732             : NameOfDatum(PLwdatum *wdatum)
    5733             : {
    5734             :     if (wdatum->ident)
    5735             :         return wdatum->ident;
    5736             :     Assert(wdatum->idents != NIL);
    5737             :     return NameListToString(wdatum->idents);
    5738             : }
    5739             : 
    5740             : static void
    5741             : check_assignable(PLpgSQL_datum *datum, int location, yyscan_t yyscanner)
    5742             : {
    5743             :     switch (datum->dtype)
    5744             :     {
    5745             :         case PLPGSQL_DTYPE_VAR:
    5746             :         case PLPGSQL_DTYPE_PROMISE:
    5747             :         case PLPGSQL_DTYPE_REC:
    5748             :             if (((PLpgSQL_variable *) datum)->isconst)
    5749             :                 ereport(ERROR,
    5750             :                         (errcode(ERRCODE_ERROR_IN_ASSIGNMENT),
    5751             :                          errmsg("variable \"%s\" is declared CONSTANT",
    5752             :                                 ((PLpgSQL_variable *) datum)->refname),
    5753             :                          parser_errposition(location)));
    5754             :             break;
    5755             :         case PLPGSQL_DTYPE_ROW:
    5756             :             /* always assignable; member vars were checked at compile time */
    5757             :             break;
    5758             :         case PLPGSQL_DTYPE_RECFIELD:
    5759             :             /* assignable if parent record is */
    5760             :             check_assignable(plpgsql_Datums[((PLpgSQL_recfield *) datum)->recparentno],
    5761             :                              location, yyscanner);
    5762             :             break;
    5763             :         default:
    5764             :             elog(ERROR, "unrecognized dtype: %d", datum->dtype);
    5765             :             break;
    5766             :     }
    5767             : }
    5768             : 
    5769             : /*
    5770             :  * Read the argument of an INTO clause.  On entry, we have just read the
    5771             :  * INTO keyword.
    5772             :  */
    5773             : static void
    5774             : read_into_target(PLpgSQL_variable **target, bool *strict, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    5775             : {
    5776             :     int         tok;
    5777             : 
    5778             :     /* Set default results */
    5779             :     *target = NULL;
    5780             :     if (strict)
    5781             :         *strict = false;
    5782             : 
    5783             :     tok = yylex(yylvalp, yyllocp, yyscanner);
    5784             :     if (strict && tok_is_keyword(tok, yylvalp, K_STRICT, "strict"))
    5785             :     {
    5786             :         *strict = true;
    5787             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    5788             :     }
    5789             : 
    5790             :     /*
    5791             :      * Currently, a row or record variable can be the single INTO target, but
    5792             :      * not a member of a multi-target list.  So we throw error if there is a
    5793             :      * comma after it, because that probably means the user tried to write a
    5794             :      * multi-target list.  If this ever gets generalized, we should probably
    5795             :      * refactor read_into_scalar_list so it handles all cases.
    5796             :      */
    5797             :     switch (tok)
    5798             :     {
    5799             :         case T_DATUM:
    5800             :             if (yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_ROW ||
    5801             :                 yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_REC)
    5802             :             {
    5803             :                 check_assignable(yylvalp->wdatum.datum, *yyllocp, yyscanner);
    5804             :                 *target = (PLpgSQL_variable *) yylvalp->wdatum.datum;
    5805             : 
    5806             :                 if ((tok = yylex(yylvalp, yyllocp, yyscanner)) == ',')
    5807             :                     ereport(ERROR,
    5808             :                             (errcode(ERRCODE_SYNTAX_ERROR),
    5809             :                              errmsg("record variable cannot be part of multiple-item INTO list"),
    5810             :                              parser_errposition(*yyllocp)));
    5811             :                 plpgsql_push_back_token(tok, yylvalp, yyllocp, yyscanner);
    5812             :             }
    5813             :             else
    5814             :             {
    5815             :                 *target = (PLpgSQL_variable *)
    5816             :                     read_into_scalar_list(NameOfDatum(&(yylvalp->wdatum)),
    5817             :                                           yylvalp->wdatum.datum, *yyllocp, yylvalp, yyllocp, yyscanner);
    5818             :             }
    5819             :             break;
    5820             : 
    5821             :         default:
    5822             :             /* just to give a better message than "syntax error" */
    5823             :             current_token_is_not_variable(tok, yylvalp, yyllocp, yyscanner);
    5824             :     }
    5825             : }
    5826             : 
    5827             : /*
    5828             :  * Given the first datum and name in the INTO list, continue to read
    5829             :  * comma-separated scalar variables until we run out. Then construct
    5830             :  * and return a fake "row" variable that represents the list of
    5831             :  * scalars.
    5832             :  */
    5833             : static PLpgSQL_row *
    5834             : read_into_scalar_list(char *initial_name,
    5835             :                       PLpgSQL_datum *initial_datum,
    5836             :                       int initial_location,
    5837             :                       YYSTYPE *yylvalp, YYLTYPE *yyllocp,
    5838             :                       yyscan_t yyscanner)
    5839             : {
    5840             :     int         nfields;
    5841             :     char       *fieldnames[1024];
    5842             :     int         varnos[1024];
    5843             :     PLpgSQL_row *row;
    5844             :     int         tok;
    5845             : 
    5846             :     check_assignable(initial_datum, initial_location, yyscanner);
    5847             :     fieldnames[0] = initial_name;
    5848             :     varnos[0] = initial_datum->dno;
    5849             :     nfields = 1;
    5850             : 
    5851             :     while ((tok = yylex(yylvalp, yyllocp, yyscanner)) == ',')
    5852             :     {
    5853             :         /* Check for array overflow */
    5854             :         if (nfields >= 1024)
    5855             :             ereport(ERROR,
    5856             :                     (errcode(ERRCODE_PROGRAM_LIMIT_EXCEEDED),
    5857             :                      errmsg("too many INTO variables specified"),
    5858             :                      parser_errposition(*yyllocp)));
    5859             : 
    5860             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    5861             :         switch (tok)
    5862             :         {
    5863             :             case T_DATUM:
    5864             :                 check_assignable(yylvalp->wdatum.datum, *yyllocp, yyscanner);
    5865             :                 if (yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_ROW ||
    5866             :                     yylvalp->wdatum.datum->dtype == PLPGSQL_DTYPE_REC)
    5867             :                     ereport(ERROR,
    5868             :                             (errcode(ERRCODE_SYNTAX_ERROR),
    5869             :                              errmsg("\"%s\" is not a scalar variable",
    5870             :                                     NameOfDatum(&(yylvalp->wdatum))),
    5871             :                              parser_errposition(*yyllocp)));
    5872             :                 fieldnames[nfields] = NameOfDatum(&(yylvalp->wdatum));
    5873             :                 varnos[nfields++] = yylvalp->wdatum.datum->dno;
    5874             :                 break;
    5875             : 
    5876             :             default:
    5877             :                 /* just to give a better message than "syntax error" */
    5878             :                 current_token_is_not_variable(tok, yylvalp, yyllocp, yyscanner);
    5879             :         }
    5880             :     }
    5881             : 
    5882             :     /*
    5883             :      * We read an extra, non-comma token from yylex(), so push it back onto
    5884             :      * the input stream
    5885             :      */
    5886             :     plpgsql_push_back_token(tok, yylvalp, yyllocp, yyscanner);
    5887             : 
    5888             :     row = palloc0(sizeof(PLpgSQL_row));
    5889             :     row->dtype = PLPGSQL_DTYPE_ROW;
    5890             :     row->refname = "(unnamed row)";
    5891             :     row->lineno = plpgsql_location_to_lineno(initial_location, yyscanner);
    5892             :     row->rowtupdesc = NULL;
    5893             :     row->nfields = nfields;
    5894             :     row->fieldnames = palloc(sizeof(char *) * nfields);
    5895             :     row->varnos = palloc(sizeof(int) * nfields);
    5896             :     while (--nfields >= 0)
    5897             :     {
    5898             :         row->fieldnames[nfields] = fieldnames[nfields];
    5899             :         row->varnos[nfields] = varnos[nfields];
    5900             :     }
    5901             : 
    5902             :     plpgsql_adddatum((PLpgSQL_datum *) row);
    5903             : 
    5904             :     return row;
    5905             : }
    5906             : 
    5907             : /*
    5908             :  * Convert a single scalar into a "row" list.  This is exactly
    5909             :  * like read_into_scalar_list except we never consume any input.
    5910             :  *
    5911             :  * Note: lineno could be computed from location, but since callers
    5912             :  * have it at hand already, we may as well pass it in.
    5913             :  */
    5914             : static PLpgSQL_row *
    5915             : make_scalar_list1(char *initial_name,
    5916             :                   PLpgSQL_datum *initial_datum,
    5917             :                   int lineno, int location, yyscan_t yyscanner)
    5918             : {
    5919             :     PLpgSQL_row *row;
    5920             : 
    5921             :     check_assignable(initial_datum, location, yyscanner);
    5922             : 
    5923             :     row = palloc0(sizeof(PLpgSQL_row));
    5924             :     row->dtype = PLPGSQL_DTYPE_ROW;
    5925             :     row->refname = "(unnamed row)";
    5926             :     row->lineno = lineno;
    5927             :     row->rowtupdesc = NULL;
    5928             :     row->nfields = 1;
    5929             :     row->fieldnames = palloc(sizeof(char *));
    5930             :     row->varnos = palloc(sizeof(int));
    5931             :     row->fieldnames[0] = initial_name;
    5932             :     row->varnos[0] = initial_datum->dno;
    5933             : 
    5934             :     plpgsql_adddatum((PLpgSQL_datum *) row);
    5935             : 
    5936             :     return row;
    5937             : }
    5938             : 
    5939             : /*
    5940             :  * When the PL/pgSQL parser expects to see a SQL statement, it is very
    5941             :  * liberal in what it accepts; for example, we often assume an
    5942             :  * unrecognized keyword is the beginning of a SQL statement. This
    5943             :  * avoids the need to duplicate parts of the SQL grammar in the
    5944             :  * PL/pgSQL grammar, but it means we can accept wildly malformed
    5945             :  * input. To try and catch some of the more obviously invalid input,
    5946             :  * we run the strings we expect to be SQL statements through the main
    5947             :  * SQL parser.
    5948             :  *
    5949             :  * We only invoke the raw parser (not the analyzer); this doesn't do
    5950             :  * any database access and does not check any semantic rules, it just
    5951             :  * checks for basic syntactic correctness. We do this here, rather
    5952             :  * than after parsing has finished, because a malformed SQL statement
    5953             :  * may cause the PL/pgSQL parser to become confused about statement
    5954             :  * borders. So it is best to bail out as early as we can.
    5955             :  *
    5956             :  * It is assumed that "stmt" represents a copy of the function source text
    5957             :  * beginning at offset "location".  We use this assumption to transpose
    5958             :  * any error cursor position back to the function source text.
    5959             :  * If no error cursor is provided, we'll just point at "location".
    5960             :  */
    5961             : static void
    5962             : check_sql_expr(const char *stmt, RawParseMode parseMode, int location, yyscan_t yyscanner)
    5963             : {
    5964             :     sql_error_callback_arg cbarg;
    5965             :     ErrorContextCallback syntax_errcontext;
    5966             :     MemoryContext oldCxt;
    5967             : 
    5968             :     if (!plpgsql_check_syntax)
    5969             :         return;
    5970             : 
    5971             :     cbarg.location = location;
    5972             :     cbarg.yyscanner = yyscanner;
    5973             : 
    5974             :     syntax_errcontext.callback = plpgsql_sql_error_callback;
    5975             :     syntax_errcontext.arg = &cbarg;
    5976             :     syntax_errcontext.previous = error_context_stack;
    5977             :     error_context_stack = &syntax_errcontext;
    5978             : 
    5979             :     oldCxt = MemoryContextSwitchTo(plpgsql_compile_tmp_cxt);
    5980             :     (void) raw_parser(stmt, parseMode);
    5981             :     MemoryContextSwitchTo(oldCxt);
    5982             : 
    5983             :     /* Restore former ereport callback */
    5984             :     error_context_stack = syntax_errcontext.previous;
    5985             : }
    5986             : 
    5987             : static void
    5988             : plpgsql_sql_error_callback(void *arg)
    5989             : {
    5990             :     sql_error_callback_arg *cbarg = (sql_error_callback_arg *) arg;
    5991             :     yyscan_t    yyscanner = cbarg->yyscanner;
    5992             :     int         errpos;
    5993             : 
    5994             :     /*
    5995             :      * First, set up internalerrposition to point to the start of the
    5996             :      * statement text within the function text.  Note this converts location
    5997             :      * (a byte offset) to a character number.
    5998             :      */
    5999             :     parser_errposition(cbarg->location);
    6000             : 
    6001             :     /*
    6002             :      * If the core parser provided an error position, transpose it. Note we
    6003             :      * are dealing with 1-based character numbers at this point.
    6004             :      */
    6005             :     errpos = geterrposition();
    6006             :     if (errpos > 0)
    6007             :     {
    6008             :         int         myerrpos = getinternalerrposition();
    6009             : 
    6010             :         if (myerrpos > 0)        /* safety check */
    6011             :             internalerrposition(myerrpos + errpos - 1);
    6012             :     }
    6013             : 
    6014             :     /* In any case, flush errposition --- we want internalerrposition only */
    6015             :     errposition(0);
    6016             : }
    6017             : 
    6018             : /*
    6019             :  * Parse a SQL datatype name and produce a PLpgSQL_type structure.
    6020             :  *
    6021             :  * The heavy lifting is done elsewhere.  Here we are only concerned
    6022             :  * with setting up an errcontext link that will let us give an error
    6023             :  * cursor pointing into the plpgsql function source, if necessary.
    6024             :  * This is handled the same as in check_sql_expr(), and we likewise
    6025             :  * expect that the given string is a copy from the source text.
    6026             :  */
    6027             : static PLpgSQL_type *
    6028             : parse_datatype(const char *string, int location, yyscan_t yyscanner)
    6029             : {
    6030             :     TypeName   *typeName;
    6031             :     Oid         type_id;
    6032             :     int32       typmod;
    6033             :     sql_error_callback_arg cbarg;
    6034             :     ErrorContextCallback syntax_errcontext;
    6035             : 
    6036             :     cbarg.location = location;
    6037             :     cbarg.yyscanner = yyscanner;
    6038             : 
    6039             :     syntax_errcontext.callback = plpgsql_sql_error_callback;
    6040             :     syntax_errcontext.arg = &cbarg;
    6041             :     syntax_errcontext.previous = error_context_stack;
    6042             :     error_context_stack = &syntax_errcontext;
    6043             : 
    6044             :     /* Let the main parser try to parse it under standard SQL rules */
    6045             :     typeName = typeStringToTypeName(string, NULL);
    6046             :     typenameTypeIdAndMod(NULL, typeName, &type_id, &typmod);
    6047             : 
    6048             :     /* Restore former ereport callback */
    6049             :     error_context_stack = syntax_errcontext.previous;
    6050             : 
    6051             :     /* Okay, build a PLpgSQL_type data structure for it */
    6052             :     return plpgsql_build_datatype(type_id, typmod,
    6053             :                                   plpgsql_curr_compile->fn_input_collation,
    6054             :                                   typeName);
    6055             : }
    6056             : 
    6057             : /*
    6058             :  * Check block starting and ending labels match.
    6059             :  */
    6060             : static void
    6061             : check_labels(const char *start_label, const char *end_label, int end_location, yyscan_t yyscanner)
    6062             : {
    6063             :     if (end_label)
    6064             :     {
    6065             :         if (!start_label)
    6066             :             ereport(ERROR,
    6067             :                     (errcode(ERRCODE_SYNTAX_ERROR),
    6068             :                      errmsg("end label \"%s\" specified for unlabeled block",
    6069             :                             end_label),
    6070             :                      parser_errposition(end_location)));
    6071             : 
    6072             :         if (strcmp(start_label, end_label) != 0)
    6073             :             ereport(ERROR,
    6074             :                     (errcode(ERRCODE_SYNTAX_ERROR),
    6075             :                      errmsg("end label \"%s\" differs from block's label \"%s\"",
    6076             :                             end_label, start_label),
    6077             :                      parser_errposition(end_location)));
    6078             :     }
    6079             : }
    6080             : 
    6081             : /*
    6082             :  * Read the arguments (if any) for a cursor, followed by the until token
    6083             :  *
    6084             :  * If cursor has no args, just swallow the until token and return NULL.
    6085             :  * If it does have args, we expect to see "( arg [, arg ...] )" followed
    6086             :  * by the until token, where arg may be a plain expression, or a named
    6087             :  * parameter assignment of the form argname := expr. Consume all that and
    6088             :  * return a SELECT query that evaluates the expression(s) (without the outer
    6089             :  * parens).
    6090             :  */
    6091             : static PLpgSQL_expr *
    6092             : read_cursor_args(PLpgSQL_var *cursor, int until, YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    6093             : {
    6094             :     PLpgSQL_expr *expr;
    6095             :     PLpgSQL_row *row;
    6096             :     int         tok;
    6097             :     int         argc;
    6098             :     char      **argv;
    6099             :     StringInfoData ds;
    6100             :     bool        any_named = false;
    6101             : 
    6102             :     tok = yylex(yylvalp, yyllocp, yyscanner);
    6103             :     if (cursor->cursor_explicit_argrow < 0)
    6104             :     {
    6105             :         /* No arguments expected */
    6106             :         if (tok == '(')
    6107             :             ereport(ERROR,
    6108             :                     (errcode(ERRCODE_SYNTAX_ERROR),
    6109             :                      errmsg("cursor \"%s\" has no arguments",
    6110             :                             cursor->refname),
    6111             :                      parser_errposition(*yyllocp)));
    6112             : 
    6113             :         if (tok != until)
    6114             :             yyerror(yyllocp, NULL, yyscanner, "syntax error");
    6115             : 
    6116             :         return NULL;
    6117             :     }
    6118             : 
    6119             :     /* Else better provide arguments */
    6120             :     if (tok != '(')
    6121             :         ereport(ERROR,
    6122             :                 (errcode(ERRCODE_SYNTAX_ERROR),
    6123             :                  errmsg("cursor \"%s\" has arguments",
    6124             :                         cursor->refname),
    6125             :                  parser_errposition(*yyllocp)));
    6126             : 
    6127             :     /*
    6128             :      * Read the arguments, one by one.
    6129             :      */
    6130             :     row = (PLpgSQL_row *) plpgsql_Datums[cursor->cursor_explicit_argrow];
    6131             :     argv = (char **) palloc0(row->nfields * sizeof(char *));
    6132             : 
    6133             :     for (argc = 0; argc < row->nfields; argc++)
    6134             :     {
    6135             :         PLpgSQL_expr *item;
    6136             :         int         endtoken;
    6137             :         int         argpos;
    6138             :         int         tok1,
    6139             :                     tok2;
    6140             :         int         arglocation;
    6141             : 
    6142             :         /*
    6143             :          * Check if it's a named parameter: "param := value"
    6144             :          * or "param => value"
    6145             :          */
    6146             :         plpgsql_peek2(&tok1, &tok2, &arglocation, NULL, yyscanner);
    6147             :         if (tok1 == IDENT && (tok2 == COLON_EQUALS || tok2 == EQUALS_GREATER))
    6148             :         {
    6149             :             char       *argname;
    6150             :             IdentifierLookup save_IdentifierLookup;
    6151             : 
    6152             :             /* Read the argument name, ignoring any matching variable */
    6153             :             save_IdentifierLookup = plpgsql_IdentifierLookup;
    6154             :             plpgsql_IdentifierLookup = IDENTIFIER_LOOKUP_DECLARE;
    6155             :             yylex(yylvalp, yyllocp, yyscanner);
    6156             :             argname = yylvalp->str;
    6157             :             plpgsql_IdentifierLookup = save_IdentifierLookup;
    6158             : 
    6159             :             /* Match argument name to cursor arguments */
    6160             :             for (argpos = 0; argpos < row->nfields; argpos++)
    6161             :             {
    6162             :                 if (strcmp(row->fieldnames[argpos], argname) == 0)
    6163             :                     break;
    6164             :             }
    6165             :             if (argpos == row->nfields)
    6166             :                 ereport(ERROR,
    6167             :                         (errcode(ERRCODE_SYNTAX_ERROR),
    6168             :                          errmsg("cursor \"%s\" has no argument named \"%s\"",
    6169             :                                 cursor->refname, argname),
    6170             :                          parser_errposition(*yyllocp)));
    6171             : 
    6172             :             /*
    6173             :              * Eat the ":=" or "=>".  We already peeked, so the error should
    6174             :              * never happen.
    6175             :              */
    6176             :             tok2 = yylex(yylvalp, yyllocp, yyscanner);
    6177             :             if (tok2 != COLON_EQUALS && tok2 != EQUALS_GREATER)
    6178             :                 yyerror(yyllocp, NULL, yyscanner, "syntax error");
    6179             : 
    6180             :             any_named = true;
    6181             :         }
    6182             :         else
    6183             :             argpos = argc;
    6184             : 
    6185             :         if (argv[argpos] != NULL)
    6186             :             ereport(ERROR,
    6187             :                     (errcode(ERRCODE_SYNTAX_ERROR),
    6188             :                      errmsg("value for parameter \"%s\" of cursor \"%s\" specified more than once",
    6189             :                             row->fieldnames[argpos], cursor->refname),
    6190             :                      parser_errposition(arglocation)));
    6191             : 
    6192             :         /*
    6193             :          * Read the value expression. To provide the user with meaningful
    6194             :          * parse error positions, we check the syntax immediately, instead of
    6195             :          * checking the final expression that may have the arguments
    6196             :          * reordered.
    6197             :          */
    6198             :         item = read_sql_construct(',', ')', 0,
    6199             :                                   ",\" or \")",
    6200             :                                   RAW_PARSE_PLPGSQL_EXPR,
    6201             :                                   true, true,
    6202             :                                   NULL, &endtoken,
    6203             :                                   yylvalp, yyllocp, yyscanner);
    6204             : 
    6205             :         argv[argpos] = item->query;
    6206             : 
    6207             :         if (endtoken == ')' && !(argc == row->nfields - 1))
    6208             :             ereport(ERROR,
    6209             :                     (errcode(ERRCODE_SYNTAX_ERROR),
    6210             :                      errmsg("not enough arguments for cursor \"%s\"",
    6211             :                             cursor->refname),
    6212             :                      parser_errposition(*yyllocp)));
    6213             : 
    6214             :         if (endtoken == ',' && (argc == row->nfields - 1))
    6215             :             ereport(ERROR,
    6216             :                     (errcode(ERRCODE_SYNTAX_ERROR),
    6217             :                      errmsg("too many arguments for cursor \"%s\"",
    6218             :                             cursor->refname),
    6219             :                      parser_errposition(*yyllocp)));
    6220             :     }
    6221             : 
    6222             :     /* Make positional argument list */
    6223             :     initStringInfo(&ds);
    6224             :     for (argc = 0; argc < row->nfields; argc++)
    6225             :     {
    6226             :         Assert(argv[argc] != NULL);
    6227             : 
    6228             :         /*
    6229             :          * Because named notation allows permutated argument lists, include
    6230             :          * the parameter name for meaningful runtime errors.
    6231             :          */
    6232             :         appendStringInfoString(&ds, argv[argc]);
    6233             :         if (any_named)
    6234             :             appendStringInfo(&ds, " AS %s",
    6235             :                              quote_identifier(row->fieldnames[argc]));
    6236             :         if (argc < row->nfields - 1)
    6237             :             appendStringInfoString(&ds, ", ");
    6238             :     }
    6239             : 
    6240             :     expr = make_plpgsql_expr(ds.data, RAW_PARSE_PLPGSQL_EXPR);
    6241             :     pfree(ds.data);
    6242             : 
    6243             :     /* Next we'd better find the until token */
    6244             :     tok = yylex(yylvalp, yyllocp, yyscanner);
    6245             :     if (tok != until)
    6246             :         yyerror(yyllocp, NULL, yyscanner, "syntax error");
    6247             : 
    6248             :     return expr;
    6249             : }
    6250             : 
    6251             : /*
    6252             :  * Parse RAISE ... USING options
    6253             :  */
    6254             : static List *
    6255             : read_raise_options(YYSTYPE *yylvalp, YYLTYPE *yyllocp, yyscan_t yyscanner)
    6256             : {
    6257             :     List       *result = NIL;
    6258             : 
    6259             :     for (;;)
    6260             :     {
    6261             :         PLpgSQL_raise_option *opt;
    6262             :         int         tok;
    6263             : 
    6264             :         if ((tok = yylex(yylvalp, yyllocp, yyscanner)) == 0)
    6265             :             yyerror(yyllocp, NULL, yyscanner, "unexpected end of function definition");
    6266             : 
    6267             :         opt = (PLpgSQL_raise_option *) palloc(sizeof(PLpgSQL_raise_option));
    6268             : 
    6269             :         if (tok_is_keyword(tok, yylvalp,
    6270             :                            K_ERRCODE, "errcode"))
    6271             :             opt->opt_type = PLPGSQL_RAISEOPTION_ERRCODE;
    6272             :         else if (tok_is_keyword(tok, yylvalp,
    6273             :                                 K_MESSAGE, "message"))
    6274             :             opt->opt_type = PLPGSQL_RAISEOPTION_MESSAGE;
    6275             :         else if (tok_is_keyword(tok, yylvalp,
    6276             :                                 K_DETAIL, "detail"))
    6277             :             opt->opt_type = PLPGSQL_RAISEOPTION_DETAIL;
    6278             :         else if (tok_is_keyword(tok, yylvalp,
    6279             :                                 K_HINT, "hint"))
    6280             :             opt->opt_type = PLPGSQL_RAISEOPTION_HINT;
    6281             :         else if (tok_is_keyword(tok, yylvalp,
    6282             :                                 K_COLUMN, "column"))
    6283             :             opt->opt_type = PLPGSQL_RAISEOPTION_COLUMN;
    6284             :         else if (tok_is_keyword(tok, yylvalp,
    6285             :                                 K_CONSTRAINT, "constraint"))
    6286             :             opt->opt_type = PLPGSQL_RAISEOPTION_CONSTRAINT;
    6287             :         else if (tok_is_keyword(tok, yylvalp,
    6288             :                                 K_DATATYPE, "datatype"))
    6289             :             opt->opt_type = PLPGSQL_RAISEOPTION_DATATYPE;
    6290             :         else if (tok_is_keyword(tok, yylvalp,
    6291             :                                 K_TABLE, "table"))
    6292             :             opt->opt_type = PLPGSQL_RAISEOPTION_TABLE;
    6293             :         else if (tok_is_keyword(tok, yylvalp,
    6294             :                                 K_SCHEMA, "schema"))
    6295             :             opt->opt_type = PLPGSQL_RAISEOPTION_SCHEMA;
    6296             :         else
    6297             :             yyerror(yyllocp, NULL, yyscanner, "unrecognized RAISE statement option");
    6298             : 
    6299             :         tok = yylex(yylvalp, yyllocp, yyscanner);
    6300             :         if (tok != '=' && tok != COLON_EQUALS)
    6301             :             yyerror(yyllocp, NULL, yyscanner, "syntax error, expected \"=\"");
    6302             : 
    6303             :         opt->expr = read_sql_expression2(',', ';', ", or ;", &tok, yylvalp, yyllocp, yyscanner);
    6304             : 
    6305             :         result = lappend(result, opt);
    6306             : 
    6307             :         if (tok == ';')
    6308             :             break;
    6309             :     }
    6310             : 
    6311             :     return result;
    6312             : }
    6313             : 
    6314             : /*
    6315             :  * Check that the number of parameter placeholders in the message matches the
    6316             :  * number of parameters passed to it, if a message was given.
    6317             :  */
    6318             : static void
    6319             : check_raise_parameters(PLpgSQL_stmt_raise *stmt)
    6320             : {
    6321             :     char       *cp;
    6322             :     int         expected_nparams = 0;
    6323             : 
    6324             :     if (stmt->message == NULL)
    6325             :         return;
    6326             : 
    6327             :     for (cp = stmt->message; *cp; cp++)
    6328             :     {
    6329             :         if (cp[0] == '%')
    6330             :         {
    6331             :             /* ignore literal % characters */
    6332             :             if (cp[1] == '%')
    6333             :                 cp++;
    6334             :             else
    6335             :                 expected_nparams++;
    6336             :         }
    6337             :     }
    6338             : 
    6339             :     if (expected_nparams < list_length(stmt->params))
    6340             :         ereport(ERROR,
    6341             :                 (errcode(ERRCODE_SYNTAX_ERROR),
    6342             :                  errmsg("too many parameters specified for RAISE")));
    6343             :     if (expected_nparams > list_length(stmt->params))
    6344             :         ereport(ERROR,
    6345             :                 (errcode(ERRCODE_SYNTAX_ERROR),
    6346             :                  errmsg("too few parameters specified for RAISE")));
    6347             : }
    6348             : 
    6349             : /*
    6350             :  * Fix up CASE statement
    6351             :  */
    6352             : static PLpgSQL_stmt *
    6353             : make_case(int location, PLpgSQL_expr *t_expr,
    6354             :           List *case_when_list, List *else_stmts, yyscan_t yyscanner)
    6355             : {
    6356             :     PLpgSQL_stmt_case *new;
    6357             : 
    6358             :     new = palloc(sizeof(PLpgSQL_stmt_case));
    6359             :     new->cmd_type = PLPGSQL_STMT_CASE;
    6360             :     new->lineno = plpgsql_location_to_lineno(location, yyscanner);
    6361             :     new->stmtid = ++plpgsql_curr_compile->nstatements;
    6362             :     new->t_expr = t_expr;
    6363             :     new->t_varno = 0;
    6364             :     new->case_when_list = case_when_list;
    6365             :     new->have_else = (else_stmts != NIL);
    6366             :     /* Get rid of list-with-NULL hack */
    6367             :     if (list_length(else_stmts) == 1 && linitial(else_stmts) == NULL)
    6368             :         new->else_stmts = NIL;
    6369             :     else
    6370             :         new->else_stmts = else_stmts;
    6371             : 
    6372             :     /*
    6373             :      * When test expression is present, we create a var for it and then
    6374             :      * convert all the WHEN expressions to "VAR IN (original_expression)".
    6375             :      * This is a bit klugy, but okay since we haven't yet done more than read
    6376             :      * the expressions as text.  (Note that previous parsing won't have
    6377             :      * complained if the WHEN ... THEN expression contained multiple
    6378             :      * comma-separated values.)
    6379             :      */
    6380             :     if (t_expr)
    6381             :     {
    6382             :         char        varname[32];
    6383             :         PLpgSQL_var *t_var;
    6384             :         ListCell   *l;
    6385             : 
    6386             :         /* use a name unlikely to collide with any user names */
    6387             :         snprintf(varname, sizeof(varname), "__Case__Variable_%d__",
    6388             :                  plpgsql_nDatums);
    6389             : 
    6390             :         /*
    6391             :          * We don't yet know the result datatype of t_expr.  Build the
    6392             :          * variable as if it were INT4; we'll fix this at runtime if needed.
    6393             :          */
    6394             :         t_var = (PLpgSQL_var *)
    6395             :             plpgsql_build_variable(varname, new->lineno,
    6396             :                                    plpgsql_build_datatype(INT4OID,
    6397             :                                                           -1,
    6398             :                                                           InvalidOid,
    6399             :                                                           NULL),
    6400             :                                    true);
    6401             :         new->t_varno = t_var->dno;
    6402             : 
    6403             :         foreach(l, case_when_list)
    6404             :         {
    6405             :             PLpgSQL_case_when *cwt = (PLpgSQL_case_when *) lfirst(l);
    6406             :             PLpgSQL_expr *expr = cwt->expr;
    6407             :             StringInfoData ds;
    6408             : 
    6409             :             /* We expect to have expressions not statements */
    6410             :             Assert(expr->parseMode == RAW_PARSE_PLPGSQL_EXPR);
    6411             : 
    6412             :             /* Do the string hacking */
    6413             :             initStringInfo(&ds);
    6414             : 
    6415             :             appendStringInfo(&ds, "\"%s\" IN (%s)",
    6416             :                              varname, expr->query);
    6417             : 
    6418             :             pfree(expr->query);
    6419             :             expr->query = pstrdup(ds.data);
    6420             :             /* Adjust expr's namespace to include the case variable */
    6421             :             expr->ns = plpgsql_ns_top();
    6422             : 
    6423             :             pfree(ds.data);
    6424             :         }
    6425             :     }
    6426             : 
    6427             :     return (PLpgSQL_stmt *) new;
    6428             : }

Generated by: LCOV version 1.16