diff --git a/src/common/backend/parser/gram.y b/src/common/backend/parser/gram.y index e94c320e71eaa65cb9dfe756de2873f7df4e8001..d8e86397df45576d2c8979cc78ad5d173a87a149 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 0000000000000000000000000000000000000000..c776e954865a5d5013a80fa572d24a3af95e6814 --- /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 0000000000000000000000000000000000000000..fabc749ab980f6cb739b8d6164eeeba507400a4b --- /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 10c1a0097128b9d96d02fd6a65562347a47ee07a..fbcec5ab4aa0381703b8302306efdbd6b57bb0db 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 0000000000000000000000000000000000000000..c776e954865a5d5013a80fa572d24a3af95e6814 --- /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 0000000000000000000000000000000000000000..67ab2c93e7cf44ae6525360871b4fdd6987b399e --- /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