Skip to content

Commit d941ff4

Browse files
committed
pathman: regression tests for UPDATE and DELETE
1 parent 26d3945 commit d941ff4

File tree

3 files changed

+49
-16
lines changed

3 files changed

+49
-16
lines changed

contrib/pg_pathman/expected/pg_pathman.out

Lines changed: 34 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -753,8 +753,9 @@ EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE id = 1234;
753753
/* Range */
754754
CREATE TABLE range_rel (
755755
id SERIAL PRIMARY KEY,
756-
dt TIMESTAMP NOT NULL);
757-
INSERT INTO range_rel (dt) SELECT g FROM generate_series('2010-01-01'::date, '2010-12-31'::date, '1 day') as g;
756+
dt TIMESTAMP NOT NULL,
757+
value INTEGER);
758+
INSERT INTO range_rel (dt, value) SELECT g, extract(day from g) FROM generate_series('2010-01-01'::date, '2010-12-31'::date, '1 day') as g;
758759
SELECT create_range_partitions('range_rel', 'dt', '2010-01-01'::date, '1 month'::interval, 12);
759760
NOTICE: sequence "range_rel_seq" does not exist, skipping
760761
NOTICE: Copying data to partitions...
@@ -817,6 +818,36 @@ EXPLAIN (COSTS OFF) SELECT * FROM range_rel WHERE dt > '2010-12-15';
817818
-> Seq Scan on range_rel_14
818819
(4 rows)
819820

821+
/* Test UPDATE and DELETE */
822+
EXPLAIN (COSTS OFF) UPDATE range_rel SET value = 111 WHERE dt = '2010-06-15';
823+
QUERY PLAN
824+
--------------------------------------------------------------------------------
825+
Update on range_rel_6
826+
-> Seq Scan on range_rel_6
827+
Filter: (dt = 'Tue Jun 15 00:00:00 2010'::timestamp without time zone)
828+
(3 rows)
829+
830+
UPDATE range_rel SET value = 111 WHERE dt = '2010-06-15';
831+
SELECT * FROM range_rel WHERE dt = '2010-06-15';
832+
id | dt | value
833+
-----+--------------------------+-------
834+
166 | Tue Jun 15 00:00:00 2010 | 111
835+
(1 row)
836+
837+
EXPLAIN (COSTS OFF) DELETE FROM range_rel WHERE dt = '2010-06-15';
838+
QUERY PLAN
839+
--------------------------------------------------------------------------------
840+
Delete on range_rel_6
841+
-> Seq Scan on range_rel_6
842+
Filter: (dt = 'Tue Jun 15 00:00:00 2010'::timestamp without time zone)
843+
(3 rows)
844+
845+
DELETE FROM range_rel WHERE dt = '2010-06-15';
846+
SELECT * FROM range_rel WHERE dt = '2010-06-15';
847+
id | dt | value
848+
----+----+-------
849+
(0 rows)
850+
820851
/* Create range partitions from whole range */
821852
SELECT drop_range_partitions('range_rel');
822853
NOTICE: 0 rows copied from range_rel_15
@@ -828,7 +859,7 @@ NOTICE: 31 rows copied from range_rel_10
828859
NOTICE: 30 rows copied from range_rel_9
829860
NOTICE: 31 rows copied from range_rel_8
830861
NOTICE: 31 rows copied from range_rel_7
831-
NOTICE: 30 rows copied from range_rel_6
862+
NOTICE: 29 rows copied from range_rel_6
832863
NOTICE: 31 rows copied from range_rel_5
833864
NOTICE: 30 rows copied from range_rel_4
834865
NOTICE: 31 rows copied from range_rel_3

contrib/pg_pathman/pg_pathman.c

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -196,9 +196,6 @@ pathman_planner_hook(Query *parse, int cursorOptions, ParamListInfo boundParams)
196196
}
197197

198198
inheritance_disabled = false;
199-
200-
// if (parse->commandType != CMD_SELECT)
201-
202199
switch(parse->commandType)
203200
{
204201
case CMD_SELECT:
@@ -275,7 +272,6 @@ handle_modification_query(Query *parse)
275272
PartRelationInfo *prel;
276273
List *ranges,
277274
*wrappers = NIL;
278-
// ListCell *lc;
279275
RangeTblEntry *rte;
280276
WrapperNode *wrap;
281277
bool found;
@@ -286,23 +282,20 @@ handle_modification_query(Query *parse)
286282
rte = (RangeTblEntry *) linitial(parse->rtable);
287283
prel = get_pathman_relation_info(rte->relid, &found);
288284

289-
// foreach(lc, parse->jointree->quals)
290-
// {
291-
// WrapperNode *wrap;
292-
// Expr *expr = (Expr *) lfirst(lc);
285+
if (!found)
286+
return;
293287

294-
// wrap = walk_expr_tree(expr, prel);
288+
/* Parse syntax tree and extract partition ranges */
295289
ranges = list_make1_int(make_irange(0, prel->children_count - 1, false));
296290
wrap = walk_expr_tree( (Expr *) parse->jointree->quals, prel);
297291
wrappers = lappend(wrappers, wrap);
298292
ranges = irange_list_intersect(ranges, wrap->rangeset);
299-
// }
300293

301294
/* If only one partition is affected then substitute parent table with partition */
302295
if (irange_list_length(ranges) == 1)
303296
{
304297
IndexRange irange = (IndexRange) linitial_oid(ranges);
305-
elog(WARNING, "lower: %d, upper: %d, lossy: %d", irange_lower(irange), irange_upper(irange), irange_is_lossy(irange));
298+
// elog(WARNING, "lower: %d, upper: %d, lossy: %d", irange_lower(irange), irange_upper(irange), irange_is_lossy(irange));
306299
if (irange_lower(irange) == irange_upper(irange))
307300
{
308301
Oid *children = (Oid *) dsm_array_get_pointer(&prel->children);

contrib/pg_pathman/sql/pg_pathman.sql

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -191,8 +191,9 @@ EXPLAIN (COSTS OFF) SELECT * FROM hash_rel WHERE id = 1234;
191191
/* Range */
192192
CREATE TABLE range_rel (
193193
id SERIAL PRIMARY KEY,
194-
dt TIMESTAMP NOT NULL);
195-
INSERT INTO range_rel (dt) SELECT g FROM generate_series('2010-01-01'::date, '2010-12-31'::date, '1 day') as g;
194+
dt TIMESTAMP NOT NULL,
195+
value INTEGER);
196+
INSERT INTO range_rel (dt, value) SELECT g, extract(day from g) FROM generate_series('2010-01-01'::date, '2010-12-31'::date, '1 day') as g;
196197
SELECT create_range_partitions('range_rel', 'dt', '2010-01-01'::date, '1 month'::interval, 12);
197198
SELECT merge_range_partitions('range_rel_1', 'range_rel_2');
198199
SELECT split_range_partition('range_rel_1', '2010-02-15'::date);
@@ -201,6 +202,14 @@ SELECT prepend_range_partition('range_rel');
201202
EXPLAIN (COSTS OFF) SELECT * FROM range_rel WHERE dt < '2010-03-01';
202203
EXPLAIN (COSTS OFF) SELECT * FROM range_rel WHERE dt > '2010-12-15';
203204

205+
/* Test UPDATE and DELETE */
206+
EXPLAIN (COSTS OFF) UPDATE range_rel SET value = 111 WHERE dt = '2010-06-15';
207+
UPDATE range_rel SET value = 111 WHERE dt = '2010-06-15';
208+
SELECT * FROM range_rel WHERE dt = '2010-06-15';
209+
EXPLAIN (COSTS OFF) DELETE FROM range_rel WHERE dt = '2010-06-15';
210+
DELETE FROM range_rel WHERE dt = '2010-06-15';
211+
SELECT * FROM range_rel WHERE dt = '2010-06-15';
212+
204213
/* Create range partitions from whole range */
205214
SELECT drop_range_partitions('range_rel');
206215
SELECT create_partitions_from_range('range_rel', 'id', 1, 1000, 100);

0 commit comments

Comments
 (0)