Movatterモバイル変換


[0]ホーム

URL:


Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit4df58f7

Browse files
committed
Fix handling of partition bounds for boolean partitioning columns.
Previously, you could partition by a boolean column as long as youspelled the bound values as string literals, for instance FOR VALUESIN ('t'). The trouble with this is that ruleutils.c printed that asFOR VALUES IN (TRUE), which is reasonable syntax but wasn't accepted bythe grammar. That results in dump-and-reload failures for such cases.Apply a minimal fix that just causes TRUE and FALSE to be converted tostrings 'true' and 'false'. This is pretty grotty, but it's too late fora more principled fix in v11 (to say nothing of v10). We should revisitthe whole issue of how partition bound values are parsed for v12.Amit LangoteDiscussion:https://postgr.es/m/e05c5162-1103-7e37-d1ab-6de3e0afaf70@lab.ntt.co.jp
1 parentdf04402 commit4df58f7

File tree

5 files changed

+29
-6
lines changed

5 files changed

+29
-6
lines changed

‎doc/src/sgml/ref/alter_table.sgml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -87,9 +87,9 @@ ALTER TABLE [ IF EXISTS ] <replaceable class="parameter">name</replaceable>
8787

8888
<phrase>and <replaceable class="parameter">partition_bound_spec</replaceable> is:</phrase>
8989

90-
IN ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> | NULL } [, ...] ) |
91-
FROM ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> | MINVALUE | MAXVALUE } [, ...] )
92-
TO ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> | MINVALUE | MAXVALUE } [, ...] ) |
90+
IN ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> |TRUE | FALSE |NULL } [, ...] ) |
91+
FROM ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> |TRUE | FALSE |MINVALUE | MAXVALUE } [, ...] )
92+
TO ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> |TRUE | FALSE |MINVALUE | MAXVALUE } [, ...] ) |
9393
WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REMAINDER <replaceable class="parameter">numeric_literal</replaceable> )
9494

9595
<phrase>and <replaceable class="parameter">column_constraint</replaceable> is:</phrase>

‎doc/src/sgml/ref/create_table.sgml

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -86,9 +86,9 @@ CREATE [ [ GLOBAL | LOCAL ] { TEMPORARY | TEMP } | UNLOGGED ] TABLE [ IF NOT EXI
8686

8787
<phrase>and <replaceable class="parameter">partition_bound_spec</replaceable> is:</phrase>
8888

89-
IN ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> | NULL } [, ...] ) |
90-
FROM ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> | MINVALUE | MAXVALUE } [, ...] )
91-
TO ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> | MINVALUE | MAXVALUE } [, ...] ) |
89+
IN ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> |TRUE | FALSE |NULL } [, ...] ) |
90+
FROM ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> |TRUE | FALSE |MINVALUE | MAXVALUE } [, ...] )
91+
TO ( { <replaceable class="parameter">numeric_literal</replaceable> | <replaceable class="parameter">string_literal</replaceable> |TRUE | FALSE |MINVALUE | MAXVALUE } [, ...] ) |
9292
WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REMAINDER <replaceable class="parameter">numeric_literal</replaceable> )
9393

9494
<phrase><replaceable class="parameter">index_parameters</replaceable> in <literal>UNIQUE</literal>, <literal>PRIMARY KEY</literal>, and <literal>EXCLUDE</literal> constraints are:</phrase>

‎src/backend/parser/gram.y

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2798,6 +2798,8 @@ hash_partbound:
27982798
partbound_datum:
27992799
Sconst{$$ = makeStringConst($1,@1); }
28002800
|NumericOnly{$$ = makeAConst($1,@1); }
2801+
|TRUE_P{$$ = makeStringConst(pstrdup("true"),@1); }
2802+
|FALSE_P{$$ = makeStringConst(pstrdup("false"),@1); }
28012803
|NULL_P{$$ = makeNullAConst(@1); }
28022804
;
28032805

‎src/test/regress/expected/create_table.out

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -885,3 +885,17 @@ Partition of: arrlp FOR VALUES IN ('{1}', '{2}')
885885
Partition constraint: ((a IS NOT NULL) AND (((a)::anyarray OPERATOR(pg_catalog.=) '{1}'::integer[]) OR ((a)::anyarray OPERATOR(pg_catalog.=) '{2}'::integer[])))
886886

887887
DROP TABLE arrlp;
888+
-- partition on boolean column
889+
create table boolspart (a bool) partition by list (a);
890+
create table boolspart_t partition of boolspart for values in (true);
891+
create table boolspart_f partition of boolspart for values in (false);
892+
\d+ boolspart
893+
Table "public.boolspart"
894+
Column | Type | Collation | Nullable | Default | Storage | Stats target | Description
895+
--------+---------+-----------+----------+---------+---------+--------------+-------------
896+
a | boolean | | | | plain | |
897+
Partition key: LIST (a)
898+
Partitions: boolspart_f FOR VALUES IN (false),
899+
boolspart_t FOR VALUES IN (true)
900+
901+
drop table boolspart;

‎src/test/regress/sql/create_table.sql

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -719,3 +719,10 @@ CREATE TABLE arrlp (a int[]) PARTITION BY LIST (a);
719719
CREATETABLEarrlp12 PARTITION OF arrlp FORVALUESIN ('{1}','{2}');
720720
\d+ arrlp12
721721
DROPTABLE arrlp;
722+
723+
-- partition on boolean column
724+
createtableboolspart (a bool) partition by list (a);
725+
createtableboolspart_t partition of boolspart forvaluesin (true);
726+
createtableboolspart_f partition of boolspart forvaluesin (false);
727+
\d+ boolspart
728+
droptable boolspart;

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp