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

Commit1823fbb

Browse files
committed
fix INSERT INTO ... SELECT ... FROM partitioned_table (+tests)
1 parent30556ad commit1823fbb

File tree

3 files changed

+87
-5
lines changed

3 files changed

+87
-5
lines changed

‎expected/pathman_basic.out

Lines changed: 59 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,64 @@ EXPLAIN (COSTS OFF) SELECT * FROM test.improved_dummy WHERE id = 101 OR id = 5 A
262262

263263
DROP TABLE test.improved_dummy CASCADE;
264264
NOTICE: drop cascades to 11 other objects
265+
/* Test pathman_rel_pathlist_hook() with INSERT query */
266+
CREATE TABLE test.insert_into_select(val int NOT NULL);
267+
INSERT INTO test.insert_into_select SELECT generate_series(1, 100);
268+
SELECT pathman.create_range_partitions('test.insert_into_select', 'val', 1, 20);
269+
NOTICE: sequence "insert_into_select_seq" does not exist, skipping
270+
create_range_partitions
271+
-------------------------
272+
5
273+
(1 row)
274+
275+
CREATE TABLE test.insert_into_select_copy (LIKE test.insert_into_select); /* INSERT INTO ... SELECT ... */
276+
EXPLAIN (COSTS OFF)
277+
INSERT INTO test.insert_into_select_copy
278+
SELECT * FROM test.insert_into_select
279+
WHERE val <= 80;
280+
QUERY PLAN
281+
----------------------------------------------
282+
Insert on insert_into_select_copy
283+
-> Append
284+
-> Seq Scan on insert_into_select_1
285+
-> Seq Scan on insert_into_select_2
286+
-> Seq Scan on insert_into_select_3
287+
-> Seq Scan on insert_into_select_4
288+
Filter: (val <= 80)
289+
(7 rows)
290+
291+
SELECT pathman.set_enable_parent('test.insert_into_select', true);
292+
set_enable_parent
293+
-------------------
294+
295+
(1 row)
296+
297+
EXPLAIN (COSTS OFF)
298+
INSERT INTO test.insert_into_select_copy
299+
SELECT * FROM test.insert_into_select
300+
WHERE val <= 80;
301+
QUERY PLAN
302+
----------------------------------------------
303+
Insert on insert_into_select_copy
304+
-> Append
305+
-> Seq Scan on insert_into_select
306+
Filter: (val <= 80)
307+
-> Seq Scan on insert_into_select_1
308+
-> Seq Scan on insert_into_select_2
309+
-> Seq Scan on insert_into_select_3
310+
-> Seq Scan on insert_into_select_4
311+
Filter: (val <= 80)
312+
(9 rows)
313+
314+
INSERT INTO test.insert_into_select_copy SELECT * FROM test.insert_into_select;
315+
SELECT count(*) FROM test.insert_into_select_copy;
316+
count
317+
-------
318+
100
319+
(1 row)
320+
321+
DROP TABLE test.insert_into_select_copy, test.insert_into_select CASCADE;
322+
NOTICE: drop cascades to 5 other objects
265323
/* test special case: ONLY statement with not-ONLY for partitioned table */
266324
CREATE TABLE test.from_only_test(val INT NOT NULL);
267325
INSERT INTO test.from_only_test SELECT generate_series(1, 20);
@@ -1909,6 +1967,6 @@ EXPLAIN (COSTS OFF) SELECT * FROM test.index_on_childs WHERE c1 > 100 AND c1 < 2
19091967
(12 rows)
19101968

19111969
DROP SCHEMA test CASCADE;
1912-
NOTICE: drop cascades to47 other objects
1970+
NOTICE: drop cascades to48 other objects
19131971
DROP EXTENSION pg_pathman CASCADE;
19141972
DROP SCHEMA pathman CASCADE;

‎sql/pathman_basic.sql

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,29 @@ EXPLAIN (COSTS OFF) SELECT * FROM test.improved_dummy WHERE id = 101 OR id = 5 A
7878
DROPTABLEtest.improved_dummy CASCADE;
7979

8080

81+
/* Test pathman_rel_pathlist_hook() with INSERT query*/
82+
CREATETABLEtest.insert_into_select(valintNOT NULL);
83+
INSERT INTOtest.insert_into_selectSELECT generate_series(1,100);
84+
SELECTpathman.create_range_partitions('test.insert_into_select','val',1,20);
85+
CREATETABLEtest.insert_into_select_copy (LIKEtest.insert_into_select);/* INSERT INTO ... SELECT ...*/
86+
87+
EXPLAIN (COSTS OFF)
88+
INSERT INTOtest.insert_into_select_copy
89+
SELECT*FROMtest.insert_into_select
90+
WHERE val<=80;
91+
92+
SELECTpathman.set_enable_parent('test.insert_into_select', true);
93+
94+
EXPLAIN (COSTS OFF)
95+
INSERT INTOtest.insert_into_select_copy
96+
SELECT*FROMtest.insert_into_select
97+
WHERE val<=80;
98+
99+
INSERT INTOtest.insert_into_select_copySELECT*FROMtest.insert_into_select;
100+
SELECTcount(*)FROMtest.insert_into_select_copy;
101+
DROPTABLEtest.insert_into_select_copy,test.insert_into_select CASCADE;
102+
103+
81104
/* test special case: ONLY statement with not-ONLY for partitioned table*/
82105
CREATETABLEtest.from_only_test(valINTNOT NULL);
83106
INSERT INTOtest.from_only_testSELECT generate_series(1,20);

‎src/hooks.c

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -204,10 +204,11 @@ pathman_rel_pathlist_hook(PlannerInfo *root,
204204
if (!IsPathmanReady())
205205
return;
206206

207-
/* This works only for SELECTs on simple relations */
208-
if (root->parse->commandType!=CMD_SELECT||
209-
rte->rtekind!=RTE_RELATION||
210-
rte->relkind!=RELKIND_RELATION)
207+
/* This works only for SELECTs or INSERTs on simple relations */
208+
if (rte->rtekind!=RTE_RELATION||
209+
rte->relkind!=RELKIND_RELATION||
210+
(root->parse->commandType!=CMD_SELECT&&
211+
root->parse->commandType!=CMD_INSERT))/* INSERT INTO ... SELECT ... */
211212
return;
212213

213214
/* Skip if this table is not allowed to act as parent (see FROM ONLY) */

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp