Skip to content

Commit ea8054a

Browse files
committed
add compatibility code for 9.5
1 parent 725da00 commit ea8054a

12 files changed

+502
-125
lines changed

Makefile

+2-2
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@ OBJS = src/init.o src/relation_info.o src/utils.o src/partition_filter.o \
77
src/pl_funcs.o src/pl_range_funcs.o src/pl_hash_funcs.o src/pathman_workers.o \
88
src/hooks.o src/nodes_common.o src/xact_handling.o src/utility_stmt_hooking.o \
99
src/planner_tree_modification.o src/debug_print.o src/partition_creation.o \
10-
src/compat/pg_compat.o src/compat/relation_tags.o src/compat/expand_rte_hook.o \
11-
src/compat/rowmarks_fix.o $(WIN32RES)
10+
src/compat/pg_compat.o src/compat/relation_tags.o src/compat/rowmarks_fix.o \
11+
$(WIN32RES)
1212

1313
override PG_CPPFLAGS += -I$(CURDIR)/src/include
1414

expected/pathman_rowmarks.out

+5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
1+
/*
2+
* -------------------------------------------
3+
* NOTE: This test behaves differenly on 9.5
4+
* -------------------------------------------
5+
*/
16
CREATE EXTENSION pg_pathman;
27
CREATE SCHEMA rowmarks;
38
CREATE TABLE rowmarks.first(id int NOT NULL);

expected/pathman_rowmarks_1.out

