@@ -6187,6 +6187,112 @@ $$);
6187
6187
1 | 1
6188
6188
(1 row)
6189
6189
6190
+ rollback to settings;
6191
+ -- Exercise rescans. We'll turn off parallel_leader_participation so
6192
+ -- that we can check that instrumentation comes back correctly.
6193
+ create table foo as select generate_series(1, 3) as id, 'xxxxx'::text as t;
6194
+ alter table foo set (parallel_workers = 0);
6195
+ create table bar as select generate_series(1, 5000) as id, 'xxxxx'::text as t;
6196
+ alter table bar set (parallel_workers = 2);
6197
+ -- multi-batch with rescan, parallel-oblivious
6198
+ savepoint settings;
6199
+ set parallel_leader_participation = off;
6200
+ set min_parallel_table_scan_size = 0;
6201
+ set parallel_setup_cost = 0;
6202
+ set parallel_tuple_cost = 0;
6203
+ set max_parallel_workers_per_gather = 2;
6204
+ set enable_material = off;
6205
+ set enable_mergejoin = off;
6206
+ set work_mem = '64kB';
6207
+ explain (costs off)
6208
+ select count(*) from foo
6209
+ left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
6210
+ on foo.id < ss.id + 1 and foo.id > ss.id - 1;
6211
+ QUERY PLAN
6212
+ --------------------------------------------------------------------------
6213
+ Aggregate
6214
+ -> Nested Loop Left Join
6215
+ Join Filter: ((foo.id < (b1.id + 1)) AND (foo.id > (b1.id - 1)))
6216
+ -> Seq Scan on foo
6217
+ -> Gather
6218
+ Workers Planned: 2
6219
+ -> Hash Join
6220
+ Hash Cond: (b1.id = b2.id)
6221
+ -> Parallel Seq Scan on bar b1
6222
+ -> Hash
6223
+ -> Seq Scan on bar b2
6224
+ (11 rows)
6225
+
6226
+ select count(*) from foo
6227
+ left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
6228
+ on foo.id < ss.id + 1 and foo.id > ss.id - 1;
6229
+ count
6230
+ -------
6231
+ 3
6232
+ (1 row)
6233
+
6234
+ select final > 1 as multibatch
6235
+ from hash_join_batches(
6236
+ $$
6237
+ select count(*) from foo
6238
+ left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
6239
+ on foo.id < ss.id + 1 and foo.id > ss.id - 1;
6240
+ $$);
6241
+ multibatch
6242
+ ------------
6243
+ t
6244
+ (1 row)
6245
+
6246
+ rollback to settings;
6247
+ -- single-batch with rescan, parallel-oblivious
6248
+ savepoint settings;
6249
+ set parallel_leader_participation = off;
6250
+ set min_parallel_table_scan_size = 0;
6251
+ set parallel_setup_cost = 0;
6252
+ set parallel_tuple_cost = 0;
6253
+ set max_parallel_workers_per_gather = 2;
6254
+ set enable_material = off;
6255
+ set enable_mergejoin = off;
6256
+ set work_mem = '4MB';
6257
+ explain (costs off)
6258
+ select count(*) from foo
6259
+ left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
6260
+ on foo.id < ss.id + 1 and foo.id > ss.id - 1;
6261
+ QUERY PLAN
6262
+ --------------------------------------------------------------------------
6263
+ Aggregate
6264
+ -> Nested Loop Left Join
6265
+ Join Filter: ((foo.id < (b1.id + 1)) AND (foo.id > (b1.id - 1)))
6266
+ -> Seq Scan on foo
6267
+ -> Gather
6268
+ Workers Planned: 2
6269
+ -> Hash Join
6270
+ Hash Cond: (b1.id = b2.id)
6271
+ -> Parallel Seq Scan on bar b1
6272
+ -> Hash
6273
+ -> Seq Scan on bar b2
6274
+ (11 rows)
6275
+
6276
+ select count(*) from foo
6277
+ left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
6278
+ on foo.id < ss.id + 1 and foo.id > ss.id - 1;
6279
+ count
6280
+ -------
6281
+ 3
6282
+ (1 row)
6283
+
6284
+ select final > 1 as multibatch
6285
+ from hash_join_batches(
6286
+ $$
6287
+ select count(*) from foo
6288
+ left join (select b1.id, b1.t from bar b1 join bar b2 using (id)) ss
6289
+ on foo.id < ss.id + 1 and foo.id > ss.id - 1;
6290
+ $$);
6291
+ multibatch
6292
+ ------------
6293
+ f
6294
+ (1 row)
6295
+
6190
6296
rollback to settings;
6191
6297
-- A full outer join where every record is matched.
6192
6298
-- non-parallel
0 commit comments