Grammar fixes for split/merge partitions code
The fixes relate to comments, error messages, and corresponding expected output of regression tests. Discussion: https://postgr.es/m/CAMbWs49DDsknxyoycBqiE72VxzL_sYHF6zqL8dSeNehKPJhkKg%40mail.gmail.com Discussion: https://postgr.es/m/86bfd241-a58c-479a-9a72-2c67a02becf8%40postgrespro.ru Discussion: https://postgr.es/m/CAHewXNkGMPU50QG7V6Q60JGFORfo8LfYO1_GCkCa0VWbmB-fEw%40mail.gmail.com Author: Richard Guo, Dmitry Koval, Tender Wang
This commit is contained in:
parent
c3709100be
commit
9dfcac8e15
|
@ -4387,7 +4387,7 @@ ALTER INDEX measurement_city_id_logdate_key
|
|||
a single partition using the
|
||||
<link linkend="sql-altertable-merge-partitions"><command>ALTER TABLE ... MERGE PARTITIONS</command></link>.
|
||||
This feature simplifies the management of partitioned tables by allowing
|
||||
administrators to combine partitions that are no longer needed as
|
||||
users to combine partitions that are no longer needed as
|
||||
separate entities. It's important to note that this operation is not
|
||||
supported for hash-partitioned tables and acquires an
|
||||
<literal>ACCESS EXCLUSIVE</literal> lock, which could impact high-load
|
||||
|
|
|
@ -1175,7 +1175,7 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
|
|||
<itemizedlist>
|
||||
<listitem>
|
||||
<para>
|
||||
For range-partitioned tables is necessary that the ranges
|
||||
For range-partitioned tables it is necessary that the ranges
|
||||
of the partitions <replaceable class="parameter">partition_name1</replaceable>,
|
||||
<replaceable class="parameter">partition_name2</replaceable> [, ...] can
|
||||
be merged into one range without spaces and overlaps (otherwise an error
|
||||
|
@ -1185,10 +1185,10 @@ WITH ( MODULUS <replaceable class="parameter">numeric_literal</replaceable>, REM
|
|||
</listitem>
|
||||
<listitem>
|
||||
<para>
|
||||
For list-partitioned tables the values lists of all partitions
|
||||
For list-partitioned tables the value lists of all partitions
|
||||
<replaceable class="parameter">partition_name1</replaceable>,
|
||||
<replaceable class="parameter">partition_name2</replaceable> [, ...] are
|
||||
combined and form a list of values of partition
|
||||
combined and form the list of values of partition
|
||||
<replaceable class="parameter">partition_name</replaceable>.
|
||||
</para>
|
||||
</listitem>
|
||||
|
|
|
@ -20875,7 +20875,7 @@ GetAttributeStorage(Oid atttypid, const char *storagemode)
|
|||
}
|
||||
|
||||
/*
|
||||
* Struct with context of new partition for insert rows from splited partition
|
||||
* Struct with context of new partition for inserting rows from split partition
|
||||
*/
|
||||
typedef struct SplitPartitionContext
|
||||
{
|
||||
|
@ -20932,7 +20932,7 @@ deleteSplitPartitionContext(SplitPartitionContext *pc, int ti_options)
|
|||
*
|
||||
* New partitions description:
|
||||
* partlist: list of pointers to SinglePartitionSpec structures.
|
||||
* newPartRels: list of Relation's.
|
||||
* newPartRels: list of Relations.
|
||||
* defaultPartOid: oid of DEFAULT partition, for table rel.
|
||||
*/
|
||||
static void
|
||||
|
@ -21017,7 +21017,7 @@ moveSplitTableRows(Relation rel, Relation splitRel, List *partlist, List *newPar
|
|||
|
||||
/*
|
||||
* Map computing for moving attributes of split partition to new partition
|
||||
* (for first new partition but other new partitions can use the same
|
||||
* (for first new partition, but other new partitions can use the same
|
||||
* map).
|
||||
*/
|
||||
pc = (SplitPartitionContext *) lfirst(list_head(partContexts));
|
||||
|
@ -21071,7 +21071,7 @@ moveSplitTableRows(Relation rel, Relation splitRel, List *partlist, List *newPar
|
|||
|
||||
if (tuple_map)
|
||||
{
|
||||
/* Need to use map for copy attributes. */
|
||||
/* Need to use map to copy attributes. */
|
||||
insertslot = execute_attr_map_slot(tuple_map->attrMap, srcslot, pc->dstslot);
|
||||
}
|
||||
else
|
||||
|
@ -21226,8 +21226,8 @@ ATExecSplitPartition(List **wqueue, AlteredTableInfo *tab, Relation rel,
|
|||
RangeVarGetAndCheckCreationNamespace(sps->name, NoLock, NULL);
|
||||
|
||||
/*
|
||||
* This would fail later on anyway, if the relation already exists.
|
||||
* But by catching it here we can emit a nicer error message.
|
||||
* This would fail later on anyway if the relation already exists. But
|
||||
* by catching it here we can emit a nicer error message.
|
||||
*/
|
||||
existing_relid = get_relname_relid(relname, namespaceId);
|
||||
if (existing_relid == splitRelOid && !isSameName)
|
||||
|
@ -21293,7 +21293,10 @@ ATExecSplitPartition(List **wqueue, AlteredTableInfo *tab, Relation rel,
|
|||
SinglePartitionSpec *sps = (SinglePartitionSpec *) lfirst(listptr);
|
||||
Relation newPartRel = (Relation) lfirst(listptr2);
|
||||
|
||||
/* wqueue = NULL: verification for each cloned constraint is not need. */
|
||||
/*
|
||||
* wqueue = NULL: verification for each cloned constraint is not
|
||||
* needed.
|
||||
*/
|
||||
attachPartitionTable(NULL, rel, newPartRel, sps->bound);
|
||||
/* Keep the lock until commit. */
|
||||
table_close(newPartRel, NoLock);
|
||||
|
@ -21366,7 +21369,7 @@ moveMergedTablesRows(Relation rel, List *mergingPartitionsList,
|
|||
|
||||
if (tuple_map)
|
||||
{
|
||||
/* Need to use map for copy attributes. */
|
||||
/* Need to use map to copy attributes. */
|
||||
insertslot = execute_attr_map_slot(tuple_map->attrMap, srcslot, dstslot);
|
||||
}
|
||||
else
|
||||
|
@ -21465,7 +21468,7 @@ ATExecMergePartitions(List **wqueue, AlteredTableInfo *tab, Relation rel,
|
|||
/* Create table for new partition, use partitioned table as model. */
|
||||
if (isSameName)
|
||||
{
|
||||
/* Create partition table with generated temparary name. */
|
||||
/* Create partition table with generated temporary name. */
|
||||
sprintf(tmpRelName, "merge-%u-%X-tmp", RelationGetRelid(rel), MyProcPid);
|
||||
mergePartName = makeRangeVar(get_namespace_name(RelationGetNamespace(rel)),
|
||||
tmpRelName, -1);
|
||||
|
|
|
@ -3492,7 +3492,7 @@ transformPartitionCmdForSplit(CreateStmtContext *cxt, PartitionCmd *partcmd)
|
|||
* transformPartitionCmdForMerge
|
||||
* Analyze the ALTER TABLLE ... MERGE PARTITIONS command
|
||||
*
|
||||
* Does simple checks for merged partitions. Calculates bound of result
|
||||
* Does simple checks for merged partitions. Calculates bound of resulting
|
||||
* partition.
|
||||
*/
|
||||
static void
|
||||
|
@ -3537,7 +3537,7 @@ transformPartitionCmdForMerge(CreateStmtContext *cxt, PartitionCmd *partcmd)
|
|||
if (equal(name, name2))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DUPLICATE_TABLE),
|
||||
errmsg("partition with name \"%s\" already used", name->relname)),
|
||||
errmsg("partition with name \"%s\" is already used", name->relname)),
|
||||
parser_errposition(cxt->pstate, name2->location));
|
||||
}
|
||||
|
||||
|
@ -3551,7 +3551,7 @@ transformPartitionCmdForMerge(CreateStmtContext *cxt, PartitionCmd *partcmd)
|
|||
partOids = lappend_oid(partOids, partOid);
|
||||
}
|
||||
|
||||
/* Allocate bound of result partition. */
|
||||
/* Allocate bound of resulting partition. */
|
||||
Assert(partcmd->bound == NULL);
|
||||
partcmd->bound = makeNode(PartitionBoundSpec);
|
||||
|
||||
|
|
|
@ -3214,8 +3214,9 @@ check_new_partition_bound(char *relname, Relation parent,
|
|||
PartitionRangeDatum *datum;
|
||||
|
||||
/*
|
||||
* Point to problematic key in the lower datums list;
|
||||
* if we have equality, point to the first one.
|
||||
* Point to problematic key in the list of lower
|
||||
* datums; if we have equality, point to the first
|
||||
* one.
|
||||
*/
|
||||
datum = cmpval == 0 ? linitial(spec->lowerdatums) :
|
||||
list_nth(spec->lowerdatums, abs(cmpval) - 1);
|
||||
|
@ -4986,10 +4987,10 @@ satisfies_hash_partition(PG_FUNCTION_ARGS)
|
|||
* This is a helper function for check_partitions_for_split() and
|
||||
* calculate_partition_bound_for_merge().
|
||||
* This function compares upper bound of first_bound and lower bound of
|
||||
* second_bound. These bounds should be equal except case
|
||||
* second_bound. These bounds should be equal except when
|
||||
* "defaultPart == true" (this means that one of split partitions is DEFAULT).
|
||||
* In this case upper bound of first_bound can be less than lower bound of
|
||||
* second_bound because space between of these bounds will be included in
|
||||
* second_bound because space between these bounds will be included in
|
||||
* DEFAULT partition.
|
||||
*
|
||||
* parent: partitioned table
|
||||
|
@ -4998,7 +4999,7 @@ satisfies_hash_partition(PG_FUNCTION_ARGS)
|
|||
* second_name: name of second partition
|
||||
* second_bound: bound of second partition
|
||||
* defaultPart: true if one of split partitions is DEFAULT
|
||||
* pstate: pointer to ParseState struct for determine error position
|
||||
* pstate: pointer to ParseState struct for determining error position
|
||||
*/
|
||||
static void
|
||||
check_two_partitions_bounds_range(Relation parent,
|
||||
|
@ -5020,8 +5021,8 @@ check_two_partitions_bounds_range(Relation parent,
|
|||
second_lower = make_one_partition_rbound(key, -1, second_bound->lowerdatums, true);
|
||||
|
||||
/*
|
||||
* lower1=false (the second to last argument) for correct comparison lower
|
||||
* and upper bounds.
|
||||
* lower1=false (the second to last argument) for correct comparison of
|
||||
* lower and upper bounds.
|
||||
*/
|
||||
cmpval = partition_rbound_cmp(key->partnatts,
|
||||
key->partsupfunc,
|
||||
|
@ -5140,7 +5141,7 @@ get_partition_bound_spec(Oid partOid, RangeVar *name)
|
|||
*
|
||||
* (function for BY RANGE partitioning)
|
||||
*
|
||||
* Checks that bounds of new partition "spec" is inside bounds of split
|
||||
* Checks that bounds of new partition "spec" are inside bounds of split
|
||||
* partition (with Oid splitPartOid). If first=true (this means that "spec" is
|
||||
* the first of new partitions) then lower bound of "spec" should be equal (or
|
||||
* greater than or equal in case defaultPart=true) to lower bound of split
|
||||
|
@ -5274,7 +5275,7 @@ check_partition_bounds_for_split_range(Relation parent,
|
|||
*
|
||||
* (function for BY LIST partitioning)
|
||||
*
|
||||
* Checks that bounds of new partition is inside bounds of split partition
|
||||
* Checks that bounds of new partition are inside bounds of split partition
|
||||
* (with Oid splitPartOid).
|
||||
*
|
||||
* parent: partitioned table
|
||||
|
@ -5445,8 +5446,8 @@ check_parent_values_in_new_partitions(Relation parent,
|
|||
Assert(key->strategy == PARTITION_STRATEGY_LIST);
|
||||
|
||||
/*
|
||||
* Special processing for NULL value. Search NULL-value if it contains
|
||||
* split partition (partOid).
|
||||
* Special processing for NULL value. Search NULL value if the split
|
||||
* partition (partOid) contains it.
|
||||
*/
|
||||
if (partition_bound_accepts_nulls(boundinfo) &&
|
||||
partdesc->oids[boundinfo->null_index] == partOid)
|
||||
|
@ -5461,7 +5462,7 @@ check_parent_values_in_new_partitions(Relation parent,
|
|||
|
||||
/*
|
||||
* Search all values of split partition with partOid in PartitionDesc of
|
||||
* partitionde table.
|
||||
* partitioned table.
|
||||
*/
|
||||
for (i = 0; i < boundinfo->ndatums; i++)
|
||||
{
|
||||
|
@ -5498,7 +5499,7 @@ check_parent_values_in_new_partitions(Relation parent,
|
|||
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
|
||||
errmsg("new partitions not have value %s but split partition has",
|
||||
errmsg("new partitions do not have value %s but split partition does",
|
||||
searchNull ? "NULL" : get_list_partvalue_string(notFoundVal))));
|
||||
}
|
||||
}
|
||||
|
@ -5645,7 +5646,7 @@ check_partitions_for_split(Relation parent,
|
|||
{
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_INVALID_OBJECT_DEFINITION),
|
||||
errmsg("any partition in the list should be DEFAULT because split partition is DEFAULT")),
|
||||
errmsg("one partition in the list should be DEFAULT because split partition is DEFAULT")),
|
||||
parser_errposition(pstate, ((SinglePartitionSpec *) linitial(partlist))->name->location));
|
||||
}
|
||||
else if (!isSplitPartDefault && (default_index >= 0) && OidIsValid(defaultPartOid))
|
||||
|
@ -5714,7 +5715,7 @@ check_partitions_for_split(Relation parent,
|
|||
if (equal(sps->name, sps2->name))
|
||||
ereport(ERROR,
|
||||
(errcode(ERRCODE_DUPLICATE_TABLE),
|
||||
errmsg("name \"%s\" already used", sps2->name->relname)),
|
||||
errmsg("name \"%s\" is already used", sps2->name->relname)),
|
||||
parser_errposition(pstate, sps2->name->location));
|
||||
}
|
||||
}
|
||||
|
@ -5805,14 +5806,14 @@ calculate_partition_bound_for_merge(Relation parent,
|
|||
}
|
||||
|
||||
/*
|
||||
* Lower bound of first partition is a lower bound of merged
|
||||
* Lower bound of first partition is the lower bound of merged
|
||||
* partition.
|
||||
*/
|
||||
spec->lowerdatums =
|
||||
((PartitionBoundSpec *) list_nth(bounds, lower_bounds[0]->index))->lowerdatums;
|
||||
|
||||
/*
|
||||
* Upper bound of last partition is a upper bound of merged
|
||||
* Upper bound of last partition is the upper bound of merged
|
||||
* partition.
|
||||
*/
|
||||
spec->upperdatums =
|
||||
|
|
|
@ -38,7 +38,7 @@ step s2s { SELECT * FROM tpart; }
|
|||
|
||||
|
||||
# s2 inserts row into table. s1 starts MERGE PARTITIONS then
|
||||
# s2 trying to update inserted row and waits until s1 finished
|
||||
# s2 is trying to update inserted row and waits until s1 finishes
|
||||
# MERGE operation.
|
||||
|
||||
permutation s2b s2i s2c s1b s1merg s2b s2u s1c s2c s2s
|
||||
|
|
|
@ -20,19 +20,19 @@ CREATE TABLE sales_apr_1 PARTITION OF sales_apr2022 FOR VALUES FROM ('2022-04-01
|
|||
CREATE TABLE sales_apr_2 PARTITION OF sales_apr2022 FOR VALUES FROM ('2022-04-15') TO ('2022-05-01');
|
||||
ALTER TABLE sales_range ATTACH PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01');
|
||||
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
||||
-- ERROR: partition with name "sales_feb2022" already used
|
||||
-- ERROR: partition with name "sales_feb2022" is already used
|
||||
ALTER TABLE sales_range MERGE PARTITIONS (sales_feb2022, sales_mar2022, sales_feb2022) INTO sales_feb_mar_apr2022;
|
||||
ERROR: partition with name "sales_feb2022" already used
|
||||
ERROR: partition with name "sales_feb2022" is already used
|
||||
LINE 1: ...e MERGE PARTITIONS (sales_feb2022, sales_mar2022, sales_feb2...
|
||||
^
|
||||
-- ERROR: "sales_apr2022" is not a table
|
||||
ALTER TABLE sales_range MERGE PARTITIONS (sales_feb2022, sales_mar2022, sales_apr2022) INTO sales_feb_mar_apr2022;
|
||||
ERROR: "sales_apr2022" is not a table
|
||||
-- ERROR: invalid partitions order, partition "sales_mar2022" can not be merged
|
||||
-- ERROR: lower bound of partition "sales_mar2022" conflicts with upper bound of previous partition "sales_jan2022"
|
||||
-- (space between sections sales_jan2022 and sales_mar2022)
|
||||
ALTER TABLE sales_range MERGE PARTITIONS (sales_jan2022, sales_mar2022) INTO sales_jan_mar2022;
|
||||
ERROR: lower bound of partition "sales_mar2022" conflicts with upper bound of previous partition "sales_jan2022"
|
||||
-- ERROR: invalid partitions order, partition "sales_jan2022" can not be merged
|
||||
-- ERROR: lower bound of partition "sales_jan2022" conflicts with upper bound of previous partition "sales_dec2021"
|
||||
-- (space between sections sales_dec2021 and sales_jan2022)
|
||||
ALTER TABLE sales_range MERGE PARTITIONS (sales_dec2021, sales_jan2022, sales_feb2022) INTO sales_dec_jan_feb2022;
|
||||
ERROR: lower bound of partition "sales_jan2022" conflicts with upper bound of previous partition "sales_dec2021"
|
||||
|
@ -52,7 +52,7 @@ SELECT c.oid::pg_catalog.regclass, c.relkind, inhdetachpending, pg_catalog.pg_ge
|
|||
|
||||
DROP TABLE sales_range;
|
||||
--
|
||||
-- Add rows into partitioned table then merge partitions
|
||||
-- Add rows into partitioned table, then merge partitions
|
||||
--
|
||||
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
||||
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
||||
|
@ -162,7 +162,7 @@ SELECT * FROM sales_others;
|
|||
14 | Smith | 510 | 05-04-2022
|
||||
(1 row)
|
||||
|
||||
-- Use indexscan for test indexes
|
||||
-- Use indexscan for testing indexes
|
||||
SET enable_seqscan = OFF;
|
||||
SELECT * FROM sales_feb_mar_apr2022 where sales_date > '2022-01-01';
|
||||
salesman_id | salesman_name | sales_amount | sales_date
|
||||
|
@ -704,7 +704,7 @@ SELECT * FROM sales_all;
|
|||
13 | Gandi | Warsaw | 150 | 03-08-2022
|
||||
(10 rows)
|
||||
|
||||
-- Use indexscan for test indexes after merge partitions
|
||||
-- Use indexscan for testing indexes after merging partitions
|
||||
SET enable_seqscan = OFF;
|
||||
SELECT * FROM sales_all WHERE sales_state = 'Warsaw';
|
||||
salesman_id | salesman_name | sales_state | sales_amount | sales_date
|
||||
|
|
|
@ -43,7 +43,7 @@ ERROR: empty range bound specified for partition "sales_mar2022"
|
|||
LINE 3: PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO...
|
||||
^
|
||||
DETAIL: Specified lower bound ('03-01-2022') is greater than or equal to upper bound ('02-01-2022').
|
||||
--ERROR: list of split partitions should contains at least two items
|
||||
--ERROR: list of split partitions should contain at least two items
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
||||
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-10-01'));
|
||||
ERROR: list of new partitions should contain at least two items
|
||||
|
@ -55,21 +55,21 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|||
ERROR: lower bound of partition "sales_feb2022" is less than lower bound of split partition
|
||||
LINE 2: (PARTITION sales_feb2022 FOR VALUES FROM ('2022-01-01') TO...
|
||||
^
|
||||
-- ERROR: name "sales_feb_mar_apr2022" already used
|
||||
-- ERROR: name "sales_feb_mar_apr2022" is already used
|
||||
-- (We can create partition with the same name as split partition, but can't create two partitions with the same name)
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
||||
(PARTITION sales_feb_mar_apr2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
||||
PARTITION sales_feb_mar_apr2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
||||
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
||||
ERROR: name "sales_feb_mar_apr2022" already used
|
||||
ERROR: name "sales_feb_mar_apr2022" is already used
|
||||
LINE 3: PARTITION sales_feb_mar_apr2022 FOR VALUES FROM ('2022-03...
|
||||
^
|
||||
-- ERROR: name "sales_feb2022" already used
|
||||
-- ERROR: name "sales_feb2022" is already used
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
||||
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
||||
PARTITION sales_feb2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
||||
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
||||
ERROR: name "sales_feb2022" already used
|
||||
ERROR: name "sales_feb2022" is already used
|
||||
LINE 3: PARTITION sales_feb2022 FOR VALUES FROM ('2022-03-01') TO...
|
||||
^
|
||||
-- ERROR: "sales_feb_mar_apr2022" is not a partitioned table
|
||||
|
@ -86,7 +86,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|||
ERROR: upper bound of partition "sales_apr2022" is greater than upper bound of split partition
|
||||
LINE 4: ... sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-06-0...
|
||||
^
|
||||
-- ERROR: lower bound of partition "sales_mar2022" is not equals to upper bound of previous partition
|
||||
-- ERROR: lower bound of partition "sales_mar2022" conflicts with upper bound of previous partition "sales_feb2022"
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
||||
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
||||
PARTITION sales_mar2022 FOR VALUES FROM ('2022-02-01') TO ('2022-04-01'),
|
||||
|
@ -96,7 +96,7 @@ LINE 3: PARTITION sales_mar2022 FOR VALUES FROM ('2022-02-01') TO...
|
|||
^
|
||||
-- Tests for spaces between partitions, them should be executed without DEFAULT partition
|
||||
ALTER TABLE sales_range DETACH PARTITION sales_others;
|
||||
-- ERROR: lower bound of partition "sales_feb2022" is not equals to lower bound of split partition
|
||||
-- ERROR: lower bound of partition "sales_feb2022" is not equal to lower bound of split partition
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
||||
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-02') TO ('2022-03-01'),
|
||||
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
||||
|
@ -191,7 +191,7 @@ SELECT * FROM sales_others;
|
|||
|
||||
DROP TABLE sales_range CASCADE;
|
||||
--
|
||||
-- Add split partition then add rows into partitioned table
|
||||
-- Add split partition, then add rows into partitioned table
|
||||
--
|
||||
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
||||
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
||||
|
@ -394,7 +394,7 @@ LINE 1: SELECT * FROM sales_jan_feb2022;
|
|||
^
|
||||
DROP TABLE sales_date CASCADE;
|
||||
--
|
||||
-- Test: split DEFAULT partition; using a index on partition key; check index after split
|
||||
-- Test: split DEFAULT partition; use an index on partition key; check index after split
|
||||
--
|
||||
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
||||
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
||||
|
@ -441,7 +441,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|||
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
||||
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'),
|
||||
PARTITION sales_others DEFAULT);
|
||||
-- Use indexscan for test indexes
|
||||
-- Use indexscan for testing indexes
|
||||
SET enable_indexscan = ON;
|
||||
SET enable_seqscan = OFF;
|
||||
SELECT * FROM sales_feb2022 where sales_date > '2022-01-01';
|
||||
|
@ -503,7 +503,7 @@ SELECT * FROM pg_indexes WHERE tablename = 'sales_others' and schemaname = 'part
|
|||
|
||||
DROP TABLE sales_range CASCADE;
|
||||
--
|
||||
-- Test: some cases for split DEFAULT partition (different bounds)
|
||||
-- Test: some cases for splitting DEFAULT partition (different bounds)
|
||||
--
|
||||
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date INT) PARTITION BY RANGE (sales_date);
|
||||
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
||||
|
@ -537,7 +537,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|||
ERROR: lower bound of partition "sales_error" conflicts with upper bound of previous partition "sales_dec2022"
|
||||
LINE 3: PARTITION sales_error FOR VALUES FROM (20211210) TO (2021...
|
||||
^
|
||||
-- sales_error intersects with sales_dec2022 (exact the same bounds)
|
||||
-- sales_error intersects with sales_dec2022 (exactly the same bounds)
|
||||
-- ERROR: lower bound of partition "sales_error" conflicts with upper bound of previous partition "sales_dec2022"
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
||||
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
||||
|
@ -547,15 +547,15 @@ ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|||
ERROR: lower bound of partition "sales_error" conflicts with upper bound of previous partition "sales_dec2022"
|
||||
LINE 3: PARTITION sales_error FOR VALUES FROM (20211201) TO (2022...
|
||||
^
|
||||
-- ERROR: any partition in the list should be DEFAULT because split partition is DEFAULT
|
||||
-- ERROR: all partitions in the list should be DEFAULT because split partition is DEFAULT
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
||||
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
||||
PARTITION sales_jan2022 FOR VALUES FROM (20220101) TO (20220201),
|
||||
PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20220301));
|
||||
ERROR: any partition in the list should be DEFAULT because split partition is DEFAULT
|
||||
ERROR: one partition in the list should be DEFAULT because split partition is DEFAULT
|
||||
LINE 2: (PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20...
|
||||
^
|
||||
-- no error: bounds of sales_noerror between sales_dec2022 and sales_feb2022
|
||||
-- no error: bounds of sales_noerror are between sales_dec2022 and sales_feb2022
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
||||
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
||||
PARTITION sales_noerror FOR VALUES FROM (20220110) TO (20220120),
|
||||
|
@ -564,7 +564,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|||
DROP TABLE sales_range;
|
||||
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date INT) PARTITION BY RANGE (sales_date);
|
||||
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
||||
-- no error: bounds of sales_noerror equals to lower and upper bounds of sales_dec2022 and sales_feb2022
|
||||
-- no error: bounds of sales_noerror are equal to lower and upper bounds of sales_dec2022 and sales_feb2022
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
||||
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
||||
PARTITION sales_noerror FOR VALUES FROM (20210101) TO (20210201),
|
||||
|
@ -616,7 +616,7 @@ SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conre
|
|||
FOREIGN KEY (salesman_id) REFERENCES salesmans(salesman_id) | sales_range_salesman_id_fkey | {1}
|
||||
(2 rows)
|
||||
|
||||
-- ERROR: new row for relation "sales_mar2022" violates check constraint "sales_range_salesman_id_check"
|
||||
-- ERROR: new row for relation "sales_mar2022" violates check constraint "sales_range_sales_amount_check"
|
||||
INSERT INTO sales_range VALUES (1, 0, '2022-03-11');
|
||||
ERROR: new row for relation "sales_mar2022" violates check constraint "sales_range_sales_amount_check"
|
||||
DETAIL: Failing row contains (1, 0, 03-11-2022).
|
||||
|
@ -629,7 +629,7 @@ INSERT INTO sales_range VALUES (1, 10, '2022-03-11');
|
|||
DROP TABLE sales_range CASCADE;
|
||||
DROP TABLE salesmans CASCADE;
|
||||
--
|
||||
-- Test: split partition on partitioned table in case exists FOREIGN KEY reference from another table
|
||||
-- Test: split partition on partitioned table in case of existing FOREIGN KEY reference from another table
|
||||
--
|
||||
CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id);
|
||||
CREATE TABLE sales (salesman_id INT REFERENCES salesmans(salesman_id), sales_amount INT, sales_date DATE);
|
||||
|
@ -770,11 +770,11 @@ DROP TABLE salesmans CASCADE;
|
|||
DROP FUNCTION after_insert_row_trigger();
|
||||
--
|
||||
-- Test: split partition witch identity column
|
||||
-- If split partition column is identity-column, columns of new partitions are identity-columns too.
|
||||
-- If split partition column is identity column, columns of new partitions are identity columns too.
|
||||
--
|
||||
CREATE TABLE salesmans(salesman_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id);
|
||||
CREATE TABLE salesmans1_2 PARTITION OF salesmans FOR VALUES FROM (1) TO (2);
|
||||
-- Create new partition with identity-column:
|
||||
-- Create new partition with identity column:
|
||||
CREATE TABLE salesmans2_5(salesman_id INT NOT NULL, salesman_name VARCHAR(30));
|
||||
ALTER TABLE salesmans ATTACH PARTITION salesmans2_5 FOR VALUES FROM (2) TO (5);
|
||||
INSERT INTO salesmans (salesman_name) VALUES ('Poirot');
|
||||
|
@ -793,7 +793,7 @@ SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND
|
|||
salesman_name | |
|
||||
(2 rows)
|
||||
|
||||
-- Split partition has identity-column:
|
||||
-- Split partition has identity column:
|
||||
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans2_5'::regclass::oid;
|
||||
attname | attidentity | attgenerated
|
||||
---------------+-------------+--------------
|
||||
|
@ -1036,7 +1036,7 @@ PARTITION BY LIST (sales_state);
|
|||
CREATE TABLE sales_nord PARTITION OF sales_list FOR VALUES IN ('Oslo', 'St. Petersburg', 'Helsinki');
|
||||
CREATE TABLE sales_all PARTITION OF sales_list FOR VALUES IN ('Warsaw', 'Lisbon', 'New York', 'Madrid', 'Bejing', 'Berlin', 'Delhi', 'Kyiv', 'Vladivostok');
|
||||
CREATE TABLE sales_others PARTITION OF sales_list DEFAULT;
|
||||
-- ERROR: partition "sales_east" would overlap partition "sales_nord"
|
||||
-- ERROR: new partition "sales_east" would overlap with another (not split) partition "sales_nord"
|
||||
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
||||
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
|
||||
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok', 'Helsinki'),
|
||||
|
@ -1063,8 +1063,8 @@ LINE 2: ...s_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid', NULL),
|
|||
DROP TABLE sales_list;
|
||||
--
|
||||
-- Test: two specific errors for BY LIST partitioning:
|
||||
-- * new partitions not has NULL value that split partition has.
|
||||
-- * new partitions not has a value that split partition has.
|
||||
-- * new partitions do not have NULL value, which split partition has.
|
||||
-- * new partitions do not have a value that split partition has.
|
||||
--
|
||||
CREATE TABLE sales_list
|
||||
(salesman_id INT,
|
||||
|
@ -1075,18 +1075,18 @@ CREATE TABLE sales_list
|
|||
PARTITION BY LIST (sales_state);
|
||||
CREATE TABLE sales_nord PARTITION OF sales_list FOR VALUES IN ('Helsinki', 'St. Petersburg', 'Oslo');
|
||||
CREATE TABLE sales_all PARTITION OF sales_list FOR VALUES IN ('Warsaw', 'Lisbon', 'New York', 'Madrid', 'Bejing', 'Berlin', 'Delhi', 'Kyiv', 'Vladivostok', NULL);
|
||||
-- ERROR: new partitions not have value NULL but split partition has
|
||||
-- ERROR: new partitions do not have value NULL but split partition does
|
||||
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
||||
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
|
||||
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok'),
|
||||
PARTITION sales_central FOR VALUES IN ('Warsaw', 'Berlin', 'Kyiv'));
|
||||
ERROR: new partitions not have value NULL but split partition has
|
||||
-- ERROR: new partitions not have value 'Kyiv' but split partition has
|
||||
ERROR: new partitions do not have value NULL but split partition does
|
||||
-- ERROR: new partitions do not have value 'Kyiv' but split partition does
|
||||
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
||||
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
|
||||
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok'),
|
||||
PARTITION sales_central FOR VALUES IN ('Warsaw', 'Berlin', NULL));
|
||||
ERROR: new partitions not have value 'Kyiv' but split partition has
|
||||
ERROR: new partitions do not have value 'Kyiv' but split partition does
|
||||
DROP TABLE sales_list;
|
||||
--
|
||||
-- Test: BY LIST partitioning, SPLIT PARTITION with data
|
||||
|
@ -1174,7 +1174,7 @@ SELECT * FROM sales_central;
|
|||
13 | Gandi | Warsaw | 150 | 03-08-2022
|
||||
(4 rows)
|
||||
|
||||
-- Use indexscan for test indexes after split partition
|
||||
-- Use indexscan for testing indexes after splitting partition
|
||||
SET enable_indexscan = ON;
|
||||
SET enable_seqscan = OFF;
|
||||
SELECT * FROM sales_central WHERE sales_state = 'Warsaw';
|
||||
|
|
|
@ -26,14 +26,14 @@ ALTER TABLE sales_range ATTACH PARTITION sales_apr2022 FOR VALUES FROM ('2022-04
|
|||
|
||||
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
||||
|
||||
-- ERROR: partition with name "sales_feb2022" already used
|
||||
-- ERROR: partition with name "sales_feb2022" is already used
|
||||
ALTER TABLE sales_range MERGE PARTITIONS (sales_feb2022, sales_mar2022, sales_feb2022) INTO sales_feb_mar_apr2022;
|
||||
-- ERROR: "sales_apr2022" is not a table
|
||||
ALTER TABLE sales_range MERGE PARTITIONS (sales_feb2022, sales_mar2022, sales_apr2022) INTO sales_feb_mar_apr2022;
|
||||
-- ERROR: invalid partitions order, partition "sales_mar2022" can not be merged
|
||||
-- ERROR: lower bound of partition "sales_mar2022" conflicts with upper bound of previous partition "sales_jan2022"
|
||||
-- (space between sections sales_jan2022 and sales_mar2022)
|
||||
ALTER TABLE sales_range MERGE PARTITIONS (sales_jan2022, sales_mar2022) INTO sales_jan_mar2022;
|
||||
-- ERROR: invalid partitions order, partition "sales_jan2022" can not be merged
|
||||
-- ERROR: lower bound of partition "sales_jan2022" conflicts with upper bound of previous partition "sales_dec2021"
|
||||
-- (space between sections sales_dec2021 and sales_jan2022)
|
||||
ALTER TABLE sales_range MERGE PARTITIONS (sales_dec2021, sales_jan2022, sales_feb2022) INTO sales_dec_jan_feb2022;
|
||||
|
||||
|
@ -48,7 +48,7 @@ SELECT c.oid::pg_catalog.regclass, c.relkind, inhdetachpending, pg_catalog.pg_ge
|
|||
DROP TABLE sales_range;
|
||||
|
||||
--
|
||||
-- Add rows into partitioned table then merge partitions
|
||||
-- Add rows into partitioned table, then merge partitions
|
||||
--
|
||||
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
||||
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
||||
|
@ -96,7 +96,7 @@ SELECT * FROM sales_jan2022;
|
|||
SELECT * FROM sales_feb_mar_apr2022;
|
||||
SELECT * FROM sales_others;
|
||||
|
||||
-- Use indexscan for test indexes
|
||||
-- Use indexscan for testing indexes
|
||||
SET enable_seqscan = OFF;
|
||||
|
||||
SELECT * FROM sales_feb_mar_apr2022 where sales_date > '2022-01-01';
|
||||
|
@ -415,7 +415,7 @@ SELECT * FROM sales_list;
|
|||
SELECT * FROM sales_nord;
|
||||
SELECT * FROM sales_all;
|
||||
|
||||
-- Use indexscan for test indexes after merge partitions
|
||||
-- Use indexscan for testing indexes after merging partitions
|
||||
SET enable_seqscan = OFF;
|
||||
|
||||
SELECT * FROM sales_all WHERE sales_state = 'Warsaw';
|
||||
|
|
|
@ -42,7 +42,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|||
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-02-01'),
|
||||
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
||||
|
||||
--ERROR: list of split partitions should contains at least two items
|
||||
--ERROR: list of split partitions should contain at least two items
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
||||
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-10-01'));
|
||||
|
||||
|
@ -52,14 +52,14 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|||
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
||||
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
||||
|
||||
-- ERROR: name "sales_feb_mar_apr2022" already used
|
||||
-- ERROR: name "sales_feb_mar_apr2022" is already used
|
||||
-- (We can create partition with the same name as split partition, but can't create two partitions with the same name)
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
||||
(PARTITION sales_feb_mar_apr2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
||||
PARTITION sales_feb_mar_apr2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
||||
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'));
|
||||
|
||||
-- ERROR: name "sales_feb2022" already used
|
||||
-- ERROR: name "sales_feb2022" is already used
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
||||
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
||||
PARTITION sales_feb2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
||||
|
@ -77,7 +77,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|||
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
||||
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-06-01'));
|
||||
|
||||
-- ERROR: lower bound of partition "sales_mar2022" is not equals to upper bound of previous partition
|
||||
-- ERROR: lower bound of partition "sales_mar2022" conflicts with upper bound of previous partition "sales_feb2022"
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
||||
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-01') TO ('2022-03-01'),
|
||||
PARTITION sales_mar2022 FOR VALUES FROM ('2022-02-01') TO ('2022-04-01'),
|
||||
|
@ -86,7 +86,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
|||
-- Tests for spaces between partitions, them should be executed without DEFAULT partition
|
||||
ALTER TABLE sales_range DETACH PARTITION sales_others;
|
||||
|
||||
-- ERROR: lower bound of partition "sales_feb2022" is not equals to lower bound of split partition
|
||||
-- ERROR: lower bound of partition "sales_feb2022" is not equal to lower bound of split partition
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_feb_mar_apr2022 INTO
|
||||
(PARTITION sales_feb2022 FOR VALUES FROM ('2022-02-02') TO ('2022-03-01'),
|
||||
PARTITION sales_mar2022 FOR VALUES FROM ('2022-03-01') TO ('2022-04-01'),
|
||||
|
@ -133,7 +133,7 @@ SELECT * FROM sales_others;
|
|||
DROP TABLE sales_range CASCADE;
|
||||
|
||||
--
|
||||
-- Add split partition then add rows into partitioned table
|
||||
-- Add split partition, then add rows into partitioned table
|
||||
--
|
||||
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
||||
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
||||
|
@ -219,7 +219,7 @@ SELECT * FROM sales_jan_feb2022;
|
|||
DROP TABLE sales_date CASCADE;
|
||||
|
||||
--
|
||||
-- Test: split DEFAULT partition; using a index on partition key; check index after split
|
||||
-- Test: split DEFAULT partition; use an index on partition key; check index after split
|
||||
--
|
||||
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date DATE) PARTITION BY RANGE (sales_date);
|
||||
CREATE TABLE sales_jan2022 PARTITION OF sales_range FOR VALUES FROM ('2022-01-01') TO ('2022-02-01');
|
||||
|
@ -250,7 +250,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|||
PARTITION sales_apr2022 FOR VALUES FROM ('2022-04-01') TO ('2022-05-01'),
|
||||
PARTITION sales_others DEFAULT);
|
||||
|
||||
-- Use indexscan for test indexes
|
||||
-- Use indexscan for testing indexes
|
||||
SET enable_indexscan = ON;
|
||||
SET enable_seqscan = OFF;
|
||||
|
||||
|
@ -270,7 +270,7 @@ SELECT * FROM pg_indexes WHERE tablename = 'sales_others' and schemaname = 'part
|
|||
DROP TABLE sales_range CASCADE;
|
||||
|
||||
--
|
||||
-- Test: some cases for split DEFAULT partition (different bounds)
|
||||
-- Test: some cases for splitting DEFAULT partition (different bounds)
|
||||
--
|
||||
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date INT) PARTITION BY RANGE (sales_date);
|
||||
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
||||
|
@ -299,7 +299,7 @@ ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|||
PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20220301),
|
||||
PARTITION sales_others DEFAULT);
|
||||
|
||||
-- sales_error intersects with sales_dec2022 (exact the same bounds)
|
||||
-- sales_error intersects with sales_dec2022 (exactly the same bounds)
|
||||
-- ERROR: lower bound of partition "sales_error" conflicts with upper bound of previous partition "sales_dec2022"
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
||||
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
||||
|
@ -307,13 +307,13 @@ ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
|||
PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20220301),
|
||||
PARTITION sales_others DEFAULT);
|
||||
|
||||
-- ERROR: any partition in the list should be DEFAULT because split partition is DEFAULT
|
||||
-- ERROR: all partitions in the list should be DEFAULT because split partition is DEFAULT
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
||||
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
||||
PARTITION sales_jan2022 FOR VALUES FROM (20220101) TO (20220201),
|
||||
PARTITION sales_feb2022 FOR VALUES FROM (20220201) TO (20220301));
|
||||
|
||||
-- no error: bounds of sales_noerror between sales_dec2022 and sales_feb2022
|
||||
-- no error: bounds of sales_noerror are between sales_dec2022 and sales_feb2022
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
||||
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
||||
PARTITION sales_noerror FOR VALUES FROM (20220110) TO (20220120),
|
||||
|
@ -325,7 +325,7 @@ DROP TABLE sales_range;
|
|||
CREATE TABLE sales_range (salesman_id INT, salesman_name VARCHAR(30), sales_amount INT, sales_date INT) PARTITION BY RANGE (sales_date);
|
||||
CREATE TABLE sales_others PARTITION OF sales_range DEFAULT;
|
||||
|
||||
-- no error: bounds of sales_noerror equals to lower and upper bounds of sales_dec2022 and sales_feb2022
|
||||
-- no error: bounds of sales_noerror are equal to lower and upper bounds of sales_dec2022 and sales_feb2022
|
||||
ALTER TABLE sales_range SPLIT PARTITION sales_others INTO
|
||||
(PARTITION sales_dec2022 FOR VALUES FROM (20211201) TO (20220101),
|
||||
PARTITION sales_noerror FOR VALUES FROM (20210101) TO (20210201),
|
||||
|
@ -361,7 +361,7 @@ SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conre
|
|||
SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'sales_mar2022'::regclass::oid;
|
||||
SELECT pg_get_constraintdef(oid), conname, conkey FROM pg_constraint WHERE conrelid = 'sales_apr2022'::regclass::oid;
|
||||
|
||||
-- ERROR: new row for relation "sales_mar2022" violates check constraint "sales_range_salesman_id_check"
|
||||
-- ERROR: new row for relation "sales_mar2022" violates check constraint "sales_range_sales_amount_check"
|
||||
INSERT INTO sales_range VALUES (1, 0, '2022-03-11');
|
||||
-- ERROR: insert or update on table "sales_mar2022" violates foreign key constraint "sales_range_salesman_id_fkey"
|
||||
INSERT INTO sales_range VALUES (-1, 10, '2022-03-11');
|
||||
|
@ -372,7 +372,7 @@ DROP TABLE sales_range CASCADE;
|
|||
DROP TABLE salesmans CASCADE;
|
||||
|
||||
--
|
||||
-- Test: split partition on partitioned table in case exists FOREIGN KEY reference from another table
|
||||
-- Test: split partition on partitioned table in case of existing FOREIGN KEY reference from another table
|
||||
--
|
||||
CREATE TABLE salesmans(salesman_id INT PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id);
|
||||
CREATE TABLE sales (salesman_id INT REFERENCES salesmans(salesman_id), sales_amount INT, sales_date DATE);
|
||||
|
@ -470,12 +470,12 @@ DROP FUNCTION after_insert_row_trigger();
|
|||
|
||||
--
|
||||
-- Test: split partition witch identity column
|
||||
-- If split partition column is identity-column, columns of new partitions are identity-columns too.
|
||||
-- If split partition column is identity column, columns of new partitions are identity columns too.
|
||||
--
|
||||
CREATE TABLE salesmans(salesman_id INT GENERATED ALWAYS AS IDENTITY PRIMARY KEY, salesman_name VARCHAR(30)) PARTITION BY RANGE (salesman_id);
|
||||
|
||||
CREATE TABLE salesmans1_2 PARTITION OF salesmans FOR VALUES FROM (1) TO (2);
|
||||
-- Create new partition with identity-column:
|
||||
-- Create new partition with identity column:
|
||||
CREATE TABLE salesmans2_5(salesman_id INT NOT NULL, salesman_name VARCHAR(30));
|
||||
ALTER TABLE salesmans ATTACH PARTITION salesmans2_5 FOR VALUES FROM (2) TO (5);
|
||||
|
||||
|
@ -484,7 +484,7 @@ INSERT INTO salesmans (salesman_name) VALUES ('Ivanov');
|
|||
|
||||
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans'::regclass::oid;
|
||||
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans1_2'::regclass::oid;
|
||||
-- Split partition has identity-column:
|
||||
-- Split partition has identity column:
|
||||
SELECT attname, attidentity, attgenerated FROM pg_attribute WHERE attnum > 0 AND attrelid = 'salesmans2_5'::regclass::oid;
|
||||
|
||||
ALTER TABLE salesmans SPLIT PARTITION salesmans2_5 INTO
|
||||
|
@ -609,7 +609,7 @@ CREATE TABLE sales_nord PARTITION OF sales_list FOR VALUES IN ('Oslo', 'St. Pete
|
|||
CREATE TABLE sales_all PARTITION OF sales_list FOR VALUES IN ('Warsaw', 'Lisbon', 'New York', 'Madrid', 'Bejing', 'Berlin', 'Delhi', 'Kyiv', 'Vladivostok');
|
||||
CREATE TABLE sales_others PARTITION OF sales_list DEFAULT;
|
||||
|
||||
-- ERROR: partition "sales_east" would overlap partition "sales_nord"
|
||||
-- ERROR: new partition "sales_east" would overlap with another (not split) partition "sales_nord"
|
||||
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
||||
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
|
||||
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok', 'Helsinki'),
|
||||
|
@ -631,8 +631,8 @@ DROP TABLE sales_list;
|
|||
|
||||
--
|
||||
-- Test: two specific errors for BY LIST partitioning:
|
||||
-- * new partitions not has NULL value that split partition has.
|
||||
-- * new partitions not has a value that split partition has.
|
||||
-- * new partitions do not have NULL value, which split partition has.
|
||||
-- * new partitions do not have a value that split partition has.
|
||||
--
|
||||
CREATE TABLE sales_list
|
||||
(salesman_id INT,
|
||||
|
@ -645,13 +645,13 @@ PARTITION BY LIST (sales_state);
|
|||
CREATE TABLE sales_nord PARTITION OF sales_list FOR VALUES IN ('Helsinki', 'St. Petersburg', 'Oslo');
|
||||
CREATE TABLE sales_all PARTITION OF sales_list FOR VALUES IN ('Warsaw', 'Lisbon', 'New York', 'Madrid', 'Bejing', 'Berlin', 'Delhi', 'Kyiv', 'Vladivostok', NULL);
|
||||
|
||||
-- ERROR: new partitions not have value NULL but split partition has
|
||||
-- ERROR: new partitions do not have value NULL but split partition does
|
||||
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
||||
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
|
||||
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok'),
|
||||
PARTITION sales_central FOR VALUES IN ('Warsaw', 'Berlin', 'Kyiv'));
|
||||
|
||||
-- ERROR: new partitions not have value 'Kyiv' but split partition has
|
||||
-- ERROR: new partitions do not have value 'Kyiv' but split partition does
|
||||
ALTER TABLE sales_list SPLIT PARTITION sales_all INTO
|
||||
(PARTITION sales_west FOR VALUES IN ('Lisbon', 'New York', 'Madrid'),
|
||||
PARTITION sales_east FOR VALUES IN ('Bejing', 'Delhi', 'Vladivostok'),
|
||||
|
@ -703,7 +703,7 @@ SELECT * FROM sales_east;
|
|||
SELECT * FROM sales_nord;
|
||||
SELECT * FROM sales_central;
|
||||
|
||||
-- Use indexscan for test indexes after split partition
|
||||
-- Use indexscan for testing indexes after splitting partition
|
||||
SET enable_indexscan = ON;
|
||||
SET enable_seqscan = OFF;
|
||||
|
||||
|
|
Loading…
Reference in New Issue