OSDN Git Service

Add a regression about forcing gather-merge.
[pghintplan/pg_hint_plan.git] / expected / ut-W.out
1 LOAD 'pg_hint_plan';
2 ALTER SYSTEM SET session_preload_libraries TO 'pg_hint_plan';
3 SET pg_hint_plan.enable_hint TO on;
4 SET pg_hint_plan.debug_print TO on;
5 SET client_min_messages TO LOG;
6 CREATE TABLE s1.tl (a int);
7 INSERT INTO s1.tl (SELECT a FROM generate_series(0, 100000) a);
8 -- Queries on ordinary tables with default setting
9 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
10    QUERY PLAN   
11 ----------------
12  Seq Scan on t1
13 (1 row)
14
15 SET parallel_setup_cost to 0;
16 SET parallel_tuple_cost to 0;
17 SET min_parallel_table_scan_size to 0;
18 SET min_parallel_index_scan_size to 0;
19 SET max_parallel_workers_per_gather to DEFAULT;
20 /*+Parallel(t1 8)*/
21 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
22 LOG:  pg_hint_plan:
23 used hint:
24 Parallel(t1 8 soft)
25 not used hint:
26 duplication hint:
27 error hint:
28
29           QUERY PLAN           
30 -------------------------------
31  Gather
32    Workers Planned: 2
33    ->  Parallel Seq Scan on t1
34 (3 rows)
35
36 /*+Parallel(t1 8 soft)*/
37 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
38 LOG:  pg_hint_plan:
39 used hint:
40 Parallel(t1 8 soft)
41 not used hint:
42 duplication hint:
43 error hint:
44
45           QUERY PLAN           
46 -------------------------------
47  Gather
48    Workers Planned: 2
49    ->  Parallel Seq Scan on t1
50 (3 rows)
51
52 /*+Parallel(t1 8 hard)*/
53 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
54 LOG:  pg_hint_plan:
55 used hint:
56 Parallel(t1 8 hard)
57 not used hint:
58 duplication hint:
59 error hint:
60
61           QUERY PLAN           
62 -------------------------------
63  Gather
64    Workers Planned: 8
65    ->  Parallel Seq Scan on t1
66 (3 rows)
67
68 /*+Parallel(t1 4 hard) */ /* to be gather merge*/
69 EXPLAIN (COSTS false) SELECT * FROM s1.t1 ORDER BY s1.t1.c1 LIMIT 4;
70 LOG:  pg_hint_plan:
71 used hint:
72 Parallel(t1 4 hard)
73 not used hint:
74 duplication hint:
75 error hint:
76
77                     QUERY PLAN                     
78 ---------------------------------------------------
79  Limit
80    ->  Gather Merge
81          Workers Planned: 4
82          ->  Parallel Index Scan using t1_i1 on t1
83 (4 rows)
84
85 -- Queries on inheritance tables
86 SET parallel_setup_cost to 0;
87 SET parallel_tuple_cost to 0;
88 SET min_parallel_table_scan_size to 0;
89 SET min_parallel_index_scan_size to 0;
90 /*+Parallel(p1 8)*/
91 EXPLAIN (COSTS false) SELECT * FROM p1;
92 LOG:  pg_hint_plan:
93 used hint:
94 Parallel(p1 8 soft)
95 not used hint:
96 duplication hint:
97 error hint:
98
99                 QUERY PLAN                 
100 -------------------------------------------
101  Gather
102    Workers Planned: 1
103    ->  Append
104          ->  Parallel Seq Scan on p1
105          ->  Parallel Seq Scan on p1_c1
106          ->  Parallel Seq Scan on p1_c2
107          ->  Parallel Seq Scan on p1_c3
108          ->  Parallel Seq Scan on p1_c4
109          ->  Parallel Seq Scan on p1_c1_c1
110          ->  Parallel Seq Scan on p1_c1_c2
111          ->  Parallel Seq Scan on p1_c3_c1
112          ->  Parallel Seq Scan on p1_c3_c2
113 (12 rows)
114
115 SET parallel_setup_cost to DEFAULT;
116 SET parallel_tuple_cost to DEFAULT;
117 SET min_parallel_table_scan_size to DEFAULT;
118 SET min_parallel_index_scan_size to DEFAULT;
119 /*+Parallel(p1 8 hard)*/
120 EXPLAIN (COSTS false) SELECT * FROM p1;
121 LOG:  pg_hint_plan:
122 used hint:
123 Parallel(p1 8 hard)
124 not used hint:
125 duplication hint:
126 error hint:
127
128                 QUERY PLAN                 
129 -------------------------------------------
130  Gather
131    Workers Planned: 8
132    ->  Append
133          ->  Parallel Seq Scan on p1
134          ->  Parallel Seq Scan on p1_c1
135          ->  Parallel Seq Scan on p1_c2
136          ->  Parallel Seq Scan on p1_c3
137          ->  Parallel Seq Scan on p1_c4
138          ->  Parallel Seq Scan on p1_c1_c1
139          ->  Parallel Seq Scan on p1_c1_c2
140          ->  Parallel Seq Scan on p1_c3_c1
141          ->  Parallel Seq Scan on p1_c3_c2
142 (12 rows)
143
144 -- hinting on children makes the whole inheritance parallel
145 /*+Parallel(p1_c1 8 hard)*/
146 EXPLAIN (COSTS false) SELECT * FROM p1;
147 LOG:  pg_hint_plan:
148 used hint:
149 Parallel(p1_c1 8 hard)
150 not used hint:
151 duplication hint:
152 error hint:
153
154                 QUERY PLAN                 
155 -------------------------------------------
156  Gather
157    Workers Planned: 8
158    ->  Append
159          ->  Parallel Seq Scan on p1
160          ->  Parallel Seq Scan on p1_c1
161          ->  Parallel Seq Scan on p1_c2
162          ->  Parallel Seq Scan on p1_c3
163          ->  Parallel Seq Scan on p1_c4
164          ->  Parallel Seq Scan on p1_c1_c1
165          ->  Parallel Seq Scan on p1_c1_c2
166          ->  Parallel Seq Scan on p1_c3_c1
167          ->  Parallel Seq Scan on p1_c3_c2
168 (12 rows)
169
170 -- Joins
171 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
172                 QUERY PLAN                
173 ------------------------------------------
174  Hash Join
175    Hash Cond: (p1_c1_c1.id = p2_c1_c1.id)
176    ->  Seq Scan on p1_c1_c1
177    ->  Hash
178          ->  Seq Scan on p2_c1_c1
179 (5 rows)
180
181 /*+Parallel(p1_c1_c1 8 hard)*/
182 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
183 LOG:  pg_hint_plan:
184 used hint:
185 Parallel(p1_c1_c1 8 hard)
186 not used hint:
187 duplication hint:
188 error hint:
189
190                    QUERY PLAN                    
191 -------------------------------------------------
192  Hash Join
193    Hash Cond: (p2_c1_c1.id = p1_c1_c1.id)
194    ->  Seq Scan on p2_c1_c1
195    ->  Hash
196          ->  Gather
197                Workers Planned: 8
198                ->  Parallel Seq Scan on p1_c1_c1
199 (7 rows)
200
201 SET parallel_setup_cost to 0;
202 SET parallel_tuple_cost to 0;
203 SET min_parallel_table_scan_size to 0;
204 SET min_parallel_index_scan_size to 0;
205 /*+Parallel(p1_c1_c1 8 soft) Parallel(p2_c1_c1 0)*/
206 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
207 LOG:  pg_hint_plan:
208 used hint:
209 Parallel(p1_c1_c1 8 soft)
210 Parallel(p2_c1_c1 0 soft)
211 not used hint:
212 duplication hint:
213 error hint:
214
215                    QUERY PLAN                   
216 ------------------------------------------------
217  Gather
218    Workers Planned: 1
219    ->  Hash Join
220          Hash Cond: (p1_c1_c1.id = p2_c1_c1.id)
221          ->  Parallel Seq Scan on p1_c1_c1
222          ->  Hash
223                ->  Seq Scan on p2_c1_c1
224 (7 rows)
225
226 /*+Parallel(p1_c1_c1 8 hard) Parallel(p2_c1_c1 0)*/
227 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
228 LOG:  pg_hint_plan:
229 used hint:
230 Parallel(p1_c1_c1 8 hard)
231 Parallel(p2_c1_c1 0 soft)
232 not used hint:
233 duplication hint:
234 error hint:
235
236                    QUERY PLAN                   
237 ------------------------------------------------
238  Gather
239    Workers Planned: 8
240    ->  Hash Join
241          Hash Cond: (p1_c1_c1.id = p2_c1_c1.id)
242          ->  Parallel Seq Scan on p1_c1_c1
243          ->  Hash
244                ->  Seq Scan on p2_c1_c1
245 (7 rows)
246
247 /*+Parallel(p1_c1_c1 8 hard) Parallel(p2_c1_c1 8 hard)*/
248 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
249 LOG:  pg_hint_plan:
250 used hint:
251 Parallel(p1_c1_c1 8 hard)
252 Parallel(p2_c1_c1 8 hard)
253 not used hint:
254 duplication hint:
255 error hint:
256
257                    QUERY PLAN                    
258 -------------------------------------------------
259  Hash Join
260    Hash Cond: (p1_c1_c1.id = p2_c1_c1.id)
261    ->  Gather
262          Workers Planned: 8
263          ->  Parallel Seq Scan on p1_c1_c1
264    ->  Hash
265          ->  Gather
266                Workers Planned: 8
267                ->  Parallel Seq Scan on p2_c1_c1
268 (9 rows)
269
270 -- Joins on inheritance tables
271 SET parallel_setup_cost to 0;
272 SET parallel_tuple_cost to 0;
273 SET min_parallel_table_scan_size to 0;
274 SET min_parallel_index_scan_size to 0;
275 /*+Parallel(p1 8)*/
276 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
277 LOG:  pg_hint_plan:
278 used hint:
279 Parallel(p1 8 soft)
280 not used hint:
281 duplication hint:
282 error hint:
283
284                    QUERY PLAN                    
285 -------------------------------------------------
286  Gather
287    Workers Planned: 1
288    ->  Hash Join
289          Hash Cond: (p1.id = p2.id)
290          ->  Append
291                ->  Parallel Seq Scan on p1
292                ->  Parallel Seq Scan on p1_c1
293                ->  Parallel Seq Scan on p1_c2
294                ->  Parallel Seq Scan on p1_c3
295                ->  Parallel Seq Scan on p1_c4
296                ->  Parallel Seq Scan on p1_c1_c1
297                ->  Parallel Seq Scan on p1_c1_c2
298                ->  Parallel Seq Scan on p1_c3_c1
299                ->  Parallel Seq Scan on p1_c3_c2
300          ->  Hash
301                ->  Append
302                      ->  Seq Scan on p2
303                      ->  Seq Scan on p2_c1
304                      ->  Seq Scan on p2_c2
305                      ->  Seq Scan on p2_c3
306                      ->  Seq Scan on p2_c4
307                      ->  Seq Scan on p2_c1_c1
308                      ->  Seq Scan on p2_c1_c2
309                      ->  Seq Scan on p2_c3_c1
310                      ->  Seq Scan on p2_c3_c2
311 (25 rows)
312
313 /*+Parallel(p1 8)Parallel(p2 0)*/
314 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
315 LOG:  pg_hint_plan:
316 used hint:
317 Parallel(p1 8 soft)
318 Parallel(p2 0 soft)
319 not used hint:
320 duplication hint:
321 error hint:
322
323                    QUERY PLAN                    
324 -------------------------------------------------
325  Gather
326    Workers Planned: 1
327    ->  Hash Join
328          Hash Cond: (p1.id = p2.id)
329          ->  Append
330                ->  Parallel Seq Scan on p1
331                ->  Parallel Seq Scan on p1_c1
332                ->  Parallel Seq Scan on p1_c2
333                ->  Parallel Seq Scan on p1_c3
334                ->  Parallel Seq Scan on p1_c4
335                ->  Parallel Seq Scan on p1_c1_c1
336                ->  Parallel Seq Scan on p1_c1_c2
337                ->  Parallel Seq Scan on p1_c3_c1
338                ->  Parallel Seq Scan on p1_c3_c2
339          ->  Hash
340                ->  Append
341                      ->  Seq Scan on p2
342                      ->  Seq Scan on p2_c1
343                      ->  Seq Scan on p2_c2
344                      ->  Seq Scan on p2_c3
345                      ->  Seq Scan on p2_c4
346                      ->  Seq Scan on p2_c1_c1
347                      ->  Seq Scan on p2_c1_c2
348                      ->  Seq Scan on p2_c3_c1
349                      ->  Seq Scan on p2_c3_c2
350 (25 rows)
351
352 SET parallel_setup_cost to DEFAULT;
353 SET parallel_tuple_cost to DEFAULT;
354 SET min_parallel_table_scan_size to DEFAULT;
355 SET min_parallel_index_scan_size to DEFAULT;
356 /*+Parallel(p2 8 soft)*/
357 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
358 LOG:  pg_hint_plan:
359 used hint:
360 Parallel(p2 8 soft)
361 not used hint:
362 duplication hint:
363 error hint:
364
365                    QUERY PLAN                    
366 -------------------------------------------------
367  Gather
368    Workers Planned: 1
369    ->  Hash Join
370          Hash Cond: (p2.id = p1.id)
371          ->  Append
372                ->  Parallel Seq Scan on p2
373                ->  Parallel Seq Scan on p2_c1
374                ->  Parallel Seq Scan on p2_c2
375                ->  Parallel Seq Scan on p2_c3
376                ->  Parallel Seq Scan on p2_c4
377                ->  Parallel Seq Scan on p2_c1_c1
378                ->  Parallel Seq Scan on p2_c1_c2
379                ->  Parallel Seq Scan on p2_c3_c1
380                ->  Parallel Seq Scan on p2_c3_c2
381          ->  Hash
382                ->  Append
383                      ->  Seq Scan on p1
384                      ->  Seq Scan on p1_c1
385                      ->  Seq Scan on p1_c2
386                      ->  Seq Scan on p1_c3
387                      ->  Seq Scan on p1_c4
388                      ->  Seq Scan on p1_c1_c1
389                      ->  Seq Scan on p1_c1_c2
390                      ->  Seq Scan on p1_c3_c1
391                      ->  Seq Scan on p1_c3_c2
392 (25 rows)
393
394 /*+Parallel(p2 8 hard)*/
395 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
396 LOG:  pg_hint_plan:
397 used hint:
398 Parallel(p2 8 hard)
399 not used hint:
400 duplication hint:
401 error hint:
402
403                    QUERY PLAN                    
404 -------------------------------------------------
405  Gather
406    Workers Planned: 8
407    ->  Hash Join
408          Hash Cond: (p2.id = p1.id)
409          ->  Append
410                ->  Parallel Seq Scan on p2
411                ->  Parallel Seq Scan on p2_c1
412                ->  Parallel Seq Scan on p2_c2
413                ->  Parallel Seq Scan on p2_c3
414                ->  Parallel Seq Scan on p2_c4
415                ->  Parallel Seq Scan on p2_c1_c1
416                ->  Parallel Seq Scan on p2_c1_c2
417                ->  Parallel Seq Scan on p2_c3_c1
418                ->  Parallel Seq Scan on p2_c3_c2
419          ->  Hash
420                ->  Append
421                      ->  Seq Scan on p1
422                      ->  Seq Scan on p1_c1
423                      ->  Seq Scan on p1_c2
424                      ->  Seq Scan on p1_c3
425                      ->  Seq Scan on p1_c4
426                      ->  Seq Scan on p1_c1_c1
427                      ->  Seq Scan on p1_c1_c2
428                      ->  Seq Scan on p1_c3_c1
429                      ->  Seq Scan on p1_c3_c2
430 (25 rows)
431
432 /*+Parallel(p2 8 hard) Parallel(p1 5 hard) */
433 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
434 LOG:  pg_hint_plan:
435 used hint:
436 Parallel(p1 5 hard)
437 Parallel(p2 8 hard)
438 not used hint:
439 duplication hint:
440 error hint:
441
442                       QUERY PLAN                       
443 -------------------------------------------------------
444  Hash Join
445    Hash Cond: (p1.id = p2.id)
446    ->  Gather
447          Workers Planned: 5
448          ->  Append
449                ->  Parallel Seq Scan on p1
450                ->  Parallel Seq Scan on p1_c1
451                ->  Parallel Seq Scan on p1_c2
452                ->  Parallel Seq Scan on p1_c3
453                ->  Parallel Seq Scan on p1_c4
454                ->  Parallel Seq Scan on p1_c1_c1
455                ->  Parallel Seq Scan on p1_c1_c2
456                ->  Parallel Seq Scan on p1_c3_c1
457                ->  Parallel Seq Scan on p1_c3_c2
458    ->  Hash
459          ->  Gather
460                Workers Planned: 8
461                ->  Append
462                      ->  Parallel Seq Scan on p2
463                      ->  Parallel Seq Scan on p2_c1
464                      ->  Parallel Seq Scan on p2_c2
465                      ->  Parallel Seq Scan on p2_c3
466                      ->  Parallel Seq Scan on p2_c4
467                      ->  Parallel Seq Scan on p2_c1_c1
468                      ->  Parallel Seq Scan on p2_c1_c2
469                      ->  Parallel Seq Scan on p2_c3_c1
470                      ->  Parallel Seq Scan on p2_c3_c2
471 (27 rows)
472
473 -- Mixture with a scan hint
474 -- p1 can be parallel
475 /*+Parallel(p1 8 hard) IndexScan(p2) */
476 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
477 LOG:  pg_hint_plan:
478 used hint:
479 IndexScan(p2)
480 Parallel(p1 8 hard)
481 not used hint:
482 duplication hint:
483 error hint:
484
485                           QUERY PLAN                          
486 --------------------------------------------------------------
487  Hash Join
488    Hash Cond: (p2.id = p1.id)
489    ->  Append
490          ->  Index Scan using p2_id2_val on p2
491          ->  Index Scan using p2_c1_id2_val on p2_c1
492          ->  Index Scan using p2_c2_id2_val on p2_c2
493          ->  Index Scan using p2_c3_id_val_idx on p2_c3
494          ->  Index Scan using p2_c4_id_val_idx on p2_c4
495          ->  Index Scan using p2_c1_c1_id_val_idx on p2_c1_c1
496          ->  Index Scan using p2_c1_c2_id_val_idx on p2_c1_c2
497          ->  Index Scan using p2_c3_c1_id_val_idx on p2_c3_c1
498          ->  Index Scan using p2_c3_c2_id_val_idx on p2_c3_c2
499    ->  Hash
500          ->  Gather
501                Workers Planned: 8
502                ->  Append
503                      ->  Parallel Seq Scan on p1
504                      ->  Parallel Seq Scan on p1_c1
505                      ->  Parallel Seq Scan on p1_c2
506                      ->  Parallel Seq Scan on p1_c3
507                      ->  Parallel Seq Scan on p1_c4
508                      ->  Parallel Seq Scan on p1_c1_c1
509                      ->  Parallel Seq Scan on p1_c1_c2
510                      ->  Parallel Seq Scan on p1_c3_c1
511                      ->  Parallel Seq Scan on p1_c3_c2
512 (25 rows)
513
514 -- Parallel sequential scan
515 /*+Parallel(p1 8 hard) SeqScan(p1) */
516 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
517 LOG:  pg_hint_plan:
518 used hint:
519 SeqScan(p1)
520 Parallel(p1 8 hard)
521 not used hint:
522 duplication hint:
523 error hint:
524
525                    QUERY PLAN                    
526 -------------------------------------------------
527  Gather
528    Workers Planned: 8
529    ->  Hash Join
530          Hash Cond: (p1.id = p2.id)
531          ->  Append
532                ->  Parallel Seq Scan on p1
533                ->  Parallel Seq Scan on p1_c1
534                ->  Parallel Seq Scan on p1_c2
535                ->  Parallel Seq Scan on p1_c3
536                ->  Parallel Seq Scan on p1_c4
537                ->  Parallel Seq Scan on p1_c1_c1
538                ->  Parallel Seq Scan on p1_c1_c2
539                ->  Parallel Seq Scan on p1_c3_c1
540                ->  Parallel Seq Scan on p1_c3_c2
541          ->  Hash
542                ->  Append
543                      ->  Seq Scan on p2
544                      ->  Seq Scan on p2_c1
545                      ->  Seq Scan on p2_c2
546                      ->  Seq Scan on p2_c3
547                      ->  Seq Scan on p2_c4
548                      ->  Seq Scan on p2_c1_c1
549                      ->  Seq Scan on p2_c1_c2
550                      ->  Seq Scan on p2_c3_c1
551                      ->  Seq Scan on p2_c3_c2
552 (25 rows)
553
554 -- Parallel index scan
555 /*+Parallel(p1 8 hard) IndexScan(p1) */
556 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
557 LOG:  pg_hint_plan:
558 used hint:
559 IndexScan(p1)
560 Parallel(p1 8 hard)
561 not used hint:
562 duplication hint:
563 error hint:
564
565                               QUERY PLAN                               
566 -----------------------------------------------------------------------
567  Gather
568    Workers Planned: 8
569    ->  Hash Join
570          Hash Cond: (p1.id = p2.id)
571          ->  Append
572                ->  Parallel Index Scan using p1_pkey on p1
573                ->  Parallel Index Scan using p1_c1_pkey on p1_c1
574                ->  Parallel Index Scan using p1_c2_pkey on p1_c2
575                ->  Parallel Index Scan using p1_c3_pkey on p1_c3
576                ->  Parallel Index Scan using p1_c4_pkey on p1_c4
577                ->  Parallel Index Scan using p1_c1_c1_pkey on p1_c1_c1
578                ->  Parallel Index Scan using p1_c1_c2_pkey on p1_c1_c2
579                ->  Parallel Index Scan using p1_c3_c1_pkey on p1_c3_c1
580                ->  Parallel Index Scan using p1_c3_c2_pkey on p1_c3_c2
581          ->  Hash
582                ->  Append
583                      ->  Seq Scan on p2
584                      ->  Seq Scan on p2_c1
585                      ->  Seq Scan on p2_c2
586                      ->  Seq Scan on p2_c3
587                      ->  Seq Scan on p2_c4
588                      ->  Seq Scan on p2_c1_c1
589                      ->  Seq Scan on p2_c1_c2
590                      ->  Seq Scan on p2_c3_c1
591                      ->  Seq Scan on p2_c3_c2
592 (25 rows)
593
594 -- This hint doesn't turn on parallel, so the Parallel hint is ignored
595 set max_parallel_workers_per_gather TO 0;
596 /*+Parallel(p1 0 hard) IndexScan(p1) */
597 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
598 LOG:  pg_hint_plan:
599 used hint:
600 IndexScan(p1)
601 not used hint:
602 Parallel(p1 0 hard)
603 duplication hint:
604 error hint:
605
606                        QUERY PLAN                       
607 --------------------------------------------------------
608  Hash Join
609    Hash Cond: (p1.id = p2.id)
610    ->  Append
611          ->  Index Scan using p1_pkey on p1
612          ->  Index Scan using p1_c1_pkey on p1_c1
613          ->  Index Scan using p1_c2_pkey on p1_c2
614          ->  Index Scan using p1_c3_pkey on p1_c3
615          ->  Index Scan using p1_c4_pkey on p1_c4
616          ->  Index Scan using p1_c1_c1_pkey on p1_c1_c1
617          ->  Index Scan using p1_c1_c2_pkey on p1_c1_c2
618          ->  Index Scan using p1_c3_c1_pkey on p1_c3_c1
619          ->  Index Scan using p1_c3_c2_pkey on p1_c3_c2
620    ->  Hash
621          ->  Append
622                ->  Seq Scan on p2
623                ->  Seq Scan on p2_c1
624                ->  Seq Scan on p2_c2
625                ->  Seq Scan on p2_c3
626                ->  Seq Scan on p2_c4
627                ->  Seq Scan on p2_c1_c1
628                ->  Seq Scan on p2_c1_c2
629                ->  Seq Scan on p2_c3_c1
630                ->  Seq Scan on p2_c3_c2
631 (23 rows)
632
633 -- Parallel on UNION
634 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
635          QUERY PLAN         
636 ----------------------------
637  Append
638    ->  Seq Scan on p1
639    ->  Seq Scan on p1_c1
640    ->  Seq Scan on p1_c2
641    ->  Seq Scan on p1_c3
642    ->  Seq Scan on p1_c4
643    ->  Seq Scan on p1_c1_c1
644    ->  Seq Scan on p1_c1_c2
645    ->  Seq Scan on p1_c3_c1
646    ->  Seq Scan on p1_c3_c2
647    ->  Seq Scan on p2
648    ->  Seq Scan on p2_c1
649    ->  Seq Scan on p2_c2
650    ->  Seq Scan on p2_c3
651    ->  Seq Scan on p2_c4
652    ->  Seq Scan on p2_c1_c1
653    ->  Seq Scan on p2_c1_c2
654    ->  Seq Scan on p2_c3_c1
655    ->  Seq Scan on p2_c3_c2
656 (19 rows)
657
658 -- parallel hinting on any relation enables parallel
659 SET parallel_setup_cost to 0;
660 SET parallel_tuple_cost to 0;
661 SET min_parallel_table_scan_size to 0;
662 SET min_parallel_index_scan_size to 0;
663 SET max_parallel_workers_per_gather to 0;
664 /*+Parallel(p1 8) */
665 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
666 LOG:  pg_hint_plan:
667 used hint:
668 Parallel(p1 8 soft)
669 not used hint:
670 duplication hint:
671 error hint:
672
673                 QUERY PLAN                 
674 -------------------------------------------
675  Gather
676    Workers Planned: 1
677    ->  Append
678          ->  Parallel Seq Scan on p1
679          ->  Parallel Seq Scan on p1_c1
680          ->  Parallel Seq Scan on p1_c2
681          ->  Parallel Seq Scan on p1_c3
682          ->  Parallel Seq Scan on p1_c4
683          ->  Parallel Seq Scan on p1_c1_c1
684          ->  Parallel Seq Scan on p1_c1_c2
685          ->  Parallel Seq Scan on p1_c3_c1
686          ->  Parallel Seq Scan on p1_c3_c2
687          ->  Parallel Seq Scan on p2
688          ->  Parallel Seq Scan on p2_c1
689          ->  Parallel Seq Scan on p2_c2
690          ->  Parallel Seq Scan on p2_c3
691          ->  Parallel Seq Scan on p2_c4
692          ->  Parallel Seq Scan on p2_c1_c1
693          ->  Parallel Seq Scan on p2_c1_c2
694          ->  Parallel Seq Scan on p2_c3_c1
695          ->  Parallel Seq Scan on p2_c3_c2
696 (21 rows)
697
698 -- set hint does the same thing
699 /*+Set(max_parallel_workers_per_gather 1)*/
700 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
701 LOG:  pg_hint_plan:
702 used hint:
703 Set(max_parallel_workers_per_gather 1)
704 not used hint:
705 duplication hint:
706 error hint:
707
708                 QUERY PLAN                 
709 -------------------------------------------
710  Gather
711    Workers Planned: 1
712    ->  Append
713          ->  Parallel Seq Scan on p1
714          ->  Parallel Seq Scan on p1_c1
715          ->  Parallel Seq Scan on p1_c2
716          ->  Parallel Seq Scan on p1_c3
717          ->  Parallel Seq Scan on p1_c4
718          ->  Parallel Seq Scan on p1_c1_c1
719          ->  Parallel Seq Scan on p1_c1_c2
720          ->  Parallel Seq Scan on p1_c3_c1
721          ->  Parallel Seq Scan on p1_c3_c2
722          ->  Parallel Seq Scan on p2
723          ->  Parallel Seq Scan on p2_c1
724          ->  Parallel Seq Scan on p2_c2
725          ->  Parallel Seq Scan on p2_c3
726          ->  Parallel Seq Scan on p2_c4
727          ->  Parallel Seq Scan on p2_c1_c1
728          ->  Parallel Seq Scan on p2_c1_c2
729          ->  Parallel Seq Scan on p2_c3_c1
730          ->  Parallel Seq Scan on p2_c3_c2
731 (21 rows)
732
733 -- applies largest number of workers on merged parallel paths
734 SET parallel_setup_cost to DEFAULT;
735 SET parallel_tuple_cost to DEFAULT;
736 SET min_parallel_table_scan_size to DEFAULT;
737 SET min_parallel_index_scan_size to DEFAULT;
738 SET max_parallel_workers_per_gather to 8;
739 /*+Parallel(p1 5 hard)Parallel(p2 6 hard) */
740 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
741 LOG:  pg_hint_plan:
742 used hint:
743 Parallel(p1 5 hard)
744 Parallel(p2 6 hard)
745 not used hint:
746 duplication hint:
747 error hint:
748
749                 QUERY PLAN                 
750 -------------------------------------------
751  Gather
752    Workers Planned: 6
753    ->  Append
754          ->  Parallel Seq Scan on p1
755          ->  Parallel Seq Scan on p1_c1
756          ->  Parallel Seq Scan on p1_c2
757          ->  Parallel Seq Scan on p1_c3
758          ->  Parallel Seq Scan on p1_c4
759          ->  Parallel Seq Scan on p1_c1_c1
760          ->  Parallel Seq Scan on p1_c1_c2
761          ->  Parallel Seq Scan on p1_c3_c1
762          ->  Parallel Seq Scan on p1_c3_c2
763          ->  Parallel Seq Scan on p2
764          ->  Parallel Seq Scan on p2_c1
765          ->  Parallel Seq Scan on p2_c2
766          ->  Parallel Seq Scan on p2_c3
767          ->  Parallel Seq Scan on p2_c4
768          ->  Parallel Seq Scan on p2_c1_c1
769          ->  Parallel Seq Scan on p2_c1_c2
770          ->  Parallel Seq Scan on p2_c3_c1
771          ->  Parallel Seq Scan on p2_c3_c2
772 (21 rows)
773
774 -- num of workers of non-hinted relations should be default value
775 SET parallel_setup_cost to 0;
776 SET parallel_tuple_cost to 0;
777 SET min_parallel_table_scan_size to 0;
778 SET min_parallel_index_scan_size to 0;
779 SET max_parallel_workers_per_gather to 3;
780 SET enable_indexscan to false;
781 /*+Parallel(p1 8 hard) */
782 EXPLAIN (COSTS false) SELECT * FROM p1 join t1 on p1.id = t1.id;
783 LOG:  pg_hint_plan:
784 used hint:
785 Parallel(p1 8 hard)
786 not used hint:
787 duplication hint:
788 error hint:
789
790                       QUERY PLAN                       
791 -------------------------------------------------------
792  Hash Join
793    Hash Cond: (t1.id = p1.id)
794    ->  Gather
795          Workers Planned: 3
796          ->  Parallel Seq Scan on t1
797    ->  Hash
798          ->  Gather
799                Workers Planned: 8
800                ->  Append
801                      ->  Parallel Seq Scan on p1
802                      ->  Parallel Seq Scan on p1_c1
803                      ->  Parallel Seq Scan on p1_c2
804                      ->  Parallel Seq Scan on p1_c3
805                      ->  Parallel Seq Scan on p1_c4
806                      ->  Parallel Seq Scan on p1_c1_c1
807                      ->  Parallel Seq Scan on p1_c1_c2
808                      ->  Parallel Seq Scan on p1_c3_c1
809                      ->  Parallel Seq Scan on p1_c3_c2
810 (18 rows)
811
812 -- Negative hint
813 SET enable_indexscan to DEFAULT;
814 SET parallel_setup_cost to 0;
815 SET parallel_tuple_cost to 0;
816 SET min_parallel_table_scan_size to 0;
817 SET min_parallel_index_scan_size to 0;
818 SET max_parallel_workers_per_gather to 5;
819 EXPLAIN (COSTS false) SELECT * FROM p1;
820                 QUERY PLAN                 
821 -------------------------------------------
822  Gather
823    Workers Planned: 1
824    ->  Append
825          ->  Parallel Seq Scan on p1
826          ->  Parallel Seq Scan on p1_c1
827          ->  Parallel Seq Scan on p1_c2
828          ->  Parallel Seq Scan on p1_c3
829          ->  Parallel Seq Scan on p1_c4
830          ->  Parallel Seq Scan on p1_c1_c1
831          ->  Parallel Seq Scan on p1_c1_c2
832          ->  Parallel Seq Scan on p1_c3_c1
833          ->  Parallel Seq Scan on p1_c3_c2
834 (12 rows)
835
836 /*+Parallel(p1 0 hard)*/
837 EXPLAIN (COSTS false) SELECT * FROM p1;
838 LOG:  pg_hint_plan:
839 used hint:
840 Parallel(p1 0 hard)
841 not used hint:
842 duplication hint:
843 error hint:
844
845          QUERY PLAN         
846 ----------------------------
847  Append
848    ->  Seq Scan on p1
849    ->  Seq Scan on p1_c1
850    ->  Seq Scan on p1_c2
851    ->  Seq Scan on p1_c3
852    ->  Seq Scan on p1_c4
853    ->  Seq Scan on p1_c1_c1
854    ->  Seq Scan on p1_c1_c2
855    ->  Seq Scan on p1_c3_c1
856    ->  Seq Scan on p1_c3_c2
857 (10 rows)
858
859 -- Errors
860 /*+Parallel(p1 100x hard)Parallel(p1 -1000 hard)Parallel(p1 1000000 hard)
861    Parallel(p1 8 hoge)Parallel(p1)Parallel(p1 100 soft x)*/
862 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
863 INFO:  pg_hint_plan: hint syntax error at or near "100x"
864 DETAIL:  number of workers must be a number: Parallel
865 INFO:  pg_hint_plan: hint syntax error at or near "-1000"
866 DETAIL:  number of workers must be positive: Parallel
867 INFO:  pg_hint_plan: hint syntax error at or near "1000000"
868 DETAIL:  number of workers = 1000000 is larger than max_worker_processes(8): Parallel
869 INFO:  pg_hint_plan: hint syntax error at or near "hoge"
870 DETAIL:  enforcement must be soft or hard: Parallel
871 INFO:  pg_hint_plan: hint syntax error at or near ")"
872 DETAIL:  wrong number of arguments (1): Parallel
873 INFO:  pg_hint_plan: hint syntax error at or near ")"
874 DETAIL:  wrong number of arguments (4): Parallel
875 LOG:  pg_hint_plan:
876 used hint:
877 not used hint:
878 duplication hint:
879 error hint:
880 Parallel(p1 100x hard)
881 Parallel(p1 -1000 hard)
882 Parallel(p1 1000000 hard)
883 Parallel(p1 8 soft)
884 Parallel()
885 Parallel()
886
887                 QUERY PLAN                 
888 -------------------------------------------
889  Gather
890    Workers Planned: 1
891    ->  Append
892          ->  Parallel Seq Scan on p1
893          ->  Parallel Seq Scan on p1_c1
894          ->  Parallel Seq Scan on p1_c2
895          ->  Parallel Seq Scan on p1_c3
896          ->  Parallel Seq Scan on p1_c4
897          ->  Parallel Seq Scan on p1_c1_c1
898          ->  Parallel Seq Scan on p1_c1_c2
899          ->  Parallel Seq Scan on p1_c3_c1
900          ->  Parallel Seq Scan on p1_c3_c2
901          ->  Parallel Seq Scan on p2
902          ->  Parallel Seq Scan on p2_c1
903          ->  Parallel Seq Scan on p2_c2
904          ->  Parallel Seq Scan on p2_c3
905          ->  Parallel Seq Scan on p2_c4
906          ->  Parallel Seq Scan on p2_c1_c1
907          ->  Parallel Seq Scan on p2_c1_c2
908          ->  Parallel Seq Scan on p2_c3_c1
909          ->  Parallel Seq Scan on p2_c3_c2
910 (21 rows)
911
912 -- Hints on unhintable relations are just ignored
913 /*+Parallel(p1 5 hard) Parallel(s1 3 hard) IndexScan(ft1) SeqScan(cte1)
914   TidScan(fs1) IndexScan(t) IndexScan(*VALUES*) */
915 EXPLAIN (COSTS false) SELECT id FROM p1_c1_c1 as s1 TABLESAMPLE SYSTEM(10)
916  UNION ALL
917 SELECT id FROM ft1
918  UNION ALL
919 (WITH cte1 AS (SELECT id FROM p1 WHERE id % 2 = 0) SELECT id FROM cte1)
920  UNION ALL
921 SELECT userid FROM pg_stat_statements fs1
922  UNION ALL
923 SELECT x FROM (VALUES (1), (2), (3)) t(x);
924 LOG:  pg_hint_plan:
925 used hint:
926 Parallel(p1 5 hard)
927 not used hint:
928 IndexScan(*VALUES*)
929 SeqScan(cte1)
930 TidScan(fs1)
931 IndexScan(ft1)
932 IndexScan(t)
933 Parallel(s1 3 hard)
934 duplication hint:
935 error hint:
936
937                                           QUERY PLAN                                           
938 -----------------------------------------------------------------------------------------------
939  Append
940    ->  Result
941          ->  Append
942                ->  Sample Scan on p1_c1_c1 s1
943                      Sampling: system ('10'::real)
944                ->  Foreign Scan on ft1
945                      Foreign File: /home/horiguti/work/pg_hint_plan/pg_hint_plan/data/data.csv
946                ->  CTE Scan on cte1
947                      CTE cte1
948                        ->  Gather
949                              Workers Planned: 5
950                              ->  Append
951                                    ->  Parallel Seq Scan on p1
952                                          Filter: ((id % 2) = 0)
953                                    ->  Parallel Seq Scan on p1_c1
954                                          Filter: ((id % 2) = 0)
955                                    ->  Parallel Seq Scan on p1_c2
956                                          Filter: ((id % 2) = 0)
957                                    ->  Parallel Seq Scan on p1_c3
958                                          Filter: ((id % 2) = 0)
959                                    ->  Parallel Seq Scan on p1_c4
960                                          Filter: ((id % 2) = 0)
961                                    ->  Parallel Seq Scan on p1_c1_c1
962                                          Filter: ((id % 2) = 0)
963                                    ->  Parallel Seq Scan on p1_c1_c2
964                                          Filter: ((id % 2) = 0)
965                                    ->  Parallel Seq Scan on p1_c3_c1
966                                          Filter: ((id % 2) = 0)
967                                    ->  Parallel Seq Scan on p1_c3_c2
968                                          Filter: ((id % 2) = 0)
969    ->  Function Scan on pg_stat_statements
970    ->  Subquery Scan on "*SELECT* 5"
971          ->  Values Scan on "*VALUES*"
972 (33 rows)
973
974 ALTER SYSTEM SET session_preload_libraries TO DEFAULT;
975 SELECT pg_reload_conf();
976  pg_reload_conf 
977 ----------------
978  t
979 (1 row)
980