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

Commit4a278c1

Browse files
pyhalovdanolivo
authored andcommitted
[PGPRO-7183] bring in line stable 13, 14, 15
Cherry-pick commit:b3bb11fAdd tests on partitioned tables with foreign partitions.
1 parent1ccd480 commit4a278c1

File tree

2 files changed

+126
-1
lines changed

2 files changed

+126
-1
lines changed

‎expected/aqo_fdw.out

Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,89 @@ WHERE a.aid = b.aid AND b.bval like 'val%';
160160
JOINS: 0
161161
(6 rows)
162162

163+
-- Partitioned join over foreign tables
164+
set enable_partitionwise_join = on;
165+
ALTER SERVER loopback OPTIONS (ADD fdw_tuple_cost '1.0');
166+
CREATE TABLE local_main_p0(aid int, aval text);
167+
CREATE TABLE local_main_p1(aid int, aval text);
168+
CREATE TABLE main (aid int, aval text) PARTITION BY HASH(aid);
169+
CREATE FOREIGN TABLE main_p0 PARTITION OF main FOR VALUES WITH (MODULUS 3, REMAINDER 0)
170+
SERVER loopback OPTIONS (table_name 'local_main_p0');
171+
CREATE FOREIGN TABLE main_p1 PARTITION OF main FOR VALUES WITH (MODULUS 3, REMAINDER 1)
172+
SERVER loopback OPTIONS (table_name 'local_main_p1');
173+
CREATE TABLE main_p2 PARTITION OF main FOR VALUES WITH (MODULUS 3, REMAINDER 2);
174+
CREATE TABLE local_ref_p0(bid int, aid int, bval text);
175+
CREATE TABLE local_ref_p1(bid int, aid int, bval text);
176+
CREATE TABLE ref (bid int, aid int, bval text) PARTITION BY HASH(aid);
177+
CREATE FOREIGN TABLE ref_p0 PARTITION OF ref FOR VALUES WITH (MODULUS 3, REMAINDER 0)
178+
SERVER loopback OPTIONS (table_name 'local_ref_p0');
179+
CREATE FOREIGN TABLE ref_p1 PARTITION OF ref FOR VALUES WITH (MODULUS 3, REMAINDER 1)
180+
SERVER loopback OPTIONS (table_name 'local_ref_p1');
181+
CREATE TABLE ref_p2 PARTITION OF ref FOR VALUES WITH (MODULUS 3, REMAINDER 2);
182+
INSERT INTO main SELECT i, 'val_' || i FROM generate_series(1,100) i;
183+
INSERT INTO ref SELECT i, mod(i, 10) + 1, 'val_' || i FROM generate_series(1,1000) i;
184+
ANALYZE local_main_p0, local_main_p1, main_p2;
185+
ANALYZE local_ref_p0, local_ref_p1, ref_p2;
186+
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
187+
SELECT * from main AS a, ref AS b
188+
WHERE a.aid = b.aid AND b.bval like 'val%';
189+
QUERY PLAN
190+
--------------------------------------------------------------------
191+
Append (actual rows=1000 loops=1)
192+
AQO not used
193+
-> Foreign Scan (actual rows=400 loops=1)
194+
AQO not used
195+
Relations: (main_p0 a_1) INNER JOIN (ref_p0 b_1)
196+
-> Foreign Scan (actual rows=300 loops=1)
197+
AQO not used
198+
Relations: (main_p1 a_2) INNER JOIN (ref_p1 b_2)
199+
-> Hash Join (actual rows=300 loops=1)
200+
AQO not used
201+
Hash Cond: (b_3.aid = a_3.aid)
202+
-> Seq Scan on ref_p2 b_3 (actual rows=300 loops=1)
203+
AQO not used
204+
Filter: (bval ~~ 'val%'::text)
205+
-> Hash (actual rows=38 loops=1)
206+
Buckets: 1024 Batches: 1 Memory Usage: 10kB
207+
-> Seq Scan on main_p2 a_3 (actual rows=38 loops=1)
208+
AQO not used
209+
Using aqo: true
210+
AQO mode: LEARN
211+
JOINS: 1
212+
(21 rows)
213+
214+
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
215+
SELECT * from main AS a, ref AS b
216+
WHERE a.aid = b.aid AND b.bval like 'val%';
217+
QUERY PLAN
218+
--------------------------------------------------------------------
219+
Append (actual rows=1000 loops=1)
220+
AQO not used
221+
-> Foreign Scan (actual rows=400 loops=1)
222+
AQO: rows=400, error=0%
223+
Relations: (main_p0 a_1) INNER JOIN (ref_p0 b_1)
224+
-> Foreign Scan (actual rows=300 loops=1)
225+
AQO: rows=300, error=0%
226+
Relations: (main_p1 a_2) INNER JOIN (ref_p1 b_2)
227+
-> Hash Join (actual rows=300 loops=1)
228+
AQO: rows=300, error=0%
229+
Hash Cond: (b_3.aid = a_3.aid)
230+
-> Seq Scan on ref_p2 b_3 (actual rows=300 loops=1)
231+
AQO: rows=300, error=0%
232+
Filter: (bval ~~ 'val%'::text)
233+
-> Hash (actual rows=38 loops=1)
234+
Buckets: 1024 Batches: 1 Memory Usage: 10kB
235+
-> Seq Scan on main_p2 a_3 (actual rows=38 loops=1)
236+
AQO: rows=38, error=0%
237+
Using aqo: true
238+
AQO mode: LEARN
239+
JOINS: 1
240+
(21 rows)
241+
242+
DROP TABLE main, local_main_p0, local_main_p1;
243+
DROP TABLE ref, local_ref_p0, local_ref_p1;
244+
ALTER SERVER loopback OPTIONS (DROP fdw_tuple_cost);
245+
reset enable_partitionwise_join;
163246
-- TODO: Non-mergejoinable join condition.
164247
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
165248
SELECT * FROM frgn AS a, frgn AS b WHERE a.x<b.x;

