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

Commit51f148b

Browse files
author
Alexander Korotkov
committed
Improve support of UPDATE and DELETE.
1 parent0ede14d commit51f148b

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
boolfound;
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_relWHERE dt<'2010-03-01';
203203
EXPLAIN (COSTS OFF)SELECT*FROM range_relWHERE dt>'2010-12-15';
204204

205+
/* Temporary table for JOINs*/
206+
CREATETABLEtmp (idINTEGERNOT NULL, valueINTEGERNOT NULL);
207+
INSERT INTO tmpVALUES (1,1), (2,2);
208+
205209
/* Test UPDATE and DELETE*/
206210
EXPLAIN (COSTS OFF)UPDATE range_relSET value=111WHERE dt='2010-06-15';
207211
UPDATE range_relSET value=111WHERE dt='2010-06-15';
208212
SELECT*FROM range_relWHERE dt='2010-06-15';
209213
EXPLAIN (COSTS OFF)DELETEFROM range_relWHERE dt='2010-06-15';
210214
DELETEFROM range_relWHERE dt='2010-06-15';
211215
SELECT*FROM range_relWHERE dt='2010-06-15';
216+
EXPLAIN (COSTS OFF)UPDATE range_rel rSET value=t.valueFROM tmp tWHEREr.dt='2010-01-01'ANDr.id=t.id;
217+
UPDATE range_rel rSET value=t.valueFROM tmp tWHEREr.dt='2010-01-01'ANDr.id=t.id;
218+
EXPLAIN (COSTS OFF)DELETEFROM range_rel r USING tmp tWHEREr.dt='2010-01-02'ANDr.id=t.id;
219+
DELETEFROM range_rel r USING tmp tWHEREr.dt='2010-01-02'ANDr.id=t.id;
212220

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

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp