diff --git a/src/common/backend/nodes/copyfuncs.cpp b/src/common/backend/nodes/copyfuncs.cpp index b6bc8ed7e..1741812f2 100644 --- a/src/common/backend/nodes/copyfuncs.cpp +++ b/src/common/backend/nodes/copyfuncs.cpp @@ -5338,6 +5338,7 @@ static CursorExpression* _copyCursorExpression(const CursorExpression* from) COPY_STRING_FIELD(raw_query_str); COPY_NODE_FIELD(param); COPY_SCALAR_FIELD(location); + COPY_SCALAR_FIELD(is_simple_select_target); return newnode; } diff --git a/src/common/backend/nodes/equalfuncs.cpp b/src/common/backend/nodes/equalfuncs.cpp index 0b1b756ab..a7a830c65 100644 --- a/src/common/backend/nodes/equalfuncs.cpp +++ b/src/common/backend/nodes/equalfuncs.cpp @@ -1270,6 +1270,7 @@ static bool _equalCursorExpression(const CursorExpression* a, const CursorExpres COMPARE_STRING_FIELD(raw_query_str); COMPARE_NODE_FIELD(param); COMPARE_SCALAR_FIELD(location); + COMPARE_SCALAR_FIELD(is_simple_select_target); return true; } diff --git a/src/common/backend/nodes/outfuncs.cpp b/src/common/backend/nodes/outfuncs.cpp index 65d2b3916..d59fb43fd 100755 --- a/src/common/backend/nodes/outfuncs.cpp +++ b/src/common/backend/nodes/outfuncs.cpp @@ -4160,6 +4160,7 @@ static void _outCursorExpression(StringInfo str, CursorExpression* node) WRITE_STRING_FIELD(raw_query_str); WRITE_NODE_FIELD(param); WRITE_INT_FIELD(location); + WRITE_BOOL_FIELD(is_simple_select_target); } diff --git a/src/common/backend/nodes/readfuncs.cpp b/src/common/backend/nodes/readfuncs.cpp index 12ffc3017..5b818c43b 100755 --- a/src/common/backend/nodes/readfuncs.cpp +++ b/src/common/backend/nodes/readfuncs.cpp @@ -1712,6 +1712,7 @@ static CursorExpression* _readCursorExpression(void) READ_STRING_FIELD(raw_query_str); READ_NODE_FIELD(param); READ_INT_FIELD(location); + READ_BOOL_FIELD(is_simple_select_target); READ_DONE(); } diff --git a/src/common/backend/parser/parse_expr.cpp b/src/common/backend/parser/parse_expr.cpp index 849b07fb3..df6c523c7 100644 --- a/src/common/backend/parser/parse_expr.cpp +++ b/src/common/backend/parser/parse_expr.cpp @@ -364,6 +364,7 @@ Node* transformExpr(ParseState* pstate, Node* expr, ParseExprKind exprKind) sv_expr_kind = pstate->p_expr_kind; pstate->p_expr_kind = exprKind; + pstate->p_expr_transform_level = 0; result = transformExprRecurse(pstate, expr); pstate->p_expr_kind = sv_expr_kind; @@ -380,6 +381,7 @@ Node *transformExprRecurse(ParseState *pstate, Node *expr) } /* Guard against stack overflow due to overly complex expressions */ check_stack_depth(); + pstate->p_expr_transform_level++; switch (nodeTag(expr)) { case T_ColumnRef: @@ -1903,7 +1905,7 @@ static Node* transformFuncCall(ParseState* pstate, FuncCall* fn) if (i != seq) { dopControl.CloseSmp(); } - lfirst(args) = transformCursorExpression(pstate, (CursorExpression*)arg); + lfirst(args) = transformExprRecurse(pstate, arg); dopControl.ResetSmp(); } i++; @@ -3942,6 +3944,13 @@ static Node* transformCursorExpression(ParseState* pstate, CursorExpression* cur newm->raw_query_str = queryString; newm->param = (List*)copyObject(parse_state_parent->cursor_expression_para_var); + if (pstate->p_pre_columnref_hook == NULL && pstate->p_post_columnref_hook == NULL && + pstate->p_expr_kind == EXPR_KIND_SELECT_TARGET && pstate->p_expr_transform_level == 1) { + newm->is_simple_select_target = true; + } else { + newm->is_simple_select_target = false; + } + list_free_ext(stmt_list); list_free_ext(raw_parsetree_list); diff --git a/src/gausskernel/runtime/executor/execQual.cpp b/src/gausskernel/runtime/executor/execQual.cpp index f9e368fbc..f7ace8757 100644 --- a/src/gausskernel/runtime/executor/execQual.cpp +++ b/src/gausskernel/runtime/executor/execQual.cpp @@ -5162,7 +5162,7 @@ Oid deparseNodeForInputype(Expr *expr, NodeTag type, float8 val) if (type == T_NanTest) { argexpr = ((NanTest *) expr)->arg; - } else if (type = T_InfiniteTest) { + } else if (type == T_InfiniteTest) { argexpr = ((InfiniteTest *) expr)->arg; } else { ereport(ERROR, @@ -5889,6 +5889,15 @@ static Datum ExecEvalCursorExpression(CursorExpressionState* state, ExprContext* } *isNull = false; + /* + * we will never access the protal later when the cursor expression is in a simple target query, such as query: select a, cursor("select xxx") from xx, + * so in this case we no need to create the protal and just need to return a dummy portal name + */ + if (cursor_expression->is_simple_select_target == true) { + portal_name = pstrdup(""); + return CStringGetTextDatum(portal_name); + } + portal = CreateNewPortal(false); oldContext = MemoryContextSwitchTo(PortalGetHeapMemory(portal)); diff --git a/src/include/nodes/parsenodes_common.h b/src/include/nodes/parsenodes_common.h index 41c909360..0a000d37b 100644 --- a/src/include/nodes/parsenodes_common.h +++ b/src/include/nodes/parsenodes_common.h @@ -654,6 +654,7 @@ typedef struct CursorExpression { char * raw_query_str; /* cursor expression raw query string*/ List* param; /* cursor expression param. used to passed outer var to expression query*/ int location; /* token location, or -1 if unknown */ + bool is_simple_select_target; /* plpgsql will set it as true and simple query will set it as false */ } CursorExpression; /* ---------------------- diff --git a/src/include/parser/parse_node.h b/src/include/parser/parse_node.h index be0a302e2..bbc0e5e47 100644 --- a/src/include/parser/parse_node.h +++ b/src/include/parser/parse_node.h @@ -291,6 +291,7 @@ struct ParseState { bool has_uservar; bool is_outer_parse_state; /*is parse state is from outer scope, for cursor expression case*/ List* cursor_expression_para_var; + int p_expr_transform_level; /* indicast the expr transform level in the target list */ }; /* An element of p_relnamespace or p_varnamespace */ diff --git a/src/test/regress/expected/cursor_expression.out b/src/test/regress/expected/cursor_expression.out index 576fa2789..faa4fa166 100644 --- a/src/test/regress/expected/cursor_expression.out +++ b/src/test/regress/expected/cursor_expression.out @@ -14,18 +14,18 @@ insert into company values ('h'),('a'),('t'); insert into employees2 values (1, 1, 'zhang', 'san', '1@abc.com', 123),(2, 1, 'li', 'si', '2@abc.com', 124); -- test cursor in select directly 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 | + department_name | ?column? +-----------------+------------------ + sale | (1 row) -- test cursor in declare START TRANSACTION; CURSOR cursor1 FOR SELECT e.name, CURSOR(SELECT e1.name, CURSOR(select c2.name from company c2) fff FROM employees e1) abc FROM employees e; FETCH cursor1; - name | abc -----------+-------------------- - zhangsan | + name | abc +----------+------------------ + zhangsan | (1 row) CLOSE cursor1; @@ -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 @@ -519,11 +519,11 @@ NOTICE: department employees info : 2 li drop procedure test_cursor_2; -- test start with query SELECT department_name, CURSOR(with aa as (select employees_id from employees) select * from aa) FROM departments d; - department_name | ?column? ------------------+--------------------- - sale | - rd | - pro | + department_name | ?column? +-----------------+------------------ + sale | + rd | + pro | (3 rows) -- test conflict with cursor function @@ -552,37 +552,37 @@ CONTEXT: referenced column: cursor drop function pg_catalog.cursor(varchar); 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 | + department_name | ?column? +-----------------+------------------ + sale | (1 row) -- view contain cursor expr create view v1 as SELECT department_name, CURSOR(SELECT e.name FROM employees e) FROM departments d WHERE department_name='sale' ORDER BY department_name; select * from v1; - department_name | ?column? ------------------+--------------------- - sale | + department_name | ?column? +-----------------+------------------ + sale | (1 row) drop view v1; -- some spec case 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 | + department_name | ?column? +-----------------+------------------ + 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 | + department_name | ?column? +-----------------+------------------ + 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 | + department_name | ?column? +-----------------+------------------ + sale | (1 row) -- permission @@ -591,8 +591,11 @@ GRANT USAGE ON SCHEMA cursor_expression TO normalrole_user_001; GRANT SELECT ON departments TO normalrole_user_001 with grant option; SET SESSION AUTHORIZATION normalrole_user_001 PASSWORD 'Gauss@123'; SELECT department_name, CURSOR((SELECT e.name FROM employees e)) FROM departments d WHERE department_name='sale' ORDER BY department_name; -ERROR: permission denied for relation employees -DETAIL: N/A + department_name | ?column? +-----------------+------------------ + sale | +(1 row) + RESET SESSION AUTHORIZATION; drop user normalrole_user_001 cascade; -- error input @@ -625,10 +628,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 +661,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 +701,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 +725,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 +751,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 +781,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 @@ -842,66 +845,78 @@ begin end; / call pro_cursor_0011_02(); -NOTICE: department_name : 3 -NOTICE: department employees info : pro +NOTICE: department_name : 3 +NOTICE: department employees info : pro NOTICE: employees_id_var : 1 -NOTICE: department employees info : pro +NOTICE: department employees info : pro NOTICE: employees_id_var : 1 -NOTICE: department employees info : pro +NOTICE: department employees info : pro NOTICE: employees_id_var : 2 -NOTICE: department employees info : pro +NOTICE: department employees info : pro NOTICE: employees_id_var : 2 -NOTICE: department_name : 3 -NOTICE: department employees info : pro +NOTICE: department_name : 3 +NOTICE: department employees info : pro NOTICE: employees_id_var : 1 -NOTICE: department employees info : pro +NOTICE: department employees info : pro NOTICE: employees_id_var : 1 -NOTICE: department employees info : pro +NOTICE: department employees info : pro NOTICE: employees_id_var : 2 -NOTICE: department employees info : pro +NOTICE: department employees info : pro NOTICE: employees_id_var : 2 -NOTICE: department_name : 2 -NOTICE: department employees info : rd +NOTICE: department_name : 2 +NOTICE: department employees info : rd NOTICE: employees_id_var : 1 -NOTICE: department employees info : rd +NOTICE: department employees info : rd NOTICE: employees_id_var : 1 -NOTICE: department employees info : rd +NOTICE: department employees info : rd NOTICE: employees_id_var : 2 -NOTICE: department employees info : rd +NOTICE: department employees info : rd NOTICE: employees_id_var : 2 -NOTICE: department_name : 2 -NOTICE: department employees info : rd +NOTICE: department_name : 2 +NOTICE: department employees info : rd NOTICE: employees_id_var : 1 -NOTICE: department employees info : rd +NOTICE: department employees info : rd NOTICE: employees_id_var : 1 -NOTICE: department employees info : rd +NOTICE: department employees info : rd NOTICE: employees_id_var : 2 -NOTICE: department employees info : rd +NOTICE: department employees info : rd NOTICE: employees_id_var : 2 -NOTICE: department_name : 1 -NOTICE: department employees info : sale +NOTICE: department_name : 1 +NOTICE: department employees info : sale NOTICE: employees_id_var : 1 -NOTICE: department employees info : sale +NOTICE: department employees info : sale NOTICE: employees_id_var : 1 -NOTICE: department employees info : sale +NOTICE: department employees info : sale NOTICE: employees_id_var : 2 -NOTICE: department employees info : sale +NOTICE: department employees info : sale NOTICE: employees_id_var : 2 -NOTICE: department_name : 1 -NOTICE: department employees info : sale +NOTICE: department_name : 1 +NOTICE: department employees info : sale NOTICE: employees_id_var : 1 -NOTICE: department employees info : sale +NOTICE: department employees info : sale NOTICE: employees_id_var : 1 -NOTICE: department employees info : sale +NOTICE: department employees info : sale NOTICE: employees_id_var : 2 -NOTICE: department employees info : sale +NOTICE: department employees info : sale NOTICE: employees_id_var : 2 pro_cursor_0011_02 -------------------- (1 row) +-- test insert as select cursor +create table test_insert(c1 varchar, c2 varchar); +insert into test_insert SELECT department_name, CURSOR(SELECT e.name FROM employees e) FROM departments d; +select * from test_insert; + c1 | c2 +------+------------------ + sale | + rd | + pro | +(3 rows) + -- clean +drop table test_insert; drop procedure pro_cursor_0011_02; drop table t_cursor_0011_01; drop table t_cursor_0011_02; diff --git a/src/test/regress/output/cursor_expression_dump.source b/src/test/regress/output/cursor_expression_dump.source index 56dfac6d7..315791618 100644 --- a/src/test/regress/output/cursor_expression_dump.source +++ b/src/test/regress/output/cursor_expression_dump.source @@ -200,9 +200,9 @@ NOTICE: last_name_name2 : t (1 row) select * from v1; - department_name | ?column? ------------------+--------------------- - sale | + department_name | ?column? +-----------------+------------------ + sale | (1 row) drop schema cursor_expression_dump cascade; diff --git a/src/test/regress/sql/cursor_expression.sql b/src/test/regress/sql/cursor_expression.sql index 6412a9e29..80d5b6e6d 100644 --- a/src/test/regress/sql/cursor_expression.sql +++ b/src/test/regress/sql/cursor_expression.sql @@ -522,7 +522,13 @@ end; / call pro_cursor_0011_02(); +-- test insert as select cursor +create table test_insert(c1 varchar, c2 varchar); +insert into test_insert SELECT department_name, CURSOR(SELECT e.name FROM employees e) FROM departments d; +select * from test_insert; + -- clean +drop table test_insert; drop procedure pro_cursor_0011_02; drop table t_cursor_0011_01; drop table t_cursor_0011_02;