Skip to content

Commit d66cf61

Browse files
authored
Merge cea2cdc into blathers/backport-release-25.3-155867
2 parents e7b421d + cea2cdc commit d66cf61

File tree

5 files changed

+78
-4
lines changed

5 files changed

+78
-4
lines changed

pkg/ccl/logictestccl/testdata/logic_test/procedure_params

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -880,4 +880,23 @@ $$ LANGUAGE PLpgSQL;
880880
statement ok
881881
DROP PROCEDURE p;
882882

883+
# Regression test for not type-checking all default expressions when replacing
884+
# the procedure (#155859).
885+
statement ok
886+
CREATE PROCEDURE p (s STRING(1) DEFAULT NULL, d DECIMAL(1, 1) DEFAULT NULL) AS $$
887+
BEGIN
888+
NULL;
889+
END;
890+
$$ LANGUAGE PLpgSQL;
891+
892+
statement ok
893+
CREATE OR REPLACE PROCEDURE p (s STRING(2) DEFAULT NULL, d DECIMAL(2, 2) DEFAULT NULL) AS $$
894+
BEGIN
895+
NULL;
896+
END;
897+
$$ LANGUAGE PLpgSQL;
898+
899+
statement ok
900+
DROP PROCEDURE p;
901+
883902
subtest end

pkg/ccl/logictestccl/testdata/logic_test/udf_params

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1046,4 +1046,23 @@ $$ LANGUAGE PLpgSQL;
10461046
statement ok
10471047
DROP PROCEDURE p;
10481048

1049+
# Regression test for not type-checking all default expressions when replacing
1050+
# the UDF (#155859).
1051+
statement ok
1052+
CREATE FUNCTION f (s STRING(1) DEFAULT NULL, d DECIMAL(1, 1) DEFAULT NULL) RETURNS VOID AS $$
1053+
BEGIN
1054+
NULL;
1055+
END;
1056+
$$ LANGUAGE PLpgSQL;
1057+
1058+
statement ok
1059+
CREATE OR REPLACE FUNCTION f (s STRING(2) DEFAULT NULL, d DECIMAL(2, 2) DEFAULT NULL) RETURNS VOID AS $$
1060+
BEGIN
1061+
NULL;
1062+
END;
1063+
$$ LANGUAGE PLpgSQL;
1064+
1065+
statement ok
1066+
DROP FUNCTION f;
1067+
10491068
subtest end

pkg/sql/create_function.go

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -309,20 +309,26 @@ func (n *createFunctionNode) replaceFunction(
309309
return err
310310
}
311311

312+
// We allow two types of "signature changes":
313+
// - reordering OUT parameters in respect to input ones, and
314+
// - changing the DEFAULT expression.
312315
signatureChanged := len(existing.OutParamOrdinals) != len(outParamOrdinals) ||
313316
len(existing.DefaultExprs) != len(defaultExprs)
314317
for i := 0; !signatureChanged && i < len(outParamOrdinals); i++ {
315318
signatureChanged = existing.OutParamOrdinals[i] != outParamOrdinals[i] ||
316319
!existing.OutParamTypes.GetAt(i).Equivalent(outParamTypes[i])
317320
}
318-
for i := 0; !signatureChanged && i < len(defaultExprs); i++ {
319-
typ := existing.Types.GetAt(i + existing.Types.Length() - len(defaultExprs))
320-
// Update the overload to store the type-checked expression since this
321-
// is what is stored in the FunctionSignature proto.
321+
// Additionally, we must type-check all DEFAULT expressions since we need to
322+
// store the type-checked serialized form in the FunctionSignature proto.
323+
// (This is also assumed in ReplaceOverload.)
324+
for i := 0; i < len(existing.DefaultExprs); i++ {
325+
typ := existing.Types.GetAt(i + existing.Types.Length() - len(existing.DefaultExprs))
322326
existing.DefaultExprs[i], err = tree.TypeCheck(params.ctx, existing.DefaultExprs[i], params.p.SemaCtx(), typ)
323327
if err != nil {
324328
return err
325329
}
330+
}
331+
for i := 0; !signatureChanged && i < len(defaultExprs); i++ {
326332
signatureChanged = tree.Serialize(existing.DefaultExprs[i]) != defaultExprs[i]
327333
}
328334
if signatureChanged {

pkg/sql/logictest/testdata/logic_test/procedure_params

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -766,4 +766,19 @@ DROP PROCEDURE p;
766766
statement ok
767767
DROP SEQUENCE seq;
768768

769+
# Regression test for not type-checking all default expressions when replacing
770+
# the procedure (#155859).
771+
statement ok
772+
CREATE PROCEDURE p (s STRING(1) DEFAULT NULL, d DECIMAL(1, 1) DEFAULT NULL) AS $$
773+
SELECT 1;
774+
$$ LANGUAGE SQL;
775+
776+
statement ok
777+
CREATE OR REPLACE PROCEDURE p (s STRING(2) DEFAULT NULL, d DECIMAL(2, 2) DEFAULT NULL) AS $$
778+
SELECT 1;
779+
$$ LANGUAGE SQL;
780+
781+
statement ok
782+
DROP PROCEDURE p;
783+
769784
subtest end

pkg/sql/logictest/testdata/logic_test/udf_params

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -912,4 +912,19 @@ DROP FUNCTION f;
912912
statement ok
913913
DROP SEQUENCE seq;
914914

915+
# Regression test for not type-checking all default expressions when replacing
916+
# the UDF (#155859).
917+
statement ok
918+
CREATE FUNCTION f (s STRING(1) DEFAULT NULL, d DECIMAL(1, 1) DEFAULT NULL) RETURNS INT AS $$
919+
SELECT 1;
920+
$$ LANGUAGE SQL;
921+
922+
statement ok
923+
CREATE OR REPLACE FUNCTION f (s STRING(2) DEFAULT NULL, d DECIMAL(2, 2) DEFAULT NULL) RETURNS INT AS $$
924+
SELECT 1;
925+
$$ LANGUAGE SQL;
926+
927+
statement ok
928+
DROP FUNCTION f;
929+
915930
subtest end

0 commit comments

Comments
 (0)