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

Commitea8054a

Browse files
committed
add compatibility code for 9.5
1 parent725da00 commitea8054a

12 files changed

+502
-125
lines changed

‎Makefile

Lines changed: 2 additions & 2 deletions
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
overridePG_CPPFLAGS += -I$(CURDIR)/src/include
1414

‎expected/pathman_rowmarks.out

Lines changed: 5 additions & 0 deletions
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

Lines changed: 306 additions & 0 deletions
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

Lines changed: 6 additions & 0 deletions
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
CREATESCHEMArowmarks;
39

‎src/compat/expand_rte_hook.c

Lines changed: 0 additions & 59 deletions
This file was deleted.

0 commit comments

Comments
 (0)

[8]ページ先頭

©2009-2025 Movatter.jp