From 1c7b127f4ccd1a9c8542061b677ae297591083b1 Mon Sep 17 00:00:00 2001 From: TotaJ Date: Thu, 28 Jan 2021 17:00:36 +0800 Subject: [PATCH 1/3] Fix create procedure failed with multiple param. --- src/common/backend/parser/gram.y | 4 +-- .../regress/expected/hw_procedure_define.out | 29 +++++++++++++++++++ src/test/regress/sql/hw_procedure_define.sql | 19 +++++++++++- 3 files changed, 49 insertions(+), 3 deletions(-) diff --git a/src/common/backend/parser/gram.y b/src/common/backend/parser/gram.y index aa286a818..230feb5e8 100755 --- a/src/common/backend/parser/gram.y +++ b/src/common/backend/parser/gram.y @@ -10319,9 +10319,9 @@ createfunc_opt_list: | createfunc_opt_list createfunc_opt_item { $$ = lappend($1, $2); } ; opt_createproc_opt_list: - createproc_opt_item + opt_createproc_opt_list createproc_opt_item { - $$ = list_make1($1); + $$ = lappend($1, $2); } | /* EMPTY */ { diff --git a/src/test/regress/expected/hw_procedure_define.out b/src/test/regress/expected/hw_procedure_define.out index b2fbba30d..b91f76b60 100644 --- a/src/test/regress/expected/hw_procedure_define.out +++ b/src/test/regress/expected/hw_procedure_define.out @@ -742,3 +742,32 @@ CALL PRO_NO_EXP_001_1(); (1 row) +create table test_emp_001(name varchar(10)); +create or replace procedure test_proc_using_001(a int) SHIPPABLE LEAKPROOF CALLED ON NULL INPUT external security invoker cost 0.000056 +as + v_sql varchar2(2000); +begin + v_sql := 'insert into test_emp_001 values (:v1)'; + execute immediate v_sql using 'kimy'; +end; +/ +call test_proc_using_001(1); + test_proc_using_001 +--------------------- + +(1 row) + +select * from test_emp_001; + name +------ + kimy +(1 row) + +select prosecdef,procost,proleakproof,proisstrict,proshippable,prokind from pg_proc where proname='test_proc_using_001'; + prosecdef | procost | proleakproof | proisstrict | proshippable | prokind +-----------+---------+--------------+-------------+--------------+--------- + f | 5.6e-05 | t | f | t | p +(1 row) + +drop table test_emp_001; +drop procedure test_proc_using_001; diff --git a/src/test/regress/sql/hw_procedure_define.sql b/src/test/regress/sql/hw_procedure_define.sql index 28a097ff1..3576177c8 100644 --- a/src/test/regress/sql/hw_procedure_define.sql +++ b/src/test/regress/sql/hw_procedure_define.sql @@ -584,4 +584,21 @@ END; / CALL PRO_NO_EXP_001_1(); -CALL PRO_NO_EXP_001_1(); \ No newline at end of file +CALL PRO_NO_EXP_001_1(); + + +create table test_emp_001(name varchar(10)); +create or replace procedure test_proc_using_001(a int) SHIPPABLE LEAKPROOF CALLED ON NULL INPUT external security invoker cost 0.000056 +as + v_sql varchar2(2000); +begin + v_sql := 'insert into test_emp_001 values (:v1)'; + execute immediate v_sql using 'kimy'; +end; +/ +call test_proc_using_001(1); +select * from test_emp_001; +select prosecdef,procost,proleakproof,proisstrict,proshippable,prokind from pg_proc where proname='test_proc_using_001'; + +drop table test_emp_001; +drop procedure test_proc_using_001; From 8c186e510333d70b3546b93c26ff396c361792a0 Mon Sep 17 00:00:00 2001 From: TotaJ Date: Thu, 4 Feb 2021 10:51:38 +0800 Subject: [PATCH 2/3] test --- src/gausskernel/process/tcop/postgres.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/gausskernel/process/tcop/postgres.cpp b/src/gausskernel/process/tcop/postgres.cpp index 146b43c3a..7bb26d3ec 100755 --- a/src/gausskernel/process/tcop/postgres.cpp +++ b/src/gausskernel/process/tcop/postgres.cpp @@ -10290,7 +10290,6 @@ static void exec_batch_bind_execute(StringInfo input_message) } Assert(NULL != psrc); - SetUniqueSQLIdFromCachedPlanSource(psrc); /* Check command type: only support IUD */ initStringInfo(&process_result); @@ -10339,6 +10338,7 @@ static void exec_batch_bind_execute(StringInfo input_message) * we are already in one. */ start_xact_command(); + SetUniqueSQLIdFromCachedPlanSource(psrc); if (ENABLE_WORKLOAD_CONTROL && SqlIsValid(t_thrd.postgres_cxt.debug_query_string) && (IS_PGXC_COORDINATOR || IS_SINGLE_NODE) && From 030c075a748831b1a412080be18931d026e567de Mon Sep 17 00:00:00 2001 From: TotaJ Date: Thu, 4 Feb 2021 17:12:22 +0800 Subject: [PATCH 3/3] Fix memory alloc failed in batch mode. --- src/gausskernel/process/tcop/postgres.cpp | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/gausskernel/process/tcop/postgres.cpp b/src/gausskernel/process/tcop/postgres.cpp index 7bb26d3ec..aa8aba9e2 100755 --- a/src/gausskernel/process/tcop/postgres.cpp +++ b/src/gausskernel/process/tcop/postgres.cpp @@ -8989,7 +8989,16 @@ int PostgresMain(int argc, char* argv[], const char* dbname, const char* usernam #endif exec_init_poolhandles(); + /* + * Enable pbe optimization in batch mode, cause it may generate too many cplan + * when enable_pbe_optimization is false, which may consume lots of memory and + * lead to 'memory alloc failed'. To avoid this problem, enable pbe optimization + * to use gplan in this batch. + */ + bool original = u_sess->attr.attr_sql.enable_pbe_optimization; + u_sess->attr.attr_sql.enable_pbe_optimization = true; exec_batch_bind_execute(&input_message); + u_sess->attr.attr_sql.enable_pbe_optimization = original; if (is_unique_sql_enabled() && is_local_unique_sql()) { UpdateUniqueSQLStat(NULL, NULL, GetCurrentStatementLocalStartTimestamp()); }