‎sql/aqo_fdw.sql

Lines changed: 43 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,49 @@ EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
8484
SELECT*from frgn_aAS a, frgn_bAS b
8585
WHEREa.aid=b.aidANDb.bvallike'val%';
8686

87+
-- Partitioned join over foreign tables
88+
set enable_partitionwise_join=on;
89+
ALTER SERVER loopback OPTIONS (ADD fdw_tuple_cost'1.0');
90+
91+
CREATETABLElocal_main_p0(aidint, avaltext);
92+
CREATETABLElocal_main_p1(aidint, avaltext);
93+
CREATETABLEmain (aidint, avaltext) PARTITION BY HASH(aid);
94+
95+
CREATE FOREIGN TABLE main_p0 PARTITION OF main FORVALUES WITH (MODULUS3, REMAINDER0)
96+
SERVER loopback OPTIONS (table_name'local_main_p0');
97+
CREATE FOREIGN TABLE main_p1 PARTITION OF main FORVALUES WITH (MODULUS3, REMAINDER1)
98+
SERVER loopback OPTIONS (table_name'local_main_p1');
99+
CREATETABLEmain_p2 PARTITION OF main FORVALUES WITH (MODULUS3, REMAINDER2);
100+
101+
CREATETABLElocal_ref_p0(bidint, aidint, bvaltext);
102+
CREATETABLElocal_ref_p1(bidint, aidint, bvaltext);
103+
CREATETABLEref (bidint, aidint, bvaltext) PARTITION BY HASH(aid);
104+
105+
CREATE FOREIGN TABLE ref_p0 PARTITION OF ref FORVALUES WITH (MODULUS3, REMAINDER0)
106+
SERVER loopback OPTIONS (table_name'local_ref_p0');
107+
CREATE FOREIGN TABLE ref_p1 PARTITION OF ref FORVALUES WITH (MODULUS3, REMAINDER1)
108+
SERVER loopback OPTIONS (table_name'local_ref_p1');
109+
CREATETABLEref_p2 PARTITION OF ref FORVALUES WITH (MODULUS3, REMAINDER2);
110+
111+
INSERT INTO mainSELECT i,'val_'|| iFROM generate_series(1,100) i;
112+
INSERT INTO refSELECT i, mod(i,10)+1,'val_'|| iFROM generate_series(1,1000) i;
113+
114+
ANALYZE local_main_p0, local_main_p1, main_p2;
115+
ANALYZE local_ref_p0, local_ref_p1, ref_p2;
116+
117+
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
118+
SELECT*from mainAS a, refAS b
119+
WHEREa.aid=b.aidANDb.bvallike'val%';
120+
121+
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
122+
SELECT*from mainAS a, refAS b
123+
WHEREa.aid=b.aidANDb.bvallike'val%';
124+
125+
DROPTABLE main, local_main_p0, local_main_p1;
126+
DROPTABLE ref, local_ref_p0, local_ref_p1;
127+
ALTER SERVER loopback OPTIONS (DROP fdw_tuple_cost);
128+
reset enable_partitionwise_join;
129+
87130
-- TODO: Non-mergejoinable join condition.
88131
EXPLAIN (ANALYZE, COSTS OFF, SUMMARY OFF, TIMING OFF)
89132
SELECT*FROM frgnAS a, frgnAS bWHEREa.x<b.x;
@@ -97,4 +140,3 @@ DROP EXTENSION postgres_fdw CASCADE;
97140
DROPTABLE local;
98141
DROPTABLE local_b;
99142
DROPTABLE local_a;
100-

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp