Skip to content

Commit 67b56e8

Browse files
committed
Fix expected widths/explain for PG18
1 parent a48b9e6 commit 67b56e8

File tree

1 file changed

+231
-0
lines changed

1 file changed

+231
-0
lines changed
Lines changed: 231 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,231 @@
1+
SET client_min_messages=NOTICE;
2+
CREATE EXTENSION multicorn;
3+
CREATE server multicorn_srv foreign data wrapper multicorn options (
4+
wrapper 'multicorn.testfdw.TestForeignDataWrapper'
5+
);
6+
CREATE user mapping FOR current_user server multicorn_srv options (usermapping 'test');
7+
CREATE foreign table testmulticorn (
8+
test1 date,
9+
test2 timestamp
10+
) server multicorn_srv options (
11+
option1 'option1',
12+
test_type 'date',
13+
canlimit 'true',
14+
cansort 'true'
15+
);
16+
CREATE foreign table testmulticorn_nolimit(
17+
test1 date,
18+
test2 timestamp
19+
) server multicorn_srv options (
20+
option1 'option1',
21+
test_type 'date',
22+
canlimit 'false',
23+
cansort 'true'
24+
);
25+
CREATE foreign table testmulticorn_nosort(
26+
test1 date,
27+
test2 timestamp
28+
) server multicorn_srv options (
29+
option1 'option1',
30+
test_type 'date',
31+
canlimit 'true',
32+
cansort 'false'
33+
);
34+
-- Verify limit and offset are not pushed down when FWD says "no" (but still returns the 1 correct row)
35+
EXPLAIN SELECT * FROM testmulticorn_nolimit LIMIT 1 OFFSET 1;
36+
NOTICE: [('canlimit', 'false'), ('cansort', 'true'), ('option1', 'option1'), ('test_type', 'date'), ('usermapping', 'test')]
37+
NOTICE: [('test1', 'date'), ('test2', 'timestamp without time zone')]
38+
QUERY PLAN
39+
------------------------------------------------------------------------------------
40+
Limit (cost=29.50..49.00 rows=1 width=20)
41+
-> Foreign Scan on testmulticorn_nolimit (cost=10.00..400.00 rows=20 width=20)
42+
(2 rows)
43+
44+
SELECT * FROM testmulticorn_nolimit LIMIT 1 OFFSET 1;
45+
NOTICE: []
46+
NOTICE: ['test1', 'test2']
47+
test1 | test2
48+
------------+--------------------------
49+
02-03-2011 | Tue Feb 01 14:30:25 2011
50+
(1 row)
51+
52+
-- Verify limit and offset are pushed down when FWD says "yes" (returns just 1 row with proper cost)
53+
EXPLAIN SELECT * FROM testmulticorn LIMIT 1 OFFSET 1;
54+
NOTICE: [('canlimit', 'true'), ('cansort', 'true'), ('option1', 'option1'), ('test_type', 'date'), ('usermapping', 'test')]
55+
NOTICE: [('test1', 'date'), ('test2', 'timestamp without time zone')]
56+
QUERY PLAN
57+
--------------------------------------------------------------------
58+
Foreign Scan on testmulticorn (cost=10.00..20.00 rows=1 width=20)
59+
(1 row)
60+
61+
SELECT * FROM testmulticorn LIMIT 1 OFFSET 1;
62+
NOTICE: []
63+
NOTICE: ['test1', 'test2']
64+
test1 | test2
65+
------------+--------------------------
66+
02-03-2011 | Tue Feb 01 14:30:25 2011
67+
(1 row)
68+
69+
-- Verify limit and offset w/ sort not pushed down (still returns the 1 correct row)
70+
EXPLAIN SELECT * FROM testmulticorn_nolimit ORDER BY test1 LIMIT 1 OFFSET 1;
71+
QUERY PLAN
72+
------------------------------------------------------------------------------------
73+
Limit (cost=29.50..49.00 rows=1 width=20)
74+
-> Foreign Scan on testmulticorn_nolimit (cost=10.00..400.00 rows=20 width=20)
75+
(2 rows)
76+
77+
SELECT * FROM testmulticorn_nolimit ORDER BY test1 LIMIT 1 OFFSET 1;
78+
NOTICE: []
79+
NOTICE: ['test1', 'test2']
80+
NOTICE: requested sort(s):
81+
NOTICE: SortKey(attname='test1', attnum=1, is_reversed=False, nulls_first=False, collate=None)
82+
test1 | test2
83+
------------+--------------------------
84+
01-01-2011 | Sun Jan 02 14:30:25 2011
85+
(1 row)
86+
87+
-- Verify limit and offset w/ sort are pushed down (returns just 1 row with proper cost)
88+
EXPLAIN SELECT * FROM testmulticorn ORDER BY test1 LIMIT 1 OFFSET 1;
89+
QUERY PLAN
90+
--------------------------------------------------------------------
91+
Foreign Scan on testmulticorn (cost=10.00..20.00 rows=1 width=20)
92+
(1 row)
93+
94+
SELECT * FROM testmulticorn ORDER BY test1 LIMIT 1 OFFSET 1;
95+
NOTICE: []
96+
NOTICE: ['test1', 'test2']
97+
NOTICE: requested sort(s):
98+
NOTICE: SortKey(attname='test1', attnum=1, is_reversed=False, nulls_first=False, collate=None)
99+
test1 | test2
100+
------------+--------------------------
101+
01-01-2011 | Sun Jan 02 14:30:25 2011
102+
(1 row)
103+
104+
-- Verify limit and offset are not pushed when sort is not pushed down
105+
EXPLAIN SELECT * FROM testmulticorn_nosort ORDER BY test1 LIMIT 1 OFFSET 1;
106+
NOTICE: [('canlimit', 'true'), ('cansort', 'false'), ('option1', 'option1'), ('test_type', 'date'), ('usermapping', 'test')]
107+
NOTICE: [('test1', 'date'), ('test2', 'timestamp without time zone')]
108+
QUERY PLAN
109+
-----------------------------------------------------------------------------------------
110+
Limit (cost=400.20..400.20 rows=1 width=20)
111+
-> Sort (cost=400.20..400.25 rows=20 width=20)
112+
Sort Key: test1
113+
-> Foreign Scan on testmulticorn_nosort (cost=10.00..400.00 rows=20 width=20)
114+
(4 rows)
115+
116+
SELECT * FROM testmulticorn_nosort ORDER BY test1 LIMIT 1 OFFSET 1;
117+
NOTICE: []
118+
NOTICE: ['test1', 'test2']
119+
test1 | test2
120+
------------+--------------------------
121+
01-01-2011 | Sun Jan 02 14:30:25 2011
122+
(1 row)
123+
124+
-- Verify limit and offset are not pushed when sort is partially pushed down
125+
EXPLAIN SELECT * FROM testmulticorn ORDER BY test1, test2 LIMIT 1 OFFSET 1;
126+
QUERY PLAN
127+
----------------------------------------------------------------------------------
128+
Limit (cost=48.08..66.65 rows=1 width=20)
129+
-> Incremental Sort (cost=29.51..400.90 rows=20 width=20)
130+
Sort Key: test1, test2
131+
Presorted Key: test1
132+
-> Foreign Scan on testmulticorn (cost=10.00..400.00 rows=20 width=20)
133+
(5 rows)
134+
135+
SELECT * FROM testmulticorn ORDER BY test1, test2 LIMIT 1 OFFSET 1;
136+
NOTICE: []
137+
NOTICE: ['test1', 'test2']
138+
NOTICE: requested sort(s):
139+
NOTICE: SortKey(attname='test1', attnum=1, is_reversed=False, nulls_first=False, collate=None)
140+
test1 | test2
141+
------------+--------------------------
142+
01-01-2011 | Sun Jan 02 14:30:25 2011
143+
(1 row)
144+
145+
-- Verify limit and offset are not pushed down with where (which we may eventually support in the future)
146+
EXPLAIN SELECT * FROM testmulticorn WHERE test1 = '02-03-2011' LIMIT 1 OFFSET 1;
147+
QUERY PLAN
148+
----------------------------------------------------------------------------
149+
Limit (cost=29.50..49.00 rows=1 width=20)
150+
-> Foreign Scan on testmulticorn (cost=10.00..400.00 rows=20 width=20)
151+
Filter: (test1 = '02-03-2011'::date)
152+
(3 rows)
153+
154+
SELECT * FROM testmulticorn WHERE test1 = '02-03-2011' LIMIT 1 OFFSET 1;
155+
NOTICE: [test1 = 2011-02-03]
156+
NOTICE: ['test1', 'test2']
157+
test1 | test2
158+
------------+--------------------------
159+
02-03-2011 | Tue Feb 01 14:30:25 2011
160+
(1 row)
161+
162+
-- Verify limit and offset are not pushed down with group by
163+
EXPLAIN SELECT max(test1) FROM testmulticorn GROUP BY test1 LIMIT 1 OFFSET 1;
164+
QUERY PLAN
165+
----------------------------------------------------------------------------------
166+
Limit (cost=19.52..29.03 rows=1 width=8)
167+
-> GroupAggregate (cost=10.00..200.30 rows=20 width=8)
168+
Group Key: test1
169+
-> Foreign Scan on testmulticorn (cost=10.00..200.00 rows=20 width=10)
170+
(4 rows)
171+
172+
SELECT max(test1) FROM testmulticorn GROUP BY test1 LIMIT 1 OFFSET 1;
173+
NOTICE: []
174+
NOTICE: ['test1']
175+
NOTICE: requested sort(s):
176+
NOTICE: SortKey(attname='test1', attnum=1, is_reversed=False, nulls_first=False, collate=None)
177+
max
178+
------------
179+
02-03-2011
180+
(1 row)
181+
182+
-- Verify limit and offset are not pushed down with window functions
183+
EXPLAIN SELECT max(test1) OVER (ORDER BY test1) FROM testmulticorn LIMIT 1 OFFSET 1;
184+
QUERY PLAN
185+
----------------------------------------------------------------------------------
186+
Limit (cost=28.55..37.59 rows=1 width=8)
187+
-> WindowAgg (cost=19.52..200.30 rows=20 width=8)
188+
Window: w1 AS (ORDER BY test1)
189+
-> Foreign Scan on testmulticorn (cost=10.00..200.00 rows=20 width=10)
190+
(4 rows)
191+
192+
SELECT max(test1) OVER (ORDER BY test1) FROM testmulticorn LIMIT 1 OFFSET 1;
193+
NOTICE: []
194+
NOTICE: ['test1']
195+
NOTICE: requested sort(s):
196+
NOTICE: SortKey(attname='test1', attnum=1, is_reversed=False, nulls_first=False, collate=None)
197+
max
198+
------------
199+
01-01-2011
200+
(1 row)
201+
202+
-- Verify limit and offset are not pushed down with joins
203+
-- TODO: optimize by pushing down limit/offset on one side of the join
204+
EXPLAIN SELECT * FROM testmulticorn m1 JOIN testmulticorn m2 ON m1.test1 = m2.test1 LIMIT 1 OFFSET 1;
205+
QUERY PLAN
206+
-------------------------------------------------------------------------------------------
207+
Limit (cost=59.30..98.61 rows=1 width=24)
208+
-> Nested Loop (cost=20.00..806.05 rows=20 width=24)
209+
Join Filter: (m1.test1 = m2.test1)
210+
-> Foreign Scan on testmulticorn m1 (cost=10.00..400.00 rows=20 width=20)
211+
-> Materialize (cost=10.00..400.10 rows=20 width=20)
212+
-> Foreign Scan on testmulticorn m2 (cost=10.00..400.00 rows=20 width=20)
213+
(6 rows)
214+
215+
SELECT * FROM testmulticorn m1 JOIN testmulticorn m2 ON m1.test1 = m2.test1 LIMIT 1 OFFSET 1;
216+
NOTICE: []
217+
NOTICE: ['test1', 'test2']
218+
NOTICE: []
219+
NOTICE: ['test1', 'test2']
220+
test1 | test2 | test1 | test2
221+
------------+--------------------------+------------+--------------------------
222+
01-01-2011 | Sun Jan 02 14:30:25 2011 | 01-01-2011 | Sun Jan 02 14:30:25 2011
223+
(1 row)
224+
225+
DROP USER MAPPING FOR current_user SERVER multicorn_srv;
226+
DROP EXTENSION multicorn cascade;
227+
NOTICE: drop cascades to 4 other objects
228+
DETAIL: drop cascades to server multicorn_srv
229+
drop cascades to foreign table testmulticorn
230+
drop cascades to foreign table testmulticorn_nolimit
231+
drop cascades to foreign table testmulticorn_nosort

0 commit comments

Comments
 (0)