修复一个cursor expression的问题

This commit is contained in:
wangfeihuo
2024-07-02 19:36:36 +08:00
parent 11173c0707
commit 3bdceb6f40
4 changed files with 155 additions and 3 deletions

View File

@ -3831,9 +3831,8 @@ static Node* transformCursorExpression(ParseState* pstate, CursorExpression* cur
int nParamExec = 0;
parse_state_temp = parse_state_parent;
while (parse_state_temp != NULL) {
nParamExec += list_length(parse_state_temp->cursor_expression_para_var);
parse_state_temp = parse_state_temp->parentParseState;
if (parse_state_temp != NULL) {
nParamExec = list_length(parse_state_temp->cursor_expression_para_var);
}
plan_tree->nParamExec = nParamExec;

View File

@ -5705,6 +5705,15 @@ static Datum ExecEvalCursorExpression(CursorExpressionState* state, ExprContext*
PortalStart(portal, econtext->ecxt_param_list_info, 0, GetActiveSnapshot());
int plan_param_number = ((PlannedStmt*)(cursor_expression->plan))->nParamExec;
int state_param_number = list_length(state->param);
if (unlikely(plan_param_number > state_param_number)) {
ereport(ERROR,
(errcode(ERRCODE_INVALID_PARAMETER_VALUE),
errmodule(MOD_EXECUTOR),
errmsg("The expected number of parameters is %d, but actual is %d.", plan_param_number, state_param_number)));
}
for (int i = 0; i < plan_param_number; i++) {
bool expr_is_null = false;
ParamExecData* prm = &(portal->queryDesc->estate->es_param_exec_vals[i]);

View File

@ -804,7 +804,107 @@ NOTICE: last_name : heliu
(1 row)
drop procedure test_cursor_2;
--
create table t_cursor_0011_01(department_id int, department_name varchar(50));
create table t_cursor_0011_02(employees_id int, department_id int, first_name varchar(50), last_name varchar(50), email varchar(50), phone_number int);
insert into t_cursor_0011_01 values (1, 'sale'),(2, 'rd'),(3, 'pro');
insert into t_cursor_0011_01 values (1, 'sale'),(2, 'rd'),(3, 'pro');;
insert into t_cursor_0011_02 values (1, 1, 'zhang', 'san', '1@abc.com', 123),(2, 1, 'li', 'si', '2@abc.com', 124);
insert into t_cursor_0011_02 values (1, 2, 'wang', 'wu', '3@abc.com', 321),(2, 2, 'he', 'liu', '4@abc.com', 421);
create or replace procedure pro_cursor_0011_02
as
company_name varchar(100);
department_name varchar(100);
employees_id_var int;
name_var varchar(100);
type ref_cur_type is ref cursor;
my_cur ref_cur_type;
my_cur2 ref_cur_type;
cursor c1 is select department_id, cursor(select department_name, cursor(select department_id ) from t_cursor_0011_02) from t_cursor_0011_01 d order by department_name;
begin
open c1;
loop
fetch c1 into department_name, my_cur;
exit when c1%notfound;
raise notice 'department_name : % %',department_name, my_cur;
loop
fetch my_cur into name_var, my_cur2;
exit when my_cur%notfound;
raise notice ' department employees info : % %',name_var, my_cur2;
loop
fetch my_cur2 into employees_id_var;
exit when my_cur2%notfound;
raise notice ' employees_id_var : %',employees_id_var;
end loop;
end loop;
close my_cur;
end loop;
end;
/
call pro_cursor_0011_02();
NOTICE: department_name : 3 <unnamed portal 98>
NOTICE: department employees info : pro <unnamed portal 102>
NOTICE: employees_id_var : 1
NOTICE: department employees info : pro <unnamed portal 103>
NOTICE: employees_id_var : 1
NOTICE: department employees info : pro <unnamed portal 104>
NOTICE: employees_id_var : 2
NOTICE: department employees info : pro <unnamed portal 105>
NOTICE: employees_id_var : 2
NOTICE: department_name : 3 <unnamed portal 101>
NOTICE: department employees info : pro <unnamed portal 106>
NOTICE: employees_id_var : 1
NOTICE: department employees info : pro <unnamed portal 107>
NOTICE: employees_id_var : 1
NOTICE: department employees info : pro <unnamed portal 108>
NOTICE: employees_id_var : 2
NOTICE: department employees info : pro <unnamed portal 109>
NOTICE: employees_id_var : 2
NOTICE: department_name : 2 <unnamed portal 97>
NOTICE: department employees info : rd <unnamed portal 110>
NOTICE: employees_id_var : 1
NOTICE: department employees info : rd <unnamed portal 111>
NOTICE: employees_id_var : 1
NOTICE: department employees info : rd <unnamed portal 112>
NOTICE: employees_id_var : 2
NOTICE: department employees info : rd <unnamed portal 113>
NOTICE: employees_id_var : 2
NOTICE: department_name : 2 <unnamed portal 100>
NOTICE: department employees info : rd <unnamed portal 114>
NOTICE: employees_id_var : 1
NOTICE: department employees info : rd <unnamed portal 115>
NOTICE: employees_id_var : 1
NOTICE: department employees info : rd <unnamed portal 116>
NOTICE: employees_id_var : 2
NOTICE: department employees info : rd <unnamed portal 117>
NOTICE: employees_id_var : 2
NOTICE: department_name : 1 <unnamed portal 96>
NOTICE: department employees info : sale <unnamed portal 118>
NOTICE: employees_id_var : 1
NOTICE: department employees info : sale <unnamed portal 119>
NOTICE: employees_id_var : 1
NOTICE: department employees info : sale <unnamed portal 120>
NOTICE: employees_id_var : 2
NOTICE: department employees info : sale <unnamed portal 121>
NOTICE: employees_id_var : 2
NOTICE: department_name : 1 <unnamed portal 99>
NOTICE: department employees info : sale <unnamed portal 122>
NOTICE: employees_id_var : 1
NOTICE: department employees info : sale <unnamed portal 123>
NOTICE: employees_id_var : 1
NOTICE: department employees info : sale <unnamed portal 124>
NOTICE: employees_id_var : 2
NOTICE: department employees info : sale <unnamed portal 125>
NOTICE: employees_id_var : 2
pro_cursor_0011_02
--------------------
(1 row)
-- clean
drop procedure pro_cursor_0011_02;
drop table t_cursor_0011_01;
drop table t_cursor_0011_02;
drop table res_count1;
drop table employees;
drop table departments;

View File

@ -481,7 +481,51 @@ call test_cursor_2();
drop procedure test_cursor_2;
--
create table t_cursor_0011_01(department_id int, department_name varchar(50));
create table t_cursor_0011_02(employees_id int, department_id int, first_name varchar(50), last_name varchar(50), email varchar(50), phone_number int);
insert into t_cursor_0011_01 values (1, 'sale'),(2, 'rd'),(3, 'pro');
insert into t_cursor_0011_01 values (1, 'sale'),(2, 'rd'),(3, 'pro');;
insert into t_cursor_0011_02 values (1, 1, 'zhang', 'san', '1@abc.com', 123),(2, 1, 'li', 'si', '2@abc.com', 124);
insert into t_cursor_0011_02 values (1, 2, 'wang', 'wu', '3@abc.com', 321),(2, 2, 'he', 'liu', '4@abc.com', 421);
create or replace procedure pro_cursor_0011_02
as
company_name varchar(100);
department_name varchar(100);
employees_id_var int;
name_var varchar(100);
type ref_cur_type is ref cursor;
my_cur ref_cur_type;
my_cur2 ref_cur_type;
cursor c1 is select department_id, cursor(select department_name, cursor(select department_id ) from t_cursor_0011_02) from t_cursor_0011_01 d order by department_name;
begin
open c1;
loop
fetch c1 into department_name, my_cur;
exit when c1%notfound;
raise notice 'department_name : % %',department_name, my_cur;
loop
fetch my_cur into name_var, my_cur2;
exit when my_cur%notfound;
raise notice ' department employees info : % %',name_var, my_cur2;
loop
fetch my_cur2 into employees_id_var;
exit when my_cur2%notfound;
raise notice ' employees_id_var : %',employees_id_var;
end loop;
end loop;
close my_cur;
end loop;
end;
/
call pro_cursor_0011_02();
-- clean
drop procedure pro_cursor_0011_02;
drop table t_cursor_0011_01;
drop table t_cursor_0011_02;
drop table res_count1;
drop table employees;
drop table departments;