diff --git a/src/common/pl/plpgsql/src/pl_exec.cpp b/src/common/pl/plpgsql/src/pl_exec.cpp index 63b1691fd..eebce3b71 100644 --- a/src/common/pl/plpgsql/src/pl_exec.cpp +++ b/src/common/pl/plpgsql/src/pl_exec.cpp @@ -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 diff --git a/src/test/regress/expected/auto_explain.out b/src/test/regress/expected/auto_explain.out index 910640a1b..dd910747e 100644 --- a/src/test/regress/expected/auto_explain.out +++ b/src/test/regress/expected/auto_explain.out @@ -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---------------------------- --?.* diff --git a/src/test/regress/expected/autonomous_cursor.out b/src/test/regress/expected/autonomous_cursor.out index 0263573f5..7c98ec2e5 100644 --- a/src/test/regress/expected/autonomous_cursor.out +++ b/src/test/regress/expected/autonomous_cursor.out @@ -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) diff --git a/src/test/regress/expected/cursor_expression.out b/src/test/regress/expected/cursor_expression.out index 63e439f80..6b3a59b67 100644 --- a/src/test/regress/expected/cursor_expression.out +++ b/src/test/regress/expected/cursor_expression.out @@ -53,22 +53,22 @@ begin end; / call test_cursor_2(); -NOTICE: company_name : zhangsan +NOTICE: company_name : zhangsan NOTICE: last_name_name : zhangsan NOTICE: last_name_name : lisi NOTICE: last_name_name : wangwu NOTICE: last_name_name : heliu -NOTICE: company_name : lisi +NOTICE: company_name : lisi NOTICE: last_name_name : zhangsan NOTICE: last_name_name : lisi NOTICE: last_name_name : wangwu NOTICE: last_name_name : heliu -NOTICE: company_name : wangwu +NOTICE: company_name : wangwu NOTICE: last_name_name : zhangsan NOTICE: last_name_name : lisi NOTICE: last_name_name : wangwu NOTICE: last_name_name : heliu -NOTICE: company_name : heliu +NOTICE: company_name : heliu 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 -NOTICE: last_name_name : zhangsan +NOTICE: company_name : zhangsan +NOTICE: last_name_name : zhangsan NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : lisi +NOTICE: last_name_name : lisi NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : wangwu +NOTICE: last_name_name : wangwu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : heliu +NOTICE: last_name_name : heliu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: company_name : lisi -NOTICE: last_name_name : zhangsan +NOTICE: company_name : lisi +NOTICE: last_name_name : zhangsan NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : lisi +NOTICE: last_name_name : lisi NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : wangwu +NOTICE: last_name_name : wangwu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : heliu +NOTICE: last_name_name : heliu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: company_name : wangwu -NOTICE: last_name_name : zhangsan +NOTICE: company_name : wangwu +NOTICE: last_name_name : zhangsan NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : lisi +NOTICE: last_name_name : lisi NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : wangwu +NOTICE: last_name_name : wangwu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : heliu +NOTICE: last_name_name : heliu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: company_name : heliu -NOTICE: last_name_name : zhangsan +NOTICE: company_name : heliu +NOTICE: last_name_name : zhangsan NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : lisi +NOTICE: last_name_name : lisi NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : wangwu +NOTICE: last_name_name : wangwu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : heliu +NOTICE: last_name_name : heliu 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 +NOTICE: company_name : zhangsan NOTICE: employee_name : zhangsan NOTICE: employee_name : lisi NOTICE: employee_name : wangwu NOTICE: employee_name : heliu NOTICE: employee_name : heliu -NOTICE: company_name : lisi +NOTICE: company_name : lisi NOTICE: employee_name : zhangsan NOTICE: employee_name : lisi NOTICE: employee_name : wangwu NOTICE: employee_name : heliu NOTICE: employee_name : heliu -NOTICE: company_name : wangwu +NOTICE: company_name : wangwu NOTICE: employee_name : zhangsan NOTICE: employee_name : lisi NOTICE: employee_name : wangwu NOTICE: employee_name : heliu NOTICE: employee_name : heliu -NOTICE: company_name : heliu +NOTICE: company_name : heliu 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 +NOTICE: company_name : zhangsan 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 +NOTICE: company_name : lisi 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 +NOTICE: company_name : wangwu 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 +NOTICE: company_name : heliu 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 -NOTICE: department_name : rd -NOTICE: department_name : sale +NOTICE: department_name : pro +NOTICE: department_name : rd +NOTICE: department_name : sale 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 -NOTICE: department_name : rd -NOTICE: department_name : sale +NOTICE: department_name : pro +NOTICE: department_name : rd +NOTICE: department_name : sale 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 -NOTICE: department_name : rd -NOTICE: department_name : sale +NOTICE: department_name : pro +NOTICE: department_name : rd +NOTICE: department_name : sale 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 | - rd | - pro | + sale | + rd | + pro | (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 | + sale | (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 | + sale | (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 | + sale | (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 | + sale | (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 | + sale | (1 row) -- permission @@ -625,10 +625,10 @@ begin end; / call test_cursor_2(); -NOTICE: company_name : zhangsan -NOTICE: company_name : lisi -NOTICE: company_name : wangwu -NOTICE: company_name : heliu +NOTICE: company_name : zhangsan +NOTICE: company_name : lisi +NOTICE: company_name : wangwu +NOTICE: company_name : heliu test_cursor_2 --------------- @@ -658,22 +658,22 @@ begin end; / call test_cursor_2(); -NOTICE: company_name : zhangsan +NOTICE: company_name : zhangsan NOTICE: last_name : zhangsan NOTICE: last_name : lisi NOTICE: last_name : wangwu NOTICE: last_name : heliu -NOTICE: company_name : lisi +NOTICE: company_name : lisi NOTICE: last_name : zhangsan NOTICE: last_name : lisi NOTICE: last_name : wangwu NOTICE: last_name : heliu -NOTICE: company_name : wangwu +NOTICE: company_name : wangwu NOTICE: last_name : zhangsan NOTICE: last_name : lisi NOTICE: last_name : wangwu NOTICE: last_name : heliu -NOTICE: company_name : heliu +NOTICE: company_name : heliu NOTICE: last_name : zhangsan NOTICE: last_name : lisi NOTICE: last_name : wangwu @@ -698,10 +698,10 @@ begin end; / call test_cursor_2(); -NOTICE: zhangsan -NOTICE: lisi -NOTICE: wangwu -NOTICE: heliu +NOTICE: zhangsan +NOTICE: lisi +NOTICE: wangwu +NOTICE: heliu test_cursor_2 --------------- @@ -722,10 +722,10 @@ begin end; / call test_cursor_2(); -NOTICE: zhangsan -NOTICE: lisi -NOTICE: wangwu -NOTICE: heliu +NOTICE: zhangsan +NOTICE: lisi +NOTICE: wangwu +NOTICE: heliu test_cursor_2 --------------- @@ -748,10 +748,10 @@ begin end; / call test_cursor_2(); -NOTICE: name : zhangsan -NOTICE: name : lisi -NOTICE: name : wangwu -NOTICE: name : heliu +NOTICE: name : zhangsan +NOTICE: name : lisi +NOTICE: name : wangwu +NOTICE: name : heliu test_cursor_2 --------------- @@ -778,22 +778,22 @@ begin end; / call test_cursor_2(); -NOTICE: zhangsan +NOTICE: zhangsan NOTICE: last_name : zhangsan NOTICE: last_name : lisi NOTICE: last_name : wangwu NOTICE: last_name : heliu -NOTICE: lisi +NOTICE: lisi NOTICE: last_name : zhangsan NOTICE: last_name : lisi NOTICE: last_name : wangwu NOTICE: last_name : heliu -NOTICE: wangwu +NOTICE: wangwu NOTICE: last_name : zhangsan NOTICE: last_name : lisi NOTICE: last_name : wangwu NOTICE: last_name : heliu -NOTICE: heliu +NOTICE: heliu NOTICE: last_name : zhangsan NOTICE: last_name : lisi NOTICE: last_name : wangwu diff --git a/src/test/regress/expected/synonym_conflict_test.out b/src/test/regress/expected/synonym_conflict_test.out index b589e5ef6..4cc15a1d9 100644 --- a/src/test/regress/expected/synonym_conflict_test.out +++ b/src/test/regress/expected/synonym_conflict_test.out @@ -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 diff --git a/src/test/regress/output/cursor_expression_dump.source b/src/test/regress/output/cursor_expression_dump.source index 5c296b8c2..56dfac6d7 100644 --- a/src/test/regress/output/cursor_expression_dump.source +++ b/src/test/regress/output/cursor_expression_dump.source @@ -100,22 +100,22 @@ ALTER VIEW --?.* -- cursor expression check call test_cursor_2(); -NOTICE: company_name : zhangsan +NOTICE: company_name : zhangsan NOTICE: last_name_name : zhangsan NOTICE: last_name_name : lisi NOTICE: last_name_name : wangwu NOTICE: last_name_name : heliu -NOTICE: company_name : lisi +NOTICE: company_name : lisi NOTICE: last_name_name : zhangsan NOTICE: last_name_name : lisi NOTICE: last_name_name : wangwu NOTICE: last_name_name : heliu -NOTICE: company_name : wangwu +NOTICE: company_name : wangwu NOTICE: last_name_name : zhangsan NOTICE: last_name_name : lisi NOTICE: last_name_name : wangwu NOTICE: last_name_name : heliu -NOTICE: company_name : heliu +NOTICE: company_name : heliu 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 -NOTICE: last_name_name : zhangsan +NOTICE: company_name : zhangsan +NOTICE: last_name_name : zhangsan NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : lisi +NOTICE: last_name_name : lisi NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : wangwu +NOTICE: last_name_name : wangwu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : heliu +NOTICE: last_name_name : heliu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: company_name : lisi -NOTICE: last_name_name : zhangsan +NOTICE: company_name : lisi +NOTICE: last_name_name : zhangsan NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : lisi +NOTICE: last_name_name : lisi NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : wangwu +NOTICE: last_name_name : wangwu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : heliu +NOTICE: last_name_name : heliu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: company_name : wangwu -NOTICE: last_name_name : zhangsan +NOTICE: company_name : wangwu +NOTICE: last_name_name : zhangsan NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : lisi +NOTICE: last_name_name : lisi NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : wangwu +NOTICE: last_name_name : wangwu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : heliu +NOTICE: last_name_name : heliu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: company_name : heliu -NOTICE: last_name_name : zhangsan +NOTICE: company_name : heliu +NOTICE: last_name_name : zhangsan NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : lisi +NOTICE: last_name_name : lisi NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : wangwu +NOTICE: last_name_name : wangwu NOTICE: last_name_name2 : h NOTICE: last_name_name2 : a NOTICE: last_name_name2 : t -NOTICE: last_name_name : heliu +NOTICE: last_name_name : heliu 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 | + sale | (1 row) drop schema cursor_expression_dump cascade; diff --git a/src/test/regress/sql/autonomous_cursor.sql b/src/test/regress/sql/autonomous_cursor.sql index 959cb1b85..abab16299 100644 --- a/src/test/regress/sql/autonomous_cursor.sql +++ b/src/test/regress/sql/autonomous_cursor.sql @@ -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; diff --git a/src/test/regress/sql/synonym_conflict_test.sql b/src/test/regress/sql/synonym_conflict_test.sql index ca949dffe..c4fe0e2a3 100644 --- a/src/test/regress/sql/synonym_conflict_test.sql +++ b/src/test/regress/sql/synonym_conflict_test.sql @@ -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;