【标题】: 修复IA6XZL所示的存储过程参数为sys_refcursor时,执行存储过程报错的问题

【实现内容】: 修复IA6XZL所示的存储过程参数为sys_refcursor时,执行存储过程报错的问题
【根因分析】: 原来调用PortalRunFetch的接口,导致u_sess->SPI_cxt._curid和u_sess->SPI_cxt._connected对不上,触发错误。
【实现方案】: PortalRunFetch接口改成SPI_cursor_move接口。
【关联需求或issue】: https://e.gitee.com/opengaussorg/dashboard?issue=IA6XZL
This commit is contained in:
wangfeihuo
2024-06-26 15:43:58 +08:00
committed by yaoxin
parent 49c847fb14
commit 8dac2e7acc
8 changed files with 241 additions and 148 deletions

View File

@ -275,6 +275,7 @@ static bool plsql_convert_expr_value_charset(PLpgSQL_execstate* estate, Datum *v
static TupleDesc get_cursor_tupledesc_exec(PLpgSQL_expr* expr, bool isOnlySelect, bool isOnlyParse);
void AutonomPipelinedFuncRewriteResult(PLpgSQL_execstate *pExecstate);
void PipelinedFuncRewriteResult(PLpgSQL_execstate *estate, ATResult *atResult);
static bool is_has_update_in_query(PLpgSQL_expr* expr);
/* ----------
* plpgsql_check_line_validity Called by the debugger plugin for
* validating a given linenumber
@ -8874,9 +8875,9 @@ static int exec_stmt_open(PLpgSQL_execstate* estate, PLpgSQL_stmt_open* stmt)
#endif
curvar->cursor_closed = false;
/* Execute SQL through move cursor, only in A compatibility mode */
if (u_sess->attr.attr_sql.sql_compatibility == A_FORMAT) {
(void)PortalRunFetch(portal, FETCH_FORWARD, FETCH_ALL, None_Receiver);
(void)PortalRunFetch(portal, FETCH_BACKWARD, FETCH_ALL, None_Receiver);
if (u_sess->attr.attr_sql.sql_compatibility == A_FORMAT && is_has_update_in_query(query)) {
SPI_cursor_move(portal, true, FETCH_ALL);
SPI_cursor_move(portal, false, FETCH_ALL);
}
return PLPGSQL_RC_OK;
}
@ -16211,4 +16212,34 @@ void plpgsql_free_override_stack(int depth)
}
}
static bool is_has_update_in_query(PLpgSQL_expr* expr)
{
List* plansources = NIL;
CachedPlanSource* plansource = NULL;
Query* query = NULL;
plansources = SPI_plan_get_plan_sources(expr->plan);
if (list_length(plansources) != 1) {
return false;
}
plansource = (CachedPlanSource*)linitial(plansources);
if (list_length(plansource->query_list) != 1) {
return false;
}
query = (Query*)linitial(plansource->query_list);
/*
* 2. It must be a plain SELECT query without any input tables
*/
if (!IsA(query, Query)) {
return false;
}
if (query->commandType != CMD_SELECT) {
return false;
}
return query->hasForUpdate;
}
#endif

View File

@ -337,50 +337,6 @@ SQL statement "select complicate_process()"
PL/pgSQL function process_test() line 4 at SQL statement
referenced column: process_test
NOTICE:
QueryPlan
----------------------------NestLevel:3----------------------------
Query Text: select teacher.name,stu.name from teacher left join course on course.cno = teacher.cno left join stu on stu.cno = course.cno
Name: datanode1
--?.*
Output: teacher.name, stu.name
Hash Cond: (course.cno = stu.cno)
--?.*
Output: teacher.name, course.cno
Hash Cond: (course.cno = teacher.cno)
--?.*
Output: course.cno, course.name
--?.*
Output: teacher.name, teacher.cno
--?.*
Output: teacher.name, teacher.cno
--?.*
Output: stu.name, stu.cno
--?.*
Output: stu.name, stu.cno
CONTEXT: PL/pgSQL function open_cursor() line 3 at OPEN
referenced column: open_cursor
SQL statement "select open_cursor()"
PL/pgSQL function complicate_process() line 21 at SQL statement
referenced column: complicate_process
SQL statement "select complicate_process()"
PL/pgSQL function process_test() line 4 at SQL statement
referenced column: process_test
NOTICE:
----------------------------NestLevel:3----------------------------
--?.*
CONTEXT: PL/pgSQL function open_cursor() line 3 at OPEN
referenced column: open_cursor
SQL statement "select open_cursor()"
PL/pgSQL function complicate_process() line 21 at SQL statement
referenced column: complicate_process
SQL statement "select complicate_process()"
PL/pgSQL function process_test() line 4 at SQL statement
referenced column: process_test
NOTICE:
----------------------------NestLevel:2----------------------------
--?.*

View File

@ -1998,7 +1998,6 @@ drop table source;
drop table target;
reset behavior_compat_options;
-- clean
drop PROCEDURE if exists check4(a int);
drop table if exists t1_test;
drop schema pl_auto_ref cascade;
NOTICE: drop cascades to 2 other objects
DETAIL: drop cascades to table t1_test
drop cascades to function check4(integer)

View File

