Skip to content

Commit 51f148b

Browse files
author
Alexander Korotkov
committed
Improve support of UPDATE and DELETE.
1 parent 0ede14d commit 51f148b

File tree

3 files changed

+43
-4
lines changed

3 files changed

+43
-4
lines changed

contrib/pg_pathman/expected/pg_pathman.out

Lines changed: 30 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -818,6 +818,9 @@ EXPLAIN (COSTS OFF) SELECT * FROM range_rel WHERE dt > '2010-12-15';
818818
-> Seq Scan on range_rel_14
819819
(4 rows)
820820

821+
/* Temporary table for JOINs */
822+
CREATE TABLE tmp (id INTEGER NOT NULL, value INTEGER NOT NULL);
823+
INSERT INTO tmp VALUES (1, 1), (2, 2);
821824
/* Test UPDATE and DELETE */
822825
EXPLAIN (COSTS OFF) UPDATE range_rel SET value = 111 WHERE dt = '2010-06-15';
823826
QUERY PLAN
@@ -848,6 +851,32 @@ SELECT * FROM range_rel WHERE dt = '2010-06-15';
848851
----+----+-------
849852
(0 rows)
850853

854+
EXPLAIN (COSTS OFF) UPDATE range_rel r SET value = t.value FROM tmp t WHERE r.dt = '2010-01-01' AND r.id = t.id;
855+
QUERY PLAN
856+
--------------------------------------------------------------------------------------------
857+
Update on range_rel_1 r
858+
-> Hash Join
859+
Hash Cond: (t.id = r.id)
860+
-> Seq Scan on tmp t
861+
-> Hash
862+
-> Index Scan using range_rel_1_pkey on range_rel_1 r
863+
Filter: (dt = 'Fri Jan 01 00:00:00 2010'::timestamp without time zone)
864+
(7 rows)
865+
866+
UPDATE range_rel r SET value = t.value FROM tmp t WHERE r.dt = '2010-01-01' AND r.id = t.id;
867+
EXPLAIN (COSTS OFF) DELETE FROM range_rel r USING tmp t WHERE r.dt = '2010-01-02' AND r.id = t.id;
868+
QUERY PLAN
869+
--------------------------------------------------------------------------------------------
870+
Delete on range_rel_1 r
871+
-> Hash Join
872+
Hash Cond: (t.id = r.id)
873+
-> Seq Scan on tmp t
874+
-> Hash
875+
-> Index Scan using range_rel_1_pkey on range_rel_1 r
876+
Filter: (dt = 'Sat Jan 02 00:00:00 2010'::timestamp without time zone)
877+
(7 rows)
878+
879+
DELETE FROM range_rel r USING tmp t WHERE r.dt = '2010-01-02' AND r.id = t.id;
851880
/* Create range partitions from whole range */
852881
SELECT drop_range_partitions('range_rel');
853882
NOTICE: 0 rows copied from range_rel_15
@@ -863,7 +892,7 @@ NOTICE: 29 rows copied from range_rel_6
863892
NOTICE: 31 rows copied from range_rel_5
864893
NOTICE: 30 rows copied from range_rel_4
865894
NOTICE: 31 rows copied from range_rel_3
866-
NOTICE: 45 rows copied from range_rel_1
895+
NOTICE: 44 rows copied from range_rel_1
867896
drop_range_partitions
868897
-----------------------
869898
14

contrib/pg_pathman/pg_pathman.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121
#include "optimizer/planner.h"
2222
#include "optimizer/restrictinfo.h"
2323
#include "optimizer/cost.h"
24+
#include "parser/parsetree.h"
2425
#include "utils/hsearch.h"
2526
#include "utils/tqual.h"
2627
#include "utils/rel.h"
@@ -276,10 +277,11 @@ handle_modification_query(Query *parse)
276277
WrapperNode *wrap;
277278
bool found;
278279

279-
if (list_length(parse->rtable) != 1)
280-
return;
280+
Assert(parse->commandType == CMD_UPDATE ||
281+
parse->commandType == CMD_DELETE);
282+
Assert(parse->resultRelation > 0);
281283

282-
rte = (RangeTblEntry *) linitial(parse->rtable);
284+
rte = rt_fetch(parse->resultRelation, parse->rtable);
283285
prel = get_pathman_relation_info(rte->relid, &found);
284286

285287
if (!found)

contrib/pg_pathman/sql/pg_pathman.sql

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -202,13 +202,21 @@ SELECT prepend_range_partition('range_rel');
202202
EXPLAIN (COSTS OFF) SELECT * FROM range_rel WHERE dt < '2010-03-01';
203203
EXPLAIN (COSTS OFF) SELECT * FROM range_rel WHERE dt > '2010-12-15';
204204

205+
/* Temporary table for JOINs */
206+
CREATE TABLE tmp (id INTEGER NOT NULL, value INTEGER NOT NULL);
207+
INSERT INTO tmp VALUES (1, 1), (2, 2);
208+
205209
/* Test UPDATE and DELETE */
206210
EXPLAIN (COSTS OFF) UPDATE range_rel SET value = 111 WHERE dt = '2010-06-15';
207211
UPDATE range_rel SET value = 111 WHERE dt = '2010-06-15';
208212
SELECT * FROM range_rel WHERE dt = '2010-06-15';
209213
EXPLAIN (COSTS OFF) DELETE FROM range_rel WHERE dt = '2010-06-15';
210214
DELETE FROM range_rel WHERE dt = '2010-06-15';
211215
SELECT * FROM range_rel WHERE dt = '2010-06-15';
216+
EXPLAIN (COSTS OFF) UPDATE range_rel r SET value = t.value FROM tmp t WHERE r.dt = '2010-01-01' AND r.id = t.id;
217+
UPDATE range_rel r SET value = t.value FROM tmp t WHERE r.dt = '2010-01-01' AND r.id = t.id;
218+
EXPLAIN (COSTS OFF) DELETE FROM range_rel r USING tmp t WHERE r.dt = '2010-01-02' AND r.id = t.id;
219+
DELETE FROM range_rel r USING tmp t WHERE r.dt = '2010-01-02' AND r.id = t.id;
212220

213221
/* Create range partitions from whole range */
214222
SELECT drop_range_partitions('range_rel');

0 commit comments

Comments
 (0)