【标题】: 修复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:
@ -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
|
||||
|
||||
@ -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----------------------------
|
||||
--?.*
|
||||
|
||||
|
||||
@ -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)
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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;
|
||||
|
||||
|
||||
|
||||
@ -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;
|
||||
|
||||
Reference in New Issue
Block a user