+306
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,306 @@
1+
/*
2+
* -------------------------------------------
3+
* NOTE: This test behaves differenly on 9.5
4+
* -------------------------------------------
5+
*/
6+
CREATE EXTENSION pg_pathman;
7+
CREATE SCHEMA rowmarks;
8+
CREATE TABLE rowmarks.first(id int NOT NULL);
9+
CREATE TABLE rowmarks.second(id int NOT NULL);
10+
INSERT INTO rowmarks.first SELECT generate_series(1, 10);
11+
INSERT INTO rowmarks.second SELECT generate_series(1, 10);
12+
SELECT create_hash_partitions('rowmarks.first', 'id', 5);
13+
create_hash_partitions
14+
------------------------
15+
5
16+
(1 row)
17+
18+
/* Not partitioned */
19+
SELECT * FROM rowmarks.second ORDER BY id FOR UPDATE;
20+
id
21+
----
22+
1
23+
2
24+
3
25+
4
26+
5
27+
6
28+
7
29+
8
30+
9
31+
10
32+
(10 rows)
33+
34+
/* Simple case (plan) */
35+
EXPLAIN (COSTS OFF)
36+
SELECT * FROM rowmarks.first ORDER BY id FOR UPDATE;
37+
QUERY PLAN
38+
---------------------------------------
39+
LockRows
40+
-> Sort
41+
Sort Key: first_0.id
42+
-> Append
43+
-> Seq Scan on first_0
44+
-> Seq Scan on first_1
45+
-> Seq Scan on first_2
46+
-> Seq Scan on first_3
47+
-> Seq Scan on first_4
48+
(9 rows)
49+
50+
/* Simple case (execution) */
51+
SELECT * FROM rowmarks.first ORDER BY id FOR UPDATE;
52+
id
53+
----
54+
1
55+
2
56+
3
57+
4
58+
5
59+
6
60+
7
61+
8
62+
9
63+
10
64+
(10 rows)
65+
66+
SELECT FROM rowmarks.first ORDER BY id FOR UPDATE;
67+
--
68+
(10 rows)
69+
70+
SELECT tableoid > 0 FROM rowmarks.first ORDER BY id FOR UPDATE;
71+
?column?
72+
----------
73+
t
74+
t
75+
t
76+
t
77+
t
78+
t
79+
t
80+
t
81+
t
82+
t
83+
(10 rows)
84+
85+
/* A little harder (plan) */
86+
EXPLAIN (COSTS OFF)
87+
SELECT * FROM rowmarks.first
88+
WHERE id = (SELECT id FROM rowmarks.first
89+
ORDER BY id
90+
OFFSET 10 LIMIT 1
91+
FOR UPDATE)
92+
FOR SHARE;
93+
QUERY PLAN
94+
-----------------------------------------------------
95+
LockRows
96+
InitPlan 1 (returns $1)
97+
-> Limit
98+
-> LockRows
99+
-> Sort
100+
Sort Key: first_0.id
101+
-> Append
102+
-> Seq Scan on first_0
103+
-> Seq Scan on first_1
104+
-> Seq Scan on first_2
105+
-> Seq Scan on first_3
106+
-> Seq Scan on first_4
107+
-> Custom Scan (RuntimeAppend)
108+
Prune by: (first.id = $1)
109+
-> Seq Scan on first_0 first
110+
Filter: (id = $1)
111+
-> Seq Scan on first_1 first
112+
Filter: (id = $1)
113+
-> Seq Scan on first_2 first
114+
Filter: (id = $1)
115+
-> Seq Scan on first_3 first
116+
Filter: (id = $1)
117+
-> Seq Scan on first_4 first
118+
Filter: (id = $1)
119+
(24 rows)
120+
121+
/* A little harder (execution) */
122+
SELECT * FROM rowmarks.first
123+
WHERE id = (SELECT id FROM rowmarks.first
124+
ORDER BY id
125+
OFFSET 5 LIMIT 1
126+
FOR UPDATE)
127+
FOR SHARE;
128+
id
129+
----
130+
6
131+
(1 row)
132+
133+
/* Two tables (plan) */
134+
EXPLAIN (COSTS OFF)
135+
SELECT * FROM rowmarks.first
136+
WHERE id = (SELECT id FROM rowmarks.second
137+
ORDER BY id
138+
OFFSET 5 LIMIT 1
139+
FOR UPDATE)
140+
FOR SHARE;
141+
QUERY PLAN
142+
----------------------------------------------
143+
LockRows
144+
InitPlan 1 (returns $1)
145+
-> Limit
146+
-> LockRows
147+
-> Sort
148+
Sort Key: second.id
149+
-> Seq Scan on second
150+
-> Custom Scan (RuntimeAppend)
151+
Prune by: (first.id = $1)
152+
-> Seq Scan on first_0 first
153+
Filter: (id = $1)
154+
-> Seq Scan on first_1 first
155+
Filter: (id = $1)
156+
-> Seq Scan on first_2 first
157+
Filter: (id = $1)
158+
-> Seq Scan on first_3 first
159+
Filter: (id = $1)
160+
-> Seq Scan on first_4 first
161+
Filter: (id = $1)
162+
(19 rows)
163+
164+
/* Two tables (execution) */
165+
SELECT * FROM rowmarks.first
166+
WHERE id = (SELECT id FROM rowmarks.second
167+
ORDER BY id
168+
OFFSET 5 LIMIT 1
169+
FOR UPDATE)
170+
FOR SHARE;
171+
id
172+
----
173+
6
174+
(1 row)
175+
176+
/* Check updates (plan) */
177+
SET enable_hashjoin = f; /* Hash Semi Join on 10 vs Hash Join on 9.6 */
178+
SET enable_mergejoin = f; /* Merge Semi Join on 10 vs Merge Join on 9.6 */
179+
EXPLAIN (COSTS OFF)
180+
UPDATE rowmarks.second SET id = 2
181+
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
182+
QUERY PLAN
183+
--------------------------------------
184+
Update on second
185+
-> Nested Loop Semi Join
186+
-> Seq Scan on second
187+
Filter: (id = 1)
188+
-> Materialize
189+
-> Seq Scan on first
190+
Filter: (id = 1)
191+
(7 rows)
192+
193+
EXPLAIN (COSTS OFF)
194+
UPDATE rowmarks.second SET id = 2
195+
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
196+
QUERY PLAN
197+
---------------------------------------------
198+
Update on second
199+
-> Nested Loop
200+
Join Filter: (second.id = first.id)
201+
-> HashAggregate
202+
Group Key: first.id
203+
-> Seq Scan on first
204+
Filter: (id < 1)
205+
-> Materialize
206+
-> Seq Scan on second
207+
(9 rows)
208+
209+
EXPLAIN (COSTS OFF)
210+
UPDATE rowmarks.second SET id = 2
211+
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1 OR id = 2);
212+
QUERY PLAN
213+
----------------------------------------------------
214+
Update on second
215+
-> Nested Loop Semi Join
216+
Join Filter: (second.id = first.id)
217+
-> Seq Scan on second
218+
-> Materialize
219+
-> Seq Scan on first
220+
Filter: ((id = 1) OR (id = 2))
221+
(7 rows)
222+
223+
EXPLAIN (COSTS OFF)
224+
UPDATE rowmarks.second SET id = 2
225+
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1)
226+
RETURNING *, tableoid::regclass;
227+
QUERY PLAN
228+
--------------------------------------
229+
Update on second
230+
-> Nested Loop Semi Join
231+
-> Seq Scan on second
232+
Filter: (id = 1)
233+
-> Materialize
234+
-> Seq Scan on first
235+
Filter: (id = 1)
236+
(7 rows)
237+
238+
SET enable_hashjoin = t;
239+
SET enable_mergejoin = t;
240+
/* Check updates (execution) */
241+
UPDATE rowmarks.second SET id = 1
242+
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1 OR id = 2)
243+
RETURNING *, tableoid::regclass;
244+
id | tableoid
245+
----+----------
246+
(0 rows)
247+
248+
/* Check deletes (plan) */
249+
SET enable_hashjoin = f; /* Hash Semi Join on 10 vs Hash Join on 9.6 */
250+
SET enable_mergejoin = f; /* Merge Semi Join on 10 vs Merge Join on 9.6 */
251+
EXPLAIN (COSTS OFF)
252+
DELETE FROM rowmarks.second
253+
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1);
254+
QUERY PLAN
255+
--------------------------------------
256+
Delete on second
257+
-> Nested Loop Semi Join
258+
-> Seq Scan on second
259+
Filter: (id = 1)
260+
-> Materialize
261+
-> Seq Scan on first
262+
Filter: (id = 1)
263+
(7 rows)
264+
265+
EXPLAIN (COSTS OFF)
266+
DELETE FROM rowmarks.second
267+
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id < 1);
268+
QUERY PLAN
269+
---------------------------------------------
270+
Delete on second
271+
-> Nested Loop
272+
Join Filter: (second.id = first.id)
273+
-> HashAggregate
274+
Group Key: first.id
275+
-> Seq Scan on first
276+
Filter: (id < 1)
277+
-> Materialize
278+
-> Seq Scan on second
279+
(9 rows)
280+
281+
EXPLAIN (COSTS OFF)
282+
DELETE FROM rowmarks.second
283+
WHERE rowmarks.second.id IN (SELECT id FROM rowmarks.first WHERE id = 1 OR id = 2);
284+
QUERY PLAN
285+
----------------------------------------------------
286+
Delete on second
287+
-> Nested Loop Semi Join
288+
Join Filter: (second.id = first.id)
289+
-> Seq Scan on second
290+
-> Materialize
291+
-> Seq Scan on first
292+
Filter: ((id = 1) OR (id = 2))
293+
(7 rows)
294+
295+
SET enable_hashjoin = t;
296+
SET enable_mergejoin = t;
297+
DROP SCHEMA rowmarks CASCADE;
298+
NOTICE: drop cascades to 7 other objects
299+
DETAIL: drop cascades to table rowmarks.first
300+
drop cascades to table rowmarks.second
301+
drop cascades to table rowmarks.first_0
302+
drop cascades to table rowmarks.first_1
303+
drop cascades to table rowmarks.first_2
304+
drop cascades to table rowmarks.first_3
305+
drop cascades to table rowmarks.first_4
306+
DROP EXTENSION pg_pathman;

sql/pathman_rowmarks.sql

+6
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,9 @@
1+
/*
2+
* -------------------------------------------
3+
* NOTE: This test behaves differenly on 9.5
4+
* -------------------------------------------
5+
*/
6+
17
CREATE EXTENSION pg_pathman;
28
CREATE SCHEMA rowmarks;
39

src/compat/expand_rte_hook.c

-59
This file was deleted.

0 commit comments

Comments
 (0)