@@ -351,7 +351,7 @@ func (u *plpgsqlSymUnion) doBlockOption() tree.DoBlockOption {
351351%type <*tree.NumVal> foreach_slice
352352%type <plpgsqltree.ForLoopControl> for_control
353353
354- %type <str> any_identifier opt_block_label opt_loop_label opt_label query_options
354+ %type <str> any_identifier opt_block_label opt_loop_label opt_label
355355%type <str> opt_error_level option_type
356356
357357%type <tree.DoBlockOptions> do_stmt_opt_list
@@ -368,6 +368,7 @@ func (u *plpgsqlSymUnion) doBlockOption() tree.DoBlockOption {
368368%type <plpgsqltree.Statement> stmt_open stmt_fetch stmt_move stmt_close stmt_null
369369%type <plpgsqltree.Statement> stmt_commit stmt_rollback
370370%type <plpgsqltree.Statement> stmt_case stmt_foreach_a
371+ %type <plpgsqltree.Statement> return_query
371372
372373%type <plpgsqltree.Statement> decl_statement
373374%type <[]plpgsqltree.Statement> decl_sect opt_decl_stmts decl_stmts
@@ -1163,10 +1164,10 @@ stmt_return: RETURN return_expr ';'
11631164 {
11641165 $$ .val = &plpgsqltree.ReturnNext{Expr: $3 .expr()}
11651166 }
1166- | RETURN_QUERY QUERY
1167- {
1168- return unimplemented (plpgsqllex, " return query " )
1169- }
1167+ | RETURN_QUERY QUERY return_query ' ; '
1168+ {
1169+ $$ .val = $3 .statement( )
1170+ }
11701171;
11711172
11721173return_expr :
@@ -1179,19 +1180,19 @@ return_expr:
11791180 }
11801181;
11811182
1182- query_options :
1183+ return_query :
11831184 {
1184- _, terminator, err := plpgsqllex.(*lexer).ReadSqlExpr(EXECUTE, ' ;' )
1185- if err != nil {
1186- return setErr(plpgsqllex, err)
1187- }
1188- if terminator == EXECUTE {
1185+ if plpgsqllex.(*lexer).peekForExecute() {
1186+ // Advance the lexer by one token so that the error correctly points to
1187+ // the EXECUTE keyword.
1188+ plpgsqllex.(*lexer).Advance(1 )
11891189 return unimplemented (plpgsqllex, " return dynamic sql query" )
11901190 }
1191- _, _, err = plpgsqllex.(*lexer).ReadSqlExpr( ' ; ' )
1191+ retQuery, err : = plpgsqllex.(*lexer).ParseReturnQuery( )
11921192 if err != nil {
11931193 return setErr(plpgsqllex, err)
11941194 }
1195+ $$ .val = retQuery
11951196 }
11961197;
11971198
0 commit comments