summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTom Lane <tgl@sss.pgh.pa.us>2020-09-28 14:12:38 -0400
committerTom Lane <tgl@sss.pgh.pa.us>2020-09-28 14:12:38 -0400
commit29f20db85ed220f075fe8181bac49269611f13cb (patch)
treeeb61762e6a4fed31bc855d2ab4c30d812d433fe1
parentbda32733ceeb0687ee5a1e734005270b1dee66a7 (diff)
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
-rw-r--r--src/backend/parser/parse_utilcmd.c3
-rw-r--r--src/test/regress/expected/create_table.out7
-rw-r--r--src/test/regress/sql/create_table.sql8
3 files changed, 18 insertions, 0 deletions
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);