From 51c2a77edcadfdb9dad9ca30a23c70d4d9d766e0 Mon Sep 17 00:00:00 2001 From: Neil Date: Tue, 22 Jun 2021 15:45:50 +0800 Subject: [PATCH] fix-anycompatiblemultirange --- src/backend/parser/parse_coerce.c | 18 ++++++++++++++++++ src/test/regress/expected/polymorphism.out | 2 +- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/backend/parser/parse_coerce.c b/src/backend/parser/parse_coerce.c index 7e963b8895..2aa7f616f2 100644 --- a/src/backend/parser/parse_coerce.c +++ b/src/backend/parser/parse_coerce.c @@ -2053,6 +2053,7 @@ enforce_generic_type_consistency(const Oid *actual_arg_types, bool have_anycompatible_nonarray = (rettype == ANYCOMPATIBLENONARRAYOID); bool have_anycompatible_array = (rettype == ANYCOMPATIBLEARRAYOID); bool have_anycompatible_range = (rettype == ANYCOMPATIBLERANGEOID); + bool have_anycompatible_multirange = (rettype == ANYCOMPATIBLEMULTIRANGEOID); int n_poly_args = 0; /* this counts all family-1 arguments */ int n_anycompatible_args = 0; /* this counts only non-unknowns */ Oid anycompatible_actual_types[FUNC_MAX_ARGS]; @@ -2223,6 +2224,7 @@ enforce_generic_type_consistency(const Oid *actual_arg_types, else if (decl_type == ANYCOMPATIBLEMULTIRANGEOID) { have_poly_anycompatible = true; + have_anycompatible_multirange = true; if (actual_type == UNKNOWNOID) continue; if (allow_poly && decl_type == actual_type) @@ -2494,6 +2496,16 @@ enforce_generic_type_consistency(const Oid *actual_arg_types, format_type_be(anycompatible_typeid)))); } + if (have_anycompatible_multirange) + { + /* we can't infer a range type from the others */ + if (!OidIsValid(anycompatible_multirange_typeid)) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("could not determine polymorphic type %s because input has type %s", + "anycompatiblemultirange", "unknown"))); + } + if (have_anycompatible_nonarray) { /* @@ -2531,6 +2543,12 @@ enforce_generic_type_consistency(const Oid *actual_arg_types, (errcode(ERRCODE_DATATYPE_MISMATCH), errmsg("could not determine polymorphic type %s because input has type %s", "anycompatiblerange", "unknown"))); + + if (have_anycompatible_multirange) + ereport(ERROR, + (errcode(ERRCODE_DATATYPE_MISMATCH), + errmsg("could not determine polymorphic type %s because input has type %s", + "anycompatiblemultirange", "unknown"))); } } diff --git a/src/test/regress/expected/polymorphism.out b/src/test/regress/expected/polymorphism.out index 772345584f..9f158f7786 100644 --- a/src/test/regress/expected/polymorphism.out +++ b/src/test/regress/expected/polymorphism.out @@ -1914,7 +1914,7 @@ LINE 1: select x, pg_typeof(x) from anyctest(11.2, multirange(int4ra... ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. select x, pg_typeof(x) from anyctest(11.2, '{[4,7)}') x; -- fail -ERROR: could not identify anycompatiblemultirange type +ERROR: could not determine polymorphic type anycompatiblemultirange because input has type unknown drop function anyctest(anycompatible, anycompatiblemultirange); create function anyctest(anycompatiblemultirange, anycompatiblemultirange) returns anycompatible as $$ -- 2.30.1 (Apple Git-130)