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;