From 5fd2674dcfade63cbf07613d95ccda9e91756105 Mon Sep 17 00:00:00 2001 From: wangfeihuo Date: Mon, 25 Nov 2024 10:27:24 +0800 Subject: [PATCH] =?UTF-8?q?=E3=80=90=E6=A0=87=E9=A2=98=E3=80=91=EF=BC=9A?= =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E5=88=9B=E5=BB=BApackage=E5=90=8C=E6=97=B6?= =?UTF-8?q?=E5=AD=98=E5=9C=A8=E4=B8=8D=E5=90=8C=E5=8F=82=E6=95=B0mode?= =?UTF-8?q?=E7=9A=84=E5=90=8C=E5=90=8D=E9=87=8D=E8=BD=BDproc=E5=92=8Cfunc?= =?UTF-8?q?=EF=BC=8C=E5=88=9B=E5=BB=BA=E6=88=90=E5=8A=9F=EF=BC=8C=E4=BD=86?= =?UTF-8?q?pg=5Fproc=E4=B8=AD=E4=BB=85=E4=B8=80=E6=9D=A1=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E7=9A=84=E9=97=AE=E9=A2=98=20=E3=80=90=E5=AE=9E=E7=8E=B0?= =?UTF-8?q?=E5=86=85=E5=AE=B9=E3=80=91:=20=E4=BF=AE=E5=A4=8D=E5=88=9B?= =?UTF-8?q?=E5=BB=BApackage=E5=90=8C=E6=97=B6=E5=AD=98=E5=9C=A8=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E5=8F=82=E6=95=B0mode=E7=9A=84=E5=90=8C=E5=90=8D?= =?UTF-8?q?=E9=87=8D=E8=BD=BDproc=E5=92=8Cfunc=EF=BC=8C=E5=88=9B=E5=BB=BA?= =?UTF-8?q?=E6=88=90=E5=8A=9F=EF=BC=8C=E4=BD=86pg=5Fproc=E4=B8=AD=E4=BB=85?= =?UTF-8?q?=E4=B8=80=E6=9D=A1=E8=AE=B0=E5=BD=95=E7=9A=84=E9=97=AE=E9=A2=98?= =?UTF-8?q?.=20=E3=80=90=E6=A0=B9=E5=9B=A0=E5=88=86=E6=9E=90=E3=80=91:=20?= =?UTF-8?q?=E6=AD=A4=E5=9C=BA=E6=99=AF=E4=B8=8B=E4=B9=8B=E5=89=8D=E6=B2=A1?= =?UTF-8?q?=E6=8A=A5=E9=94=99=EF=BC=8C=E5=BD=93=E5=89=8D=E7=9B=B4=E6=8E=A5?= =?UTF-8?q?=E6=8A=A5=E9=94=99=E5=A4=84=E7=90=86.=20=E3=80=90=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E6=96=B9=E6=A1=88=E3=80=91:=20=E6=AD=A4=E5=9C=BA?= =?UTF-8?q?=E6=99=AF=E4=B8=8B=E7=9B=B4=E6=8E=A5=E6=8A=A5=E9=94=99=E5=A4=84?= =?UTF-8?q?=E7=90=86=20=E3=80=90=E5=85=B3=E8=81=94=E9=9C=80=E6=B1=82?= =?UTF-8?q?=E6=88=96issue=E3=80=91:=20https://e.gitee.com/opengaussorg/das?= =?UTF-8?q?hboard=3Fissue=3DIAROUT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/common/backend/catalog/gs_package.cpp | 27 ++++++++++++++++++- .../regress/expected/plpgsql_override_out.out | 23 +++++++++++++++- src/test/regress/sql/plpgsql_override_out.sql | 16 +++++++++++ 3 files changed, 64 insertions(+), 2 deletions(-) diff --git a/src/common/backend/catalog/gs_package.cpp b/src/common/backend/catalog/gs_package.cpp index 8c95721d2..0b52d8352 100755 --- a/src/common/backend/catalog/gs_package.cpp +++ b/src/common/backend/catalog/gs_package.cpp @@ -1831,6 +1831,7 @@ bool isSameArgList(CreateFunctionStmt* stmt1, CreateFunctionStmt* stmt2) int inLoc1 = 0; int inLoc2 = 0; int length = 0; + int sameParamtypNum = 0; foreach(cell, argList1) { arr1[length] = (FunctionParameter*)lfirst(cell); if (arr1[length]->mode != FUNC_PARAM_OUT) { @@ -1956,7 +1957,21 @@ bool isSameArgList(CreateFunctionStmt* stmt1, CreateFunctionStmt* stmt2) pfree(arr2); return false; } - } else if (toid1 != toid2 || fp1->mode != fp2->mode) { + } + if (toid1 != toid2) { + pfree(arr1); + pfree(arr2); + return false; + } + if ((stmt1->isProcedure || stmt2->isProcedure) && (fp1->mode != fp2->mode)) { + if (enable_outparam_override && length1 == length2) { + sameParamtypNum += 1; + } else { + pfree(arr1); + pfree(arr2); + return false; + } + } else if (stmt1->isFunctionDeclare != stmt2->isFunctionDeclare && fp1->mode != fp2->mode) { pfree(arr1); pfree(arr2); return false; @@ -1978,6 +1993,16 @@ bool isSameArgList(CreateFunctionStmt* stmt1, CreateFunctionStmt* stmt2) } pfree(arr1); pfree(arr2); + + if (enable_outparam_override && length1 == length2 && sameParamtypNum == length1 && sameParamtypNum != 0) { + ereport(ERROR, + (errcode(ERRCODE_UNDEFINED_FUNCTION), + errmodule(MOD_PLSQL), + errmsg("can not override param:%s", NameListToString(stmt1->funcname)), + errcause("param's length is unequal."), + erraction("please check the param's length."))); + } + /* function delcare in package specification and define in package body must be same */ if (!isSameName && (stmt1->isFunctionDeclare^stmt2->isFunctionDeclare)) { ereport(ERROR, diff --git a/src/test/regress/expected/plpgsql_override_out.out b/src/test/regress/expected/plpgsql_override_out.out index 754b0c0a4..75fed7551 100644 --- a/src/test/regress/expected/plpgsql_override_out.out +++ b/src/test/regress/expected/plpgsql_override_out.out @@ -953,6 +953,27 @@ call test_function2('',''); | | (1 row) +set behavior_compat_options = 'proc_outparam_override'; +create or replace package pck2 is + FUNCTION pkg_mem_case(a int,self1 int) RETURN VARCHAR2; + procedure pkg_mem_case(a int,self1 inout int); +end pck2; +/ +ERROR: function declared in package specification and package body must be the same, function: pkg_mem_case +set behavior_compat_options = ''; +create or replace package pck2 is + FUNCTION pkg_mem_case(a int,self1 int) RETURN VARCHAR2; + procedure pkg_mem_case(a int,self1 inout int); +end pck2; +/ +select count(*) from pg_proc where proname = 'pkg_mem_case'; + count +------- + 1 +(1 row) + +drop package pck2; +NOTICE: drop cascades to function plpgsql_override_out.pkg_mem_case(integer,integer) set plsql_compile_check_options=''; drop package body if exists pck1; drop package body pck1; @@ -979,7 +1000,7 @@ drop cascades to function f1(integer) drop cascades to function f3() drop cascades to function pro2() drop cascades to function plpgsql_override_out.p11() -drop cascades to function p11() +--?.* drop cascades to function plpgsql_override_out.p11() drop cascades to function p11(integer) drop cascades to table test_table2 diff --git a/src/test/regress/sql/plpgsql_override_out.sql b/src/test/regress/sql/plpgsql_override_out.sql index 04d87cbc9..73460b513 100644 --- a/src/test/regress/sql/plpgsql_override_out.sql +++ b/src/test/regress/sql/plpgsql_override_out.sql @@ -710,6 +710,22 @@ $$ LANGUAGE 'plpgsql'; call test_function2('',''); +set behavior_compat_options = 'proc_outparam_override'; +create or replace package pck2 is + FUNCTION pkg_mem_case(a int,self1 int) RETURN VARCHAR2; + procedure pkg_mem_case(a int,self1 inout int); +end pck2; +/ + +set behavior_compat_options = ''; +create or replace package pck2 is + FUNCTION pkg_mem_case(a int,self1 int) RETURN VARCHAR2; + procedure pkg_mem_case(a int,self1 inout int); +end pck2; +/ +select count(*) from pg_proc where proname = 'pkg_mem_case'; +drop package pck2; + set plsql_compile_check_options=''; drop package body if exists pck1; drop package body pck1;