stmt_execsql是pl_block->proc_stmt大语法树中的一个分支
proc_stmt : pl_block ';'
{ $$ = $1; }
| stmt_assign
{ $$ = $1; }
| stmt_if
{ $$ = $1; }
| stmt_case
{ $$ = $1; }
| stmt_loop
{ $$ = $1; }
| stmt_while
{ $$ = $1; }
| stmt_for
{ $$ = $1; }
| stmt_foreach_a
{ $$ = $1; }
| stmt_exit
{ $$ = $1; }
| stmt_return
{ $$ = $1; }
| stmt_raise
{ $$ = $1; }
| stmt_assert
{ $$ = $1; }
| stmt_execsql
{ $$ = $1; }
stmt_execsql
stmt_execsql : K_IMPORT
{
$$ = make_execsql_stmt(K_IMPORT, @1);
}
| K_INSERT
{
$$ = make_execsql_stmt(K_INSERT, @1);
}
| T_WORD
{
int tok;
tok = yylex();
plpgsql_push_back_token(tok);
if (tok == '=' || tok == COLON_EQUALS || tok == '[')
word_is_not_variable(&($1), @1);
$$ = make_execsql_stmt(T_WORD, @1);
}
| T_CWORD
{
int tok;
tok = yylex();
plpgsql_push_back_token(tok);
if (tok == '=' || tok == COLON_EQUALS || tok == '[')
cword_is_not_variable(&($1), @1);
$$ = make_execsql_stmt(T_CWORD, @1);
}
;
用于解析形如:
$$
begin
select (3+1) into vvv;
select 100 into v_int;
end;
$$;
stmt_execsql : opt_stmt_label K_IMPORT
...
...
| opt_stmt_label T_WORD
{
int tok;
tok = yylex();
plpgsql_push_back_token(tok);
if (tok == '=' || tok == COLON_EQUALS ||
tok == '[' || tok == '.')
word_is_not_variable(&($2), @2);
$$ = make_execsql_stmt($1, T_WORD, @2);
}
...
...
make_execsql_stmt
tok = 275 T_WORD
for (;;)
prev_tok = 275 tok = 40 (
prev_tok = 40 tok = 266 ICONST
prev_tok = 266 tok = 43 +
prev_tok = 43 tok = 266 ICONST
prev_tok = 266 tok = 41 )
prev_tok = 41 tok = 334 K_INTO
prev_tok = 334 tok = 59 ;
make_execsql_stmt
tok = 275 T_WORD
for (;;)
prev_tok = 275 tok = 40 (
prev_tok = 40 tok = 266 ICONST --> 3
prev_tok = 266 tok = 43 + --> +
prev_tok = 43 tok = 266 ICONST --> 1
prev_tok = 266 tok = 41 )
prev_tok = 41 tok = 334 K_INTO --> INTO
if (tok == K_INTO)
read_into_target(&target, &have_strict)
...
tok = yylex() // 277 T_DATUM --> vvv
read_into_scalar_list(NameOfDatum(&(yylval.wdatum)),yylval.wdatum.datum, yylloc);
prev_tok = 334 tok = 59 ; --> ;
make_execsql_stmt
tok = 275 T_WORD
for (;;)
prev_tok = 275 tok = 266 ICONST
prev_tok = 266 tok = 334 K_INTO
prev_tok = 334 tok = 59 ;