Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Assign collations in partition bound expressions.
authorTom Lane <tgl@sss.pgh.pa.us>
Mon, 28 Sep 2020 18:12:38 +0000 (14:12 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Mon, 28 Sep 2020 18:12:38 +0000 (14:12 -0400)
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
src/test/regress/expected/create_table.out
src/test/regress/sql/create_table.sql

index 7b5502a06df1ac1b84794104957baff01021aff4..6b59538b1382171aa06e5f9b941882a4e1086216 100644 (file)
@@ -4239,7 +4239,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,
index 1c72f23bc93b82a4a8cb501581d2e272a58269b1..9089b013b7f756e3ce9ebe22f9b018109cf894c9 100644 (file)
@@ -986,6 +986,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);
index 9b1adcb8adda942c8903ab06919d3be36a86d71d..ad55a24a7bfb38a3a001bdabe60b6aaedcd6dfa2 100644 (file)
@@ -802,6 +802,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);