From 7a6020226a10caa7df2a3d1f55b1f89fbac348b6 Mon Sep 17 00:00:00 2001 From: leiziwei Date: Fri, 26 Jul 2024 18:38:00 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E6=AE=B5=E9=94=99=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/pl/plpgsql/src/pl_comp.cpp | 18 ++++++++-------- src/common/pl/plpgsql/src/pl_exec.cpp | 5 +++++ .../expected/plpgsql_cursor_rowtype.out | 18 ++++++++++++++++ .../regress/sql/plpgsql_cursor_rowtype.sql | 21 +++++++++++++++++++ 4 files changed, 53 insertions(+), 9 deletions(-) diff --git a/src/common/pl/plpgsql/src/pl_comp.cpp b/src/common/pl/plpgsql/src/pl_comp.cpp index b6f2f8499..0fd4b1301 100644 --- a/src/common/pl/plpgsql/src/pl_comp.cpp +++ b/src/common/pl/plpgsql/src/pl_comp.cpp @@ -3892,15 +3892,15 @@ PLpgSQL_variable* plpgsql_build_variable(const char* refname, int lineno, PLpgSQ } rec->tupdesc = getCursorTupleDesc(rec->expr, false, false); - - nulls = (bool *)palloc(rec->tupdesc->natts * sizeof(bool)); - rc = memset_s(nulls, rec->tupdesc->natts * sizeof(bool), true, rec->tupdesc->natts * sizeof(bool)); - securec_check(rc, "\0", "\0"); - - rec->tup = (HeapTuple)tableam_tops_form_tuple(rec->tupdesc, NULL, nulls); - rec->freetupdesc = (rec->tupdesc != NULL) ? true : false; - rec->freetup = (rec->tup != NULL) ? true : false; - pfree_ext(nulls); + if (rec->tupdesc) { + nulls = (bool*)palloc(rec->tupdesc->natts * sizeof(bool)); + rc = memset_s(nulls, rec->tupdesc->natts * sizeof(bool), true, rec->tupdesc->natts * sizeof(bool)); + securec_check(rc, "\0", "\0"); + rec->tup = (HeapTuple)tableam_tops_form_tuple(rec->tupdesc, NULL, nulls); + rec->freetupdesc = (rec->tupdesc != NULL) ? true : false; + rec->freetup = (rec->tup != NULL) ? true : false; + pfree_ext(nulls); + } if (target_cxt) { temp = MemoryContextSwitchTo(temp); diff --git a/src/common/pl/plpgsql/src/pl_exec.cpp b/src/common/pl/plpgsql/src/pl_exec.cpp index c4acf9807..041045dca 100644 --- a/src/common/pl/plpgsql/src/pl_exec.cpp +++ b/src/common/pl/plpgsql/src/pl_exec.cpp @@ -1180,6 +1180,11 @@ static void exec_cursor_rowtype_init(PLpgSQL_execstate *estate, PLpgSQL_datum *d rec->expr->func = func; new_tupdesc = get_cursor_tupledesc_exec(rec->expr, false, false); + if (new_tupdesc == NULL) { + temp = MemoryContextSwitchTo(temp); + return; + } + new_natts = new_tupdesc->natts; newnulls = (bool *)palloc(new_natts * sizeof(bool)); diff --git a/src/test/regress/expected/plpgsql_cursor_rowtype.out b/src/test/regress/expected/plpgsql_cursor_rowtype.out index 2d33e99ba..e34de1868 100644 --- a/src/test/regress/expected/plpgsql_cursor_rowtype.out +++ b/src/test/regress/expected/plpgsql_cursor_rowtype.out @@ -1136,6 +1136,24 @@ INFO: after loop: (,) drop package pck_for; NOTICE: drop cascades to function plpgsql_cursor_rowtype.p1() +create table t_Compare_Case0013(id int,first_name varchar(100), last_name varchar(100)); +create table t_CurRowtype_PLObject_Case0013(first_name varchar(100), last_name varchar(100)); +insert into t_CurRowtype_PLObject_Case0013 values('Jason','Statham'); +create or replace function f_CurRowtype_PLObject_Case0013() returns trigger as +$$ +declare + cursor cur_1 is select * from t_CurRowtype_PLObject_Case0013; + source cur_1%rowtype; +begin + source.first_name:=new.first_name; + source.last_name:=new.last_name; + insert into t_Compare_Case0013 values (source.first_name,source.last_name); + return new; +end +$$ language plpgsql; +drop function f_CurRowtype_PLObject_Case0013; +drop table t_CurRowtype_PLObject_Case0013; +drop table t_Compare_Case0013; set behavior_compat_options=''; set plsql_compile_check_options='for_loop'; -- (b) definde as scarlar diff --git a/src/test/regress/sql/plpgsql_cursor_rowtype.sql b/src/test/regress/sql/plpgsql_cursor_rowtype.sql index e6b3d0920..8ec6e29b3 100644 --- a/src/test/regress/sql/plpgsql_cursor_rowtype.sql +++ b/src/test/regress/sql/plpgsql_cursor_rowtype.sql @@ -856,6 +856,27 @@ end pck_for; call pck_for.p1(); drop package pck_for; +create table t_Compare_Case0013(id int,first_name varchar(100), last_name varchar(100)); +create table t_CurRowtype_PLObject_Case0013(first_name varchar(100), last_name varchar(100)); +insert into t_CurRowtype_PLObject_Case0013 values('Jason','Statham'); + +create or replace function f_CurRowtype_PLObject_Case0013() returns trigger as +$$ +declare + cursor cur_1 is select * from t_CurRowtype_PLObject_Case0013; + source cur_1%rowtype; +begin + source.first_name:=new.first_name; + source.last_name:=new.last_name; + insert into t_Compare_Case0013 values (source.first_name,source.last_name); + return new; +end +$$ language plpgsql; + +drop function f_CurRowtype_PLObject_Case0013; +drop table t_CurRowtype_PLObject_Case0013; +drop table t_Compare_Case0013; + set behavior_compat_options=''; set plsql_compile_check_options='for_loop';