From 433ae75066d90f7d54bc2273400867b4565c33ad Mon Sep 17 00:00:00 2001 From: wuyuechuan Date: Thu, 6 Aug 2020 19:16:26 +0800 Subject: [PATCH] fixbug: procudure multi option error --- src/common/backend/parser/gram.y | 28 +++++++++++++++++-- src/test/regress/expected/create_function.out | 6 ++++ .../regress/expected/create_procedure.out | 8 ++++++ src/test/regress/parallel_schedule | 5 ++++ src/test/regress/sql/create_function.sql | 6 ++++ src/test/regress/sql/create_procedure.sql | 8 ++++++ 6 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 src/test/regress/expected/create_function.out create mode 100644 src/test/regress/expected/create_procedure.out create mode 100644 src/test/regress/sql/create_function.sql create mode 100644 src/test/regress/sql/create_procedure.sql diff --git a/src/common/backend/parser/gram.y b/src/common/backend/parser/gram.y index e94c320e7..d8e86397d 100755 --- a/src/common/backend/parser/gram.y +++ b/src/common/backend/parser/gram.y @@ -9009,8 +9009,32 @@ callfunc_args: func_arg_expr } ; CreateProcedureStmt: - CREATE opt_or_replace PROCEDURE func_name_opt_arg proc_args - opt_createproc_opt_list as_is {u_sess->parser_cxt.eaten_declare = false; u_sess->parser_cxt.eaten_begin = false;} subprogram_body + CREATE opt_or_replace PROCEDURE func_name_opt_arg proc_args + as_is {u_sess->parser_cxt.eaten_declare = false; u_sess->parser_cxt.eaten_begin = false;} subprogram_body + { + CreateFunctionStmt *n = makeNode(CreateFunctionStmt); + int count = get_outarg_num($5); + n->isOraStyle = true; + n->replace = $2; + n->funcname = $4; + n->parameters = $5; + n->returnType = NULL; + n->isProcedure = true; + if (0 == count) + { + n->returnType = makeTypeName("void"); + n->returnType->typmods = NULL; + n->returnType->arrayBounds = NULL; + } + n->options = list_make1(makeDefElem("as", + (Node *)list_make1(makeString($8)))); + n->options = lappend(n->options, makeDefElem("language", + (Node *)makeString("plpgsql"))); + n->withClause = NIL; + $$ = (Node *)n; + } + | CREATE opt_or_replace PROCEDURE func_name_opt_arg proc_args + createfunc_opt_list as_is {u_sess->parser_cxt.eaten_declare = false; u_sess->parser_cxt.eaten_begin = false;} subprogram_body { CreateFunctionStmt *n = makeNode(CreateFunctionStmt); int count = get_outarg_num($5); diff --git a/src/test/regress/expected/create_function.out b/src/test/regress/expected/create_function.out new file mode 100644 index 000000000..c776e9548 --- /dev/null +++ b/src/test/regress/expected/create_function.out @@ -0,0 +1,6 @@ +create function create_function_test(integer,integer) RETURNS integer +AS 'SELECT $1 + $2;' +LANGUAGE SQL +IMMUTABLE SHIPPABLE +RETURNS NULL ON NULL INPUT; +drop function create_function_test; \ No newline at end of file diff --git a/src/test/regress/expected/create_procedure.out b/src/test/regress/expected/create_procedure.out new file mode 100644 index 000000000..fabc749ab --- /dev/null +++ b/src/test/regress/expected/create_procedure.out @@ -0,0 +1,8 @@ +create procedure test_procedure_test(int,int) +SHIPPABLE IMMUTABLE +as +begin + select $1 + $2; +end; +/ +drop procedure test_procedure_test; \ No newline at end of file diff --git a/src/test/regress/parallel_schedule b/src/test/regress/parallel_schedule index 10c1a0097..fbcec5ab4 100644 --- a/src/test/regress/parallel_schedule +++ b/src/test/regress/parallel_schedule @@ -577,3 +577,8 @@ test: gtt_function test: gtt_prepare test: gtt_parallel_1 gtt_parallel_2 test: gtt_clean + + +# procedure, Function Test +test: create_procedure +test: create_function diff --git a/src/test/regress/sql/create_function.sql b/src/test/regress/sql/create_function.sql new file mode 100644 index 000000000..c776e9548 --- /dev/null +++ b/src/test/regress/sql/create_function.sql @@ -0,0 +1,6 @@ +create function create_function_test(integer,integer) RETURNS integer +AS 'SELECT $1 + $2;' +LANGUAGE SQL +IMMUTABLE SHIPPABLE +RETURNS NULL ON NULL INPUT; +drop function create_function_test; \ No newline at end of file diff --git a/src/test/regress/sql/create_procedure.sql b/src/test/regress/sql/create_procedure.sql new file mode 100644 index 000000000..67ab2c93e --- /dev/null +++ b/src/test/regress/sql/create_procedure.sql @@ -0,0 +1,8 @@ +create procedure test_procedure_test(int,int) +SHIPPABLE IMMUTABLE +as +begin + select $1 + $2; +end; +/ +drop procedure test_procedure_test; \ No newline at end of file