@ -53,22 +53,22 @@ begin
end;
/
call test_cursor_2();
NOTICE: company_name : zhangsan <unnamed portal 8>
NOTICE: company_name : zhangsan <unnamed portal 4>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
NOTICE: last_name_name : heliu
NOTICE: company_name : lisi <unnamed portal 9>
NOTICE: company_name : lisi <unnamed portal 5>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
NOTICE: last_name_name : heliu
NOTICE: company_name : wangwu <unnamed portal 10>
NOTICE: company_name : wangwu <unnamed portal 6>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
NOTICE: last_name_name : heliu
NOTICE: company_name : heliu <unnamed portal 11>
NOTICE: company_name : heliu <unnamed portal 7>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
@ -110,71 +110,71 @@ begin
end;
/
call test_cursor_2();
NOTICE: company_name : zhangsan <unnamed portal 17>
NOTICE: last_name_name : zhangsan <unnamed portal 18>
NOTICE: company_name : zhangsan <unnamed portal 9>
NOTICE: last_name_name : zhangsan <unnamed portal 10>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : lisi <unnamed portal 19>
NOTICE: last_name_name : lisi <unnamed portal 11>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : wangwu <unnamed portal 20>
NOTICE: last_name_name : wangwu <unnamed portal 12>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : heliu <unnamed portal 21>
NOTICE: last_name_name : heliu <unnamed portal 13>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: company_name : lisi <unnamed portal 22>
NOTICE: last_name_name : zhangsan <unnamed portal 23>
NOTICE: company_name : lisi <unnamed portal 14>
NOTICE: last_name_name : zhangsan <unnamed portal 15>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : lisi <unnamed portal 24>
NOTICE: last_name_name : lisi <unnamed portal 16>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : wangwu <unnamed portal 25>
NOTICE: last_name_name : wangwu <unnamed portal 17>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : heliu <unnamed portal 26>
NOTICE: last_name_name : heliu <unnamed portal 18>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: company_name : wangwu <unnamed portal 27>
NOTICE: last_name_name : zhangsan <unnamed portal 28>
NOTICE: company_name : wangwu <unnamed portal 19>
NOTICE: last_name_name : zhangsan <unnamed portal 20>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : lisi <unnamed portal 29>
NOTICE: last_name_name : lisi <unnamed portal 21>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : wangwu <unnamed portal 30>
NOTICE: last_name_name : wangwu <unnamed portal 22>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : heliu <unnamed portal 31>
NOTICE: last_name_name : heliu <unnamed portal 23>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: company_name : heliu <unnamed portal 32>
NOTICE: last_name_name : zhangsan <unnamed portal 33>
NOTICE: company_name : heliu <unnamed portal 24>
NOTICE: last_name_name : zhangsan <unnamed portal 25>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : lisi <unnamed portal 34>
NOTICE: last_name_name : lisi <unnamed portal 26>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : wangwu <unnamed portal 35>
NOTICE: last_name_name : wangwu <unnamed portal 27>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : heliu <unnamed portal 36>
NOTICE: last_name_name : heliu <unnamed portal 28>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
@ -206,25 +206,25 @@ BEGIN
CLOSE c1;
END;
/
NOTICE: company_name : zhangsan <unnamed portal 42>
NOTICE: company_name : zhangsan <unnamed portal 30>
NOTICE: employee_name : zhangsan
NOTICE: employee_name : lisi
NOTICE: employee_name : wangwu
NOTICE: employee_name : heliu
NOTICE: employee_name : heliu
NOTICE: company_name : lisi <unnamed portal 43>
NOTICE: company_name : lisi <unnamed portal 31>
NOTICE: employee_name : zhangsan
NOTICE: employee_name : lisi
NOTICE: employee_name : wangwu
NOTICE: employee_name : heliu
NOTICE: employee_name : heliu
NOTICE: company_name : wangwu <unnamed portal 44>
NOTICE: company_name : wangwu <unnamed portal 32>
NOTICE: employee_name : zhangsan
NOTICE: employee_name : lisi
NOTICE: employee_name : wangwu
NOTICE: employee_name : heliu
NOTICE: employee_name : heliu
NOTICE: company_name : heliu <unnamed portal 45>
NOTICE: company_name : heliu <unnamed portal 33>
NOTICE: employee_name : zhangsan
NOTICE: employee_name : lisi
NOTICE: employee_name : wangwu
@ -265,7 +265,7 @@ NOTICE: my_cur isopen : t
NOTICE: my_cur found : f
NOTICE: my_cur not found : f
NOTICE: my_cur row count : 0
NOTICE: company_name : zhangsan <unnamed portal 51>
NOTICE: company_name : zhangsan <unnamed portal 35>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
@ -278,7 +278,7 @@ NOTICE: my_cur isopen : t
NOTICE: my_cur found : f
NOTICE: my_cur not found : f
NOTICE: my_cur row count : 0
NOTICE: company_name : lisi <unnamed portal 52>
NOTICE: company_name : lisi <unnamed portal 36>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
@ -291,7 +291,7 @@ NOTICE: my_cur isopen : t
NOTICE: my_cur found : f
NOTICE: my_cur not found : f
NOTICE: my_cur row count : 0
NOTICE: company_name : wangwu <unnamed portal 53>
NOTICE: company_name : wangwu <unnamed portal 37>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
@ -304,7 +304,7 @@ NOTICE: my_cur isopen : t
NOTICE: my_cur found : f
NOTICE: my_cur not found : f
NOTICE: my_cur row count : 0
NOTICE: company_name : heliu <unnamed portal 54>
NOTICE: company_name : heliu <unnamed portal 38>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
@ -401,9 +401,9 @@ begin
end;
/
call test_cursor_2();
NOTICE: department_name : pro <unnamed portal 63>
NOTICE: department_name : rd <unnamed portal 62>
NOTICE: department_name : sale <unnamed portal 61>
NOTICE: department_name : pro <unnamed portal 47>
NOTICE: department_name : rd <unnamed portal 46>
NOTICE: department_name : sale <unnamed portal 45>
NOTICE: department employees info : 1 zhang
NOTICE: department employees info : 2 li
test_cursor_2
@ -437,9 +437,9 @@ begin
end;
/
call test_cursor_2();
NOTICE: department_name : pro <unnamed portal 67>
NOTICE: department_name : rd <unnamed portal 66>
NOTICE: department_name : sale <unnamed portal 65>
NOTICE: department_name : pro <unnamed portal 51>
NOTICE: department_name : rd <unnamed portal 50>
NOTICE: department_name : sale <unnamed portal 49>
NOTICE: department employees info : 1 zhang
NOTICE: department employees info : 2 li
test_cursor_2
@ -506,9 +506,9 @@ begin
end;
/
call test_cursor_2();
NOTICE: department_name : pro <unnamed portal 71>
NOTICE: department_name : rd <unnamed portal 70>
NOTICE: department_name : sale <unnamed portal 69>
NOTICE: department_name : pro <unnamed portal 55>
NOTICE: department_name : rd <unnamed portal 54>
NOTICE: department_name : sale <unnamed portal 53>
NOTICE: department employees info : 1 zhang
NOTICE: department employees info : 2 li
test_cursor_2
@ -521,9 +521,9 @@ drop procedure test_cursor_2;
SELECT department_name, CURSOR(with aa as (select employees_id from employees) select * from aa) FROM departments d;
department_name | ?column?
-----------------+---------------------
sale | <unnamed portal 72>
rd | <unnamed portal 73>
pro | <unnamed portal 74>
sale | <unnamed portal 56>
rd | <unnamed portal 57>
pro | <unnamed portal 58>
(3 rows)
-- test conflict with cursor function
@ -554,7 +554,7 @@ set behavior_compat_options = 'prefer_parse_cursor_parentheses_as_expr';
SELECT department_name, CURSOR((SELECT e.name FROM employees e)) FROM departments d WHERE department_name='sale' ORDER BY department_name;
department_name | ?column?
-----------------+---------------------
sale | <unnamed portal 75>
sale | <unnamed portal 59>
(1 row)
-- view contain cursor expr
@ -562,7 +562,7 @@ create view v1 as SELECT department_name, CURSOR(SELECT e.name FROM employees e)
select * from v1;
department_name | ?column?
-----------------+---------------------
sale | <unnamed portal 76>
sale | <unnamed portal 60>
(1 row)
drop view v1;
@ -570,19 +570,19 @@ drop view v1;
SELECT department_name, CURSOR((SELECT e.name FROM employees e)) FROM departments d WHERE department_name='sale' ORDER BY department_name;
department_name | ?column?
-----------------+---------------------
sale | <unnamed portal 77>
sale | <unnamed portal 61>
(1 row)
SELECT department_name, CURSOR(((SELECT e.name FROM employees e))) FROM departments d WHERE department_name='sale' ORDER BY department_name;
department_name | ?column?
-----------------+---------------------
sale | <unnamed portal 78>
sale | <unnamed portal 62>
(1 row)
SELECT department_name, CURSOR(((/*test*/SELECT e.name FROM employees e))) FROM departments d WHERE department_name='sale' ORDER BY department_name;
department_name | ?column?
-----------------+---------------------
sale | <unnamed portal 79>
sale | <unnamed portal 63>
(1 row)
-- permission
@ -625,10 +625,10 @@ begin
end;
/
call test_cursor_2();
NOTICE: company_name : zhangsan <unnamed portal 86>
NOTICE: company_name : lisi <unnamed portal 87>
NOTICE: company_name : wangwu <unnamed portal 88>
NOTICE: company_name : heliu <unnamed portal 89>
NOTICE: company_name : zhangsan <unnamed portal 66>
NOTICE: company_name : lisi <unnamed portal 67>
NOTICE: company_name : wangwu <unnamed portal 68>
NOTICE: company_name : heliu <unnamed portal 69>
test_cursor_2
---------------
@ -658,22 +658,22 @@ begin
end;
/
call test_cursor_2();
NOTICE: company_name : zhangsan <unnamed portal 95>
NOTICE: company_name : zhangsan <unnamed portal 71>
NOTICE: last_name : zhangsan
NOTICE: last_name : lisi
NOTICE: last_name : wangwu
NOTICE: last_name : heliu
NOTICE: company_name : lisi <unnamed portal 96>
NOTICE: company_name : lisi <unnamed portal 72>
NOTICE: last_name : zhangsan
NOTICE: last_name : lisi
NOTICE: last_name : wangwu
NOTICE: last_name : heliu
NOTICE: company_name : wangwu <unnamed portal 97>
NOTICE: company_name : wangwu <unnamed portal 73>
NOTICE: last_name : zhangsan
NOTICE: last_name : lisi
NOTICE: last_name : wangwu
NOTICE: last_name : heliu
NOTICE: company_name : heliu <unnamed portal 98>
NOTICE: company_name : heliu <unnamed portal 74>
NOTICE: last_name : zhangsan
NOTICE: last_name : lisi
NOTICE: last_name : wangwu
@ -698,10 +698,10 @@ begin
end;
/
call test_cursor_2();
NOTICE: zhangsan <unnamed portal 100>
NOTICE: lisi <unnamed portal 101>
NOTICE: wangwu <unnamed portal 102>
NOTICE: heliu <unnamed portal 103>
NOTICE: zhangsan <unnamed portal 76>
NOTICE: lisi <unnamed portal 77>
NOTICE: wangwu <unnamed portal 78>
NOTICE: heliu <unnamed portal 79>
test_cursor_2
---------------
@ -722,10 +722,10 @@ begin
end;
/
call test_cursor_2();
NOTICE: zhangsan <unnamed portal 105>
NOTICE: lisi <unnamed portal 106>
NOTICE: wangwu <unnamed portal 107>
NOTICE: heliu <unnamed portal 108>
NOTICE: zhangsan <unnamed portal 81>
NOTICE: lisi <unnamed portal 82>
NOTICE: wangwu <unnamed portal 83>
NOTICE: heliu <unnamed portal 84>
test_cursor_2
---------------
@ -748,10 +748,10 @@ begin
end;
/
call test_cursor_2();
NOTICE: name : zhangsan <unnamed portal 114>
NOTICE: name : lisi <unnamed portal 115>
NOTICE: name : wangwu <unnamed portal 116>
NOTICE: name : heliu <unnamed portal 117>
NOTICE: name : zhangsan <unnamed portal 86>
NOTICE: name : lisi <unnamed portal 87>
NOTICE: name : wangwu <unnamed portal 88>
NOTICE: name : heliu <unnamed portal 89>
test_cursor_2
---------------
@ -778,22 +778,22 @@ begin
end;
/
call test_cursor_2();
NOTICE: zhangsan <unnamed portal 119>
NOTICE: zhangsan <unnamed portal 91>
NOTICE: last_name : zhangsan
NOTICE: last_name : lisi
NOTICE: last_name : wangwu
NOTICE: last_name : heliu
NOTICE: lisi <unnamed portal 120>
NOTICE: lisi <unnamed portal 92>
NOTICE: last_name : zhangsan
NOTICE: last_name : lisi
NOTICE: last_name : wangwu
NOTICE: last_name : heliu
NOTICE: wangwu <unnamed portal 121>
NOTICE: wangwu <unnamed portal 93>
NOTICE: last_name : zhangsan
NOTICE: last_name : lisi
NOTICE: last_name : wangwu
NOTICE: last_name : heliu
NOTICE: heliu <unnamed portal 122>
NOTICE: heliu <unnamed portal 94>
NOTICE: last_name : zhangsan
NOTICE: last_name : lisi
NOTICE: last_name : wangwu

View File

@ -116,7 +116,64 @@ ALTER VIEW source_schema.test SET SCHEMA target_schema; --expected: SET SCHEMA
ERROR: relation name is already used by an existing synonym in schema "target_schema"
ALTER PROCEDURE source_schema.test() SET SCHEMA target_schema; --expected: SET SCHEMA ERROR
ERROR: function name is already used by an existing synonym in schema "target_schema"
create table SYN_TAB_001
(
id int,
name varchar2(10),
sal number
);
insert into SYN_TAB_001 values(1,'aaa',2600);
insert into SYN_TAB_001 values(1,'bbb',2600);
insert into SYN_TAB_001 values(2,'ccc',2800);
insert into SYN_TAB_001 values(3,'ddd',3000);
insert into SYN_TAB_001 values(3,'fff',3000);
insert into SYN_TAB_001 values(4,'eee',3200);
create or replace function SYN_FUN_001(a number) return number
as
begin
return a+1000;
end;
/
create or replace synonym SYN_FUN_SYN_001 for SYN_FUN_001;
create or replace procedure SYN_PROC_001
as
c_cur sys_refcursor;
c_id int;
c_name varchar2(10);
c_syn number;
begin
open c_cur for select id,name,SYN_FUN_SYN_001(sal) syn from SYN_TAB_001;
loop
fetch c_cur into c_id,c_name,c_syn;
exit when c_cur%notfound;
raise info 'c_id:% - c_name:% - c_syn:%',c_id,c_name,c_syn;
end loop;
close c_cur;
end;
/
select SYN_PROC_001();
INFO: c_id:1 - c_name:aaa - c_syn:3600
CONTEXT: referenced column: syn_proc_001
INFO: c_id:1 - c_name:bbb - c_syn:3600
CONTEXT: referenced column: syn_proc_001
INFO: c_id:2 - c_name:ccc - c_syn:3800
CONTEXT: referenced column: syn_proc_001
INFO: c_id:3 - c_name:ddd - c_syn:4000
CONTEXT: referenced column: syn_proc_001
INFO: c_id:3 - c_name:fff - c_syn:4000
CONTEXT: referenced column: syn_proc_001
INFO: c_id:4 - c_name:eee - c_syn:4200
CONTEXT: referenced column: syn_proc_001
syn_proc_001
--------------
(1 row)
-- clean up
drop table if exists SYN_TAB_001 cascade;
drop function SYN_FUN_001;
drop procedure SYN_PROC_001;
drop synonym if exists SYN_FUN_SYN_001;
RESET current_schema;
DROP SCHEMA synonym_test_schema CASCADE;
NOTICE: drop cascades to 2 other objects

View File

@ -100,22 +100,22 @@ ALTER VIEW
--?.*
-- cursor expression check
call test_cursor_2();
NOTICE: company_name : zhangsan <unnamed portal 6>
NOTICE: company_name : zhangsan <unnamed portal 2>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
NOTICE: last_name_name : heliu
NOTICE: company_name : lisi <unnamed portal 7>
NOTICE: company_name : lisi <unnamed portal 3>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
NOTICE: last_name_name : heliu
NOTICE: company_name : wangwu <unnamed portal 8>
NOTICE: company_name : wangwu <unnamed portal 4>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
NOTICE: last_name_name : heliu
NOTICE: company_name : heliu <unnamed portal 9>
NOTICE: company_name : heliu <unnamed portal 5>
NOTICE: last_name_name : zhangsan
NOTICE: last_name_name : lisi
NOTICE: last_name_name : wangwu
@ -126,71 +126,71 @@ NOTICE: last_name_name : heliu
(1 row)
call test_cursor_3();
NOTICE: company_name : zhangsan <unnamed portal 15>
NOTICE: last_name_name : zhangsan <unnamed portal 16>
NOTICE: company_name : zhangsan <unnamed portal 7>
NOTICE: last_name_name : zhangsan <unnamed portal 8>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : lisi <unnamed portal 17>
NOTICE: last_name_name : lisi <unnamed portal 9>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : wangwu <unnamed portal 18>
NOTICE: last_name_name : wangwu <unnamed portal 10>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : heliu <unnamed portal 19>
NOTICE: last_name_name : heliu <unnamed portal 11>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: company_name : lisi <unnamed portal 20>
NOTICE: last_name_name : zhangsan <unnamed portal 21>
NOTICE: company_name : lisi <unnamed portal 12>
NOTICE: last_name_name : zhangsan <unnamed portal 13>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : lisi <unnamed portal 22>
NOTICE: last_name_name : lisi <unnamed portal 14>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : wangwu <unnamed portal 23>
NOTICE: last_name_name : wangwu <unnamed portal 15>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : heliu <unnamed portal 24>
NOTICE: last_name_name : heliu <unnamed portal 16>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: company_name : wangwu <unnamed portal 25>
NOTICE: last_name_name : zhangsan <unnamed portal 26>
NOTICE: company_name : wangwu <unnamed portal 17>
NOTICE: last_name_name : zhangsan <unnamed portal 18>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : lisi <unnamed portal 27>
NOTICE: last_name_name : lisi <unnamed portal 19>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : wangwu <unnamed portal 28>
NOTICE: last_name_name : wangwu <unnamed portal 20>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : heliu <unnamed portal 29>
NOTICE: last_name_name : heliu <unnamed portal 21>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: company_name : heliu <unnamed portal 30>
NOTICE: last_name_name : zhangsan <unnamed portal 31>
NOTICE: company_name : heliu <unnamed portal 22>
NOTICE: last_name_name : zhangsan <unnamed portal 23>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : lisi <unnamed portal 32>
NOTICE: last_name_name : lisi <unnamed portal 24>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : wangwu <unnamed portal 33>
NOTICE: last_name_name : wangwu <unnamed portal 25>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
NOTICE: last_name_name : heliu <unnamed portal 34>
NOTICE: last_name_name : heliu <unnamed portal 26>
NOTICE: last_name_name2 : h
NOTICE: last_name_name2 : a
NOTICE: last_name_name2 : t
@ -202,7 +202,7 @@ NOTICE: last_name_name2 : t
select * from v1;
department_name | ?column?
-----------------+---------------------
sale | <unnamed portal 35>
sale | <unnamed portal 27>
(1 row)
drop schema cursor_expression_dump cascade;

View File

@ -1600,6 +1600,8 @@ drop table target;
reset behavior_compat_options;
-- clean
drop PROCEDURE if exists check4(a int);
drop table if exists t1_test;
drop schema pl_auto_ref cascade;

View File

@ -100,7 +100,55 @@ END;
ALTER VIEW source_schema.test SET SCHEMA target_schema; --expected: SET SCHEMA ERROR
ALTER PROCEDURE source_schema.test() SET SCHEMA target_schema; --expected: SET SCHEMA ERROR
create table SYN_TAB_001
(
id int,
name varchar2(10),
sal number
);
insert into SYN_TAB_001 values(1,'aaa',2600);
insert into SYN_TAB_001 values(1,'bbb',2600);
insert into SYN_TAB_001 values(2,'ccc',2800);
insert into SYN_TAB_001 values(3,'ddd',3000);
insert into SYN_TAB_001 values(3,'fff',3000);
insert into SYN_TAB_001 values(4,'eee',3200);
create or replace function SYN_FUN_001(a number) return number
as
begin
return a+1000;
end;
/
create or replace synonym SYN_FUN_SYN_001 for SYN_FUN_001;
create or replace procedure SYN_PROC_001
as
c_cur sys_refcursor;
c_id int;
c_name varchar2(10);
c_syn number;
begin
open c_cur for select id,name,SYN_FUN_SYN_001(sal) syn from SYN_TAB_001;
loop
fetch c_cur into c_id,c_name,c_syn;
exit when c_cur%notfound;
raise info 'c_id:% - c_name:% - c_syn:%',c_id,c_name,c_syn;
end loop;
close c_cur;
end;
/
select SYN_PROC_001();
-- clean up
drop table if exists SYN_TAB_001 cascade;
drop function SYN_FUN_001;
drop procedure SYN_PROC_001;
drop synonym if exists SYN_FUN_SYN_001;
RESET current_schema;
DROP SCHEMA synonym_test_schema CASCADE;
DROP SCHEMA target_schema CASCADE;