From 29f20db85ed220f075fe8181bac49269611f13cb Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Mon, 28 Sep 2020 14:12:38 -0400 Subject: [PATCH] Assign collations in partition bound expressions. Failure to do this can result in errors during evaluation of the bound expression, as illustrated by the new regression test. Back-patch to v12 where the ability for partition bounds to be expressions was added. Discussion: https://postgr.es/m/CAJV4CdrZ5mKuaEsRSbLf2URQ3h6iMtKD=hik8MaF5WwdmC9uZw@mail.gmail.com --- src/backend/parser/parse_utilcmd.c | 3 +++ src/test/regress/expected/create_table.out | 7 +++++++ src/test/regress/sql/create_table.sql | 8 ++++++++ 3 files changed, 18 insertions(+) diff --git a/src/backend/parser/parse_utilcmd.c b/src/backend/parser/parse_utilcmd.c index e54d8279917..0ceea41d1b6 100644 --- a/src/backend/parser/parse_utilcmd.c +++ b/src/backend/parser/parse_utilcmd.c @@ -4197,7 +4197,10 @@ transformPartitionBoundValue(ParseState *pstate, Node *val, /* Simplify the expression, in case we had a coercion */ if (!IsA(value, Const)) + { + assign_expr_collations(pstate, value); value = (Node *) expression_planner((Expr *) value); + } /* * transformExpr() should have already rejected column references, diff --git a/src/test/regress/expected/create_table.out b/src/test/regress/expected/create_table.out index 2753778197a..96361e36611 100644 --- a/src/test/regress/expected/create_table.out +++ b/src/test/regress/expected/create_table.out @@ -937,6 +937,13 @@ DETAIL: Failing row contains (1, null). Partition of: parted_notnull_inh_test FOR VALUES IN (1) drop table parted_notnull_inh_test; +-- check that collations are assigned in partition bound expressions +create table parted_boolean_col (a bool, b text) partition by list(a); +create table parted_boolean_less partition of parted_boolean_col + for values in ('foo' < 'bar'); +create table parted_boolean_greater partition of parted_boolean_col + for values in ('foo' > 'bar'); +drop table parted_boolean_col; -- check for a conflicting COLLATE clause create table parted_collate_must_match (a text collate "C", b text collate "C") partition by range (a); diff --git a/src/test/regress/sql/create_table.sql b/src/test/regress/sql/create_table.sql index 97074ff1c11..c8f40b94c24 100644 --- a/src/test/regress/sql/create_table.sql +++ b/src/test/regress/sql/create_table.sql @@ -769,6 +769,14 @@ insert into parted_notnull_inh_test (b) values (null); \d parted_notnull_inh_test1 drop table parted_notnull_inh_test; +-- check that collations are assigned in partition bound expressions +create table parted_boolean_col (a bool, b text) partition by list(a); +create table parted_boolean_less partition of parted_boolean_col + for values in ('foo' < 'bar'); +create table parted_boolean_greater partition of parted_boolean_col + for values in ('foo' > 'bar'); +drop table parted_boolean_col; + -- check for a conflicting COLLATE clause create table parted_collate_must_match (a text collate "C", b text collate "C") partition by range (a);