OSDN Git Service

Fix parallel hint error handling.
[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_relation_size to 0;
18 SET max_parallel_workers_per_gather to DEFAULT;
19 /*+Parallel(t1 8)*/
20 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
21 LOG:  pg_hint_plan:
22 used hint:
23 Parallel(t1 8 soft)
24 not used hint:
25 duplication hint:
26 error hint:
27
28           QUERY PLAN           
29 -------------------------------
30  Gather
31    Workers Planned: 2
32    ->  Parallel Seq Scan on t1
33 (3 rows)
34
35 /*+Parallel(t1 8 soft)*/
36 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
37 LOG:  pg_hint_plan:
38 used hint:
39 Parallel(t1 8 soft)
40 not used hint:
41 duplication hint:
42 error hint:
43
44           QUERY PLAN           
45 -------------------------------
46  Gather
47    Workers Planned: 2
48    ->  Parallel Seq Scan on t1
49 (3 rows)
50
51 /*+Parallel(t1 8 hard)*/
52 EXPLAIN (COSTS false) SELECT * FROM s1.t1;
53 LOG:  pg_hint_plan:
54 used hint:
55 Parallel(t1 8 hard)
56 not used hint:
57 duplication hint:
58 error hint:
59
60           QUERY PLAN           
61 -------------------------------
62  Gather
63    Workers Planned: 8
64    ->  Parallel Seq Scan on t1
65 (3 rows)
66
67 -- Queries on inheritance tables
68 SET parallel_setup_cost to 0;
69 SET parallel_tuple_cost to 0;
70 SET min_parallel_relation_size to 0;
71 /*+Parallel(p1 8)*/
72 EXPLAIN (COSTS false) SELECT * FROM p1;
73 LOG:  pg_hint_plan:
74 used hint:
75 Parallel(p1 8 soft)
76 not used hint:
77 duplication hint:
78 error hint:
79
80                 QUERY PLAN                 
81 -------------------------------------------
82  Gather
83    Workers Planned: 1
84    ->  Append
85          ->  Parallel Seq Scan on p1
86          ->  Parallel Seq Scan on p1_c1
87          ->  Parallel Seq Scan on p1_c2
88          ->  Parallel Seq Scan on p1_c3
89          ->  Parallel Seq Scan on p1_c4
90          ->  Parallel Seq Scan on p1_c1_c1
91          ->  Parallel Seq Scan on p1_c1_c2
92          ->  Parallel Seq Scan on p1_c3_c1
93          ->  Parallel Seq Scan on p1_c3_c2
94 (12 rows)
95
96 SET parallel_setup_cost to DEFAULT;
97 SET parallel_tuple_cost to DEFAULT;
98 SET min_parallel_relation_size to DEFAULT;
99 /*+Parallel(p1 8 hard)*/
100 EXPLAIN (COSTS false) SELECT * FROM p1;
101 LOG:  pg_hint_plan:
102 used hint:
103 Parallel(p1 8 hard)
104 not used hint:
105 duplication hint:
106 error hint:
107
108                 QUERY PLAN                 
109 -------------------------------------------
110  Gather
111    Workers Planned: 8
112    ->  Append
113          ->  Parallel Seq Scan on p1
114          ->  Parallel Seq Scan on p1_c1
115          ->  Parallel Seq Scan on p1_c2
116          ->  Parallel Seq Scan on p1_c3
117          ->  Parallel Seq Scan on p1_c4
118          ->  Parallel Seq Scan on p1_c1_c1
119          ->  Parallel Seq Scan on p1_c1_c2
120          ->  Parallel Seq Scan on p1_c3_c1
121          ->  Parallel Seq Scan on p1_c3_c2
122 (12 rows)
123
124 -- hinting on children makes the whole inheritance parallel
125 /*+Parallel(p1_c1 8 hard)*/
126 EXPLAIN (COSTS false) SELECT * FROM p1;
127 LOG:  pg_hint_plan:
128 used hint:
129 Parallel(p1_c1 8 hard)
130 not used hint:
131 duplication hint:
132 error hint:
133
134                 QUERY PLAN                 
135 -------------------------------------------
136  Gather
137    Workers Planned: 8
138    ->  Append
139          ->  Parallel Seq Scan on p1
140          ->  Parallel Seq Scan on p1_c1
141          ->  Parallel Seq Scan on p1_c2
142          ->  Parallel Seq Scan on p1_c3
143          ->  Parallel Seq Scan on p1_c4
144          ->  Parallel Seq Scan on p1_c1_c1
145          ->  Parallel Seq Scan on p1_c1_c2
146          ->  Parallel Seq Scan on p1_c3_c1
147          ->  Parallel Seq Scan on p1_c3_c2
148 (12 rows)
149
150 -- Joins
151 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
152                 QUERY PLAN                
153 ------------------------------------------
154  Hash Join
155    Hash Cond: (p1_c1_c1.id = p2_c1_c1.id)
156    ->  Seq Scan on p1_c1_c1
157    ->  Hash
158          ->  Seq Scan on p2_c1_c1
159 (5 rows)
160
161 /*+Parallel(p1_c1_c1 8 hard)*/
162 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
163 LOG:  pg_hint_plan:
164 used hint:
165 Parallel(p1_c1_c1 8 hard)
166 not used hint:
167 duplication hint:
168 error hint:
169
170                    QUERY PLAN                    
171 -------------------------------------------------
172  Hash Join
173    Hash Cond: (p2_c1_c1.id = p1_c1_c1.id)
174    ->  Seq Scan on p2_c1_c1
175    ->  Hash
176          ->  Gather
177                Workers Planned: 8
178                ->  Parallel Seq Scan on p1_c1_c1
179 (7 rows)
180
181 SET parallel_setup_cost to 0;
182 SET parallel_tuple_cost to 0;
183 SET min_parallel_relation_size to 0;
184 /*+Parallel(p1_c1_c1 8 soft) Parallel(p2_c1_c1 0)*/
185 EXPLAIN (COSTS false) SELECT * FROM p1_c1_c1 join p2_c1_c1 on p1_c1_c1.id = p2_c1_c1.id;
186 LOG:  pg_hint_plan:
187 used hint:
188 Parallel(p1_c1_c1 8 soft)
189 Parallel(p2_c1_c1 0 soft)
190 not used hint:
191 duplication hint:
192 error hint:
193
194                    QUERY PLAN                   
195 ------------------------------------------------
196  Gather
197    Workers Planned: 1
198    ->  Hash Join
199          Hash Cond: (p1_c1_c1.id = p2_c1_c1.id)
200          ->  Parallel Seq Scan on p1_c1_c1
201          ->  Hash
202                ->  Seq Scan on p2_c1_c1
203 (7 rows)
204
205 /*+Parallel(p1_c1_c1 8 hard) 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 hard)
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: 8
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 8 hard)*/
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 8 hard)
232 not used hint:
233 duplication hint:
234 error hint:
235
236                    QUERY PLAN                    
237 -------------------------------------------------
238  Hash Join
239    Hash Cond: (p1_c1_c1.id = p2_c1_c1.id)
240    ->  Gather
241          Workers Planned: 8
242          ->  Parallel Seq Scan on p1_c1_c1
243    ->  Hash
244          ->  Gather
245                Workers Planned: 8
246                ->  Parallel Seq Scan on p2_c1_c1
247 (9 rows)
248
249 -- Joins on inheritance tables
250 SET parallel_setup_cost to 0;
251 SET parallel_tuple_cost to 0;
252 SET min_parallel_relation_size to 0;
253 /*+Parallel(p1 8)*/
254 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
255 LOG:  pg_hint_plan:
256 used hint:
257 Parallel(p1 8 soft)
258 not used hint:
259 duplication hint:
260 error hint:
261
262                       QUERY PLAN                       
263 -------------------------------------------------------
264  Hash Join
265    Hash Cond: (p1.id = p2.id)
266    ->  Gather
267          Workers Planned: 1
268          ->  Append
269                ->  Parallel Seq Scan on p1
270                ->  Parallel Seq Scan on p1_c1
271                ->  Parallel Seq Scan on p1_c2
272                ->  Parallel Seq Scan on p1_c3
273                ->  Parallel Seq Scan on p1_c4
274                ->  Parallel Seq Scan on p1_c1_c1
275                ->  Parallel Seq Scan on p1_c1_c2
276                ->  Parallel Seq Scan on p1_c3_c1
277                ->  Parallel Seq Scan on p1_c3_c2
278    ->  Hash
279          ->  Gather
280                Workers Planned: 1
281                ->  Append
282                      ->  Parallel Seq Scan on p2
283                      ->  Parallel Seq Scan on p2_c1
284                      ->  Parallel Seq Scan on p2_c2
285                      ->  Parallel Seq Scan on p2_c3
286                      ->  Parallel Seq Scan on p2_c4
287                      ->  Parallel Seq Scan on p2_c1_c1
288                      ->  Parallel Seq Scan on p2_c1_c2
289                      ->  Parallel Seq Scan on p2_c3_c1
290                      ->  Parallel Seq Scan on p2_c3_c2
291 (27 rows)
292
293 /*+Parallel(p1 8)Parallel(p2 0)*/
294 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
295 LOG:  pg_hint_plan:
296 used hint:
297 Parallel(p1 8 soft)
298 Parallel(p2 0 soft)
299 not used hint:
300 duplication hint:
301 error hint:
302
303                    QUERY PLAN                    
304 -------------------------------------------------
305  Gather
306    Workers Planned: 1
307    ->  Hash Join
308          Hash Cond: (p1.id = p2.id)
309          ->  Append
310                ->  Parallel Seq Scan on p1
311                ->  Parallel Seq Scan on p1_c1
312                ->  Parallel Seq Scan on p1_c2
313                ->  Parallel Seq Scan on p1_c3
314                ->  Parallel Seq Scan on p1_c4
315                ->  Parallel Seq Scan on p1_c1_c1
316                ->  Parallel Seq Scan on p1_c1_c2
317                ->  Parallel Seq Scan on p1_c3_c1
318                ->  Parallel Seq Scan on p1_c3_c2
319          ->  Hash
320                ->  Append
321                      ->  Seq Scan on p2
322                      ->  Seq Scan on p2_c1
323                      ->  Seq Scan on p2_c2
324                      ->  Seq Scan on p2_c3
325                      ->  Seq Scan on p2_c4
326                      ->  Seq Scan on p2_c1_c1
327                      ->  Seq Scan on p2_c1_c2
328                      ->  Seq Scan on p2_c3_c1
329                      ->  Seq Scan on p2_c3_c2
330 (25 rows)
331
332 SET parallel_setup_cost to DEFAULT;
333 SET parallel_tuple_cost to DEFAULT;
334 SET min_parallel_relation_size to DEFAULT;
335 /*+Parallel(p2 8 hard)*/
336 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
337 LOG:  pg_hint_plan:
338 used hint:
339 Parallel(p2 8 hard)
340 not used hint:
341 duplication hint:
342 error hint:
343
344                       QUERY PLAN                       
345 -------------------------------------------------------
346  Hash Join
347    Hash Cond: (p2.id = p1.id)
348    ->  Gather
349          Workers Planned: 8
350          ->  Append
351                ->  Parallel Seq Scan on p2
352                ->  Parallel Seq Scan on p2_c1
353                ->  Parallel Seq Scan on p2_c2
354                ->  Parallel Seq Scan on p2_c3
355                ->  Parallel Seq Scan on p2_c4
356                ->  Parallel Seq Scan on p2_c1_c1
357                ->  Parallel Seq Scan on p2_c1_c2
358                ->  Parallel Seq Scan on p2_c3_c1
359                ->  Parallel Seq Scan on p2_c3_c2
360    ->  Hash
361          ->  Gather
362                Workers Planned: 1
363                ->  Append
364                      ->  Parallel Seq Scan on p1
365                      ->  Parallel Seq Scan on p1_c1
366                      ->  Parallel Seq Scan on p1_c2
367                      ->  Parallel Seq Scan on p1_c3
368                      ->  Parallel Seq Scan on p1_c4
369                      ->  Parallel Seq Scan on p1_c1_c1
370                      ->  Parallel Seq Scan on p1_c1_c2
371                      ->  Parallel Seq Scan on p1_c3_c1
372                      ->  Parallel Seq Scan on p1_c3_c2
373 (27 rows)
374
375 /*+Parallel(p2 8 hard) Parallel(p1 5 hard) */
376 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
377 LOG:  pg_hint_plan:
378 used hint:
379 Parallel(p1 5 hard)
380 Parallel(p2 8 hard)
381 not used hint:
382 duplication hint:
383 error hint:
384
385                       QUERY PLAN                       
386 -------------------------------------------------------
387  Hash Join
388    Hash Cond: (p2.id = p1.id)
389    ->  Gather
390          Workers Planned: 8
391          ->  Append
392                ->  Parallel Seq Scan on p2
393                ->  Parallel Seq Scan on p2_c1
394                ->  Parallel Seq Scan on p2_c2
395                ->  Parallel Seq Scan on p2_c3
396                ->  Parallel Seq Scan on p2_c4
397                ->  Parallel Seq Scan on p2_c1_c1
398                ->  Parallel Seq Scan on p2_c1_c2
399                ->  Parallel Seq Scan on p2_c3_c1
400                ->  Parallel Seq Scan on p2_c3_c2
401    ->  Hash
402          ->  Gather
403                Workers Planned: 5
404                ->  Append
405                      ->  Parallel Seq Scan on p1
406                      ->  Parallel Seq Scan on p1_c1
407                      ->  Parallel Seq Scan on p1_c2
408                      ->  Parallel Seq Scan on p1_c3
409                      ->  Parallel Seq Scan on p1_c4
410                      ->  Parallel Seq Scan on p1_c1_c1
411                      ->  Parallel Seq Scan on p1_c1_c2
412                      ->  Parallel Seq Scan on p1_c3_c1
413                      ->  Parallel Seq Scan on p1_c3_c2
414 (27 rows)
415
416 -- Mixture with a scan hint
417 -- p1 can be parallel
418 /*+Parallel(p1 8 hard) IndexScan(p2) */
419 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
420 LOG:  pg_hint_plan:
421 used hint:
422 IndexScan(p2)
423 Parallel(p1 8 hard)
424 not used hint:
425 duplication hint:
426 error hint:
427
428                       QUERY PLAN                       
429 -------------------------------------------------------
430  Hash Join
431    Hash Cond: (p1.id = p2.id)
432    ->  Gather
433          Workers Planned: 8
434          ->  Append
435                ->  Parallel Seq Scan on p1
436                ->  Parallel Seq Scan on p1_c1
437                ->  Parallel Seq Scan on p1_c2
438                ->  Parallel Seq Scan on p1_c3
439                ->  Parallel Seq Scan on p1_c4
440                ->  Parallel Seq Scan on p1_c1_c1
441                ->  Parallel Seq Scan on p1_c1_c2
442                ->  Parallel Seq Scan on p1_c3_c1
443                ->  Parallel Seq Scan on p1_c3_c2
444    ->  Hash
445          ->  Gather
446                Workers Planned: 1
447                ->  Append
448                      ->  Parallel Seq Scan on p2
449                      ->  Parallel Seq Scan on p2_c1
450                      ->  Parallel Seq Scan on p2_c2
451                      ->  Parallel Seq Scan on p2_c3
452                      ->  Parallel Seq Scan on p2_c4
453                      ->  Parallel Seq Scan on p2_c1_c1
454                      ->  Parallel Seq Scan on p2_c1_c2
455                      ->  Parallel Seq Scan on p2_c3_c1
456                      ->  Parallel Seq Scan on p2_c3_c2
457 (27 rows)
458
459 -- seqscan doesn't harm parallelism
460 /*+Parallel(p1 8 hard) SeqScan(p1) */
461 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
462 LOG:  pg_hint_plan:
463 used hint:
464 SeqScan(p1)
465 Parallel(p1 8 hard)
466 not used hint:
467 duplication hint:
468 error hint:
469
470                       QUERY PLAN                       
471 -------------------------------------------------------
472  Hash Join
473    Hash Cond: (p1.id = p2.id)
474    ->  Gather
475          Workers Planned: 8
476          ->  Append
477                ->  Parallel Seq Scan on p1
478                ->  Parallel Seq Scan on p1_c1
479                ->  Parallel Seq Scan on p1_c2
480                ->  Parallel Seq Scan on p1_c3
481                ->  Parallel Seq Scan on p1_c4
482                ->  Parallel Seq Scan on p1_c1_c1
483                ->  Parallel Seq Scan on p1_c1_c2
484                ->  Parallel Seq Scan on p1_c3_c1
485                ->  Parallel Seq Scan on p1_c3_c2
486    ->  Hash
487          ->  Gather
488                Workers Planned: 1
489                ->  Append
490                      ->  Parallel Seq Scan on p2
491                      ->  Parallel Seq Scan on p2_c1
492                      ->  Parallel Seq Scan on p2_c2
493                      ->  Parallel Seq Scan on p2_c3
494                      ->  Parallel Seq Scan on p2_c4
495                      ->  Parallel Seq Scan on p2_c1_c1
496                      ->  Parallel Seq Scan on p2_c1_c2
497                      ->  Parallel Seq Scan on p2_c3_c1
498                      ->  Parallel Seq Scan on p2_c3_c2
499 (27 rows)
500
501 -- parallel overrides index scan
502 /*+Parallel(p1 8 hard) IndexScan(p1) */
503 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
504 LOG:  pg_hint_plan:
505 used hint:
506 IndexScan(p1)
507 Parallel(p1 8 hard)
508 not used hint:
509 duplication hint:
510 error hint:
511
512                       QUERY PLAN                       
513 -------------------------------------------------------
514  Hash Join
515    Hash Cond: (p1.id = p2.id)
516    ->  Gather
517          Workers Planned: 8
518          ->  Append
519                ->  Parallel Seq Scan on p1
520                ->  Parallel Seq Scan on p1_c1
521                ->  Parallel Seq Scan on p1_c2
522                ->  Parallel Seq Scan on p1_c3
523                ->  Parallel Seq Scan on p1_c4
524                ->  Parallel Seq Scan on p1_c1_c1
525                ->  Parallel Seq Scan on p1_c1_c2
526                ->  Parallel Seq Scan on p1_c3_c1
527                ->  Parallel Seq Scan on p1_c3_c2
528    ->  Hash
529          ->  Gather
530                Workers Planned: 1
531                ->  Append
532                      ->  Parallel Seq Scan on p2
533                      ->  Parallel Seq Scan on p2_c1
534                      ->  Parallel Seq Scan on p2_c2
535                      ->  Parallel Seq Scan on p2_c3
536                      ->  Parallel Seq Scan on p2_c4
537                      ->  Parallel Seq Scan on p2_c1_c1
538                      ->  Parallel Seq Scan on p2_c1_c2
539                      ->  Parallel Seq Scan on p2_c3_c1
540                      ->  Parallel Seq Scan on p2_c3_c2
541 (27 rows)
542
543 /*+Parallel(p1 0 hard) IndexScan(p1) */
544 EXPLAIN (COSTS false) SELECT * FROM p1 join p2 on p1.id = p2.id;
545 LOG:  pg_hint_plan:
546 used hint:
547 IndexScan(p1)
548 Parallel(p1 0 hard)
549 not used hint:
550 duplication hint:
551 error hint:
552
553                        QUERY PLAN                       
554 --------------------------------------------------------
555  Hash Join
556    Hash Cond: (p1.id = p2.id)
557    ->  Append
558          ->  Index Scan using p1_pkey on p1
559          ->  Index Scan using p1_c1_pkey on p1_c1
560          ->  Index Scan using p1_c2_pkey on p1_c2
561          ->  Index Scan using p1_c3_pkey on p1_c3
562          ->  Index Scan using p1_c4_pkey on p1_c4
563          ->  Index Scan using p1_c1_c1_pkey on p1_c1_c1
564          ->  Index Scan using p1_c1_c2_pkey on p1_c1_c2
565          ->  Index Scan using p1_c3_c1_pkey on p1_c3_c1
566          ->  Index Scan using p1_c3_c2_pkey on p1_c3_c2
567    ->  Hash
568          ->  Append
569                ->  Seq Scan on p2
570                ->  Seq Scan on p2_c1
571                ->  Seq Scan on p2_c2
572                ->  Seq Scan on p2_c3
573                ->  Seq Scan on p2_c4
574                ->  Seq Scan on p2_c1_c1
575                ->  Seq Scan on p2_c1_c2
576                ->  Seq Scan on p2_c3_c1
577                ->  Seq Scan on p2_c3_c2
578 (23 rows)
579
580 -- Parallel on UNION
581 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
582          QUERY PLAN         
583 ----------------------------
584  Append
585    ->  Seq Scan on p1
586    ->  Seq Scan on p1_c1
587    ->  Seq Scan on p1_c2
588    ->  Seq Scan on p1_c3
589    ->  Seq Scan on p1_c4
590    ->  Seq Scan on p1_c1_c1
591    ->  Seq Scan on p1_c1_c2
592    ->  Seq Scan on p1_c3_c1
593    ->  Seq Scan on p1_c3_c2
594    ->  Seq Scan on p2
595    ->  Seq Scan on p2_c1
596    ->  Seq Scan on p2_c2
597    ->  Seq Scan on p2_c3
598    ->  Seq Scan on p2_c4
599    ->  Seq Scan on p2_c1_c1
600    ->  Seq Scan on p2_c1_c2
601    ->  Seq Scan on p2_c3_c1
602    ->  Seq Scan on p2_c3_c2
603 (19 rows)
604
605 -- parallel hinting on any relation enables parallel
606 SET parallel_setup_cost to 0;
607 SET parallel_tuple_cost to 0;
608 SET min_parallel_relation_size to 0;
609 SET max_parallel_workers_per_gather to 0;
610 /*+Parallel(p1 8) */
611 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
612 LOG:  pg_hint_plan:
613 used hint:
614 Parallel(p1 8 soft)
615 not used hint:
616 duplication hint:
617 error hint:
618
619                 QUERY PLAN                 
620 -------------------------------------------
621  Gather
622    Workers Planned: 1
623    ->  Append
624          ->  Parallel Seq Scan on p1
625          ->  Parallel Seq Scan on p1_c1
626          ->  Parallel Seq Scan on p1_c2
627          ->  Parallel Seq Scan on p1_c3
628          ->  Parallel Seq Scan on p1_c4
629          ->  Parallel Seq Scan on p1_c1_c1
630          ->  Parallel Seq Scan on p1_c1_c2
631          ->  Parallel Seq Scan on p1_c3_c1
632          ->  Parallel Seq Scan on p1_c3_c2
633          ->  Parallel Seq Scan on p2
634          ->  Parallel Seq Scan on p2_c1
635          ->  Parallel Seq Scan on p2_c2
636          ->  Parallel Seq Scan on p2_c3
637          ->  Parallel Seq Scan on p2_c4
638          ->  Parallel Seq Scan on p2_c1_c1
639          ->  Parallel Seq Scan on p2_c1_c2
640          ->  Parallel Seq Scan on p2_c3_c1
641          ->  Parallel Seq Scan on p2_c3_c2
642 (21 rows)
643
644 -- set hint also does
645 /*+Set(max_parallel_workers_per_gather 1)*/
646 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
647 LOG:  pg_hint_plan:
648 used hint:
649 Set(max_parallel_workers_per_gather 1)
650 not used hint:
651 duplication hint:
652 error hint:
653
654                 QUERY PLAN                 
655 -------------------------------------------
656  Gather
657    Workers Planned: 1
658    ->  Append
659          ->  Parallel Seq Scan on p1
660          ->  Parallel Seq Scan on p1_c1
661          ->  Parallel Seq Scan on p1_c2
662          ->  Parallel Seq Scan on p1_c3
663          ->  Parallel Seq Scan on p1_c4
664          ->  Parallel Seq Scan on p1_c1_c1
665          ->  Parallel Seq Scan on p1_c1_c2
666          ->  Parallel Seq Scan on p1_c3_c1
667          ->  Parallel Seq Scan on p1_c3_c2
668          ->  Parallel Seq Scan on p2
669          ->  Parallel Seq Scan on p2_c1
670          ->  Parallel Seq Scan on p2_c2
671          ->  Parallel Seq Scan on p2_c3
672          ->  Parallel Seq Scan on p2_c4
673          ->  Parallel Seq Scan on p2_c1_c1
674          ->  Parallel Seq Scan on p2_c1_c2
675          ->  Parallel Seq Scan on p2_c3_c1
676          ->  Parallel Seq Scan on p2_c3_c2
677 (21 rows)
678
679 -- applies largest number of workers on merged parallel paths
680 SET parallel_setup_cost to DEFAULT;
681 SET parallel_tuple_cost to DEFAULT;
682 SET min_parallel_relation_size to DEFAULT;
683 SET max_parallel_workers_per_gather to 8;
684 /*+Parallel(p1 5 hard)Parallel(p2 6 hard) */
685 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
686 LOG:  pg_hint_plan:
687 used hint:
688 Parallel(p1 5 hard)
689 Parallel(p2 6 hard)
690 not used hint:
691 duplication hint:
692 error hint:
693
694                 QUERY PLAN                 
695 -------------------------------------------
696  Gather
697    Workers Planned: 6
698    ->  Append
699          ->  Parallel Seq Scan on p1
700          ->  Parallel Seq Scan on p1_c1
701          ->  Parallel Seq Scan on p1_c2
702          ->  Parallel Seq Scan on p1_c3
703          ->  Parallel Seq Scan on p1_c4
704          ->  Parallel Seq Scan on p1_c1_c1
705          ->  Parallel Seq Scan on p1_c1_c2
706          ->  Parallel Seq Scan on p1_c3_c1
707          ->  Parallel Seq Scan on p1_c3_c2
708          ->  Parallel Seq Scan on p2
709          ->  Parallel Seq Scan on p2_c1
710          ->  Parallel Seq Scan on p2_c2
711          ->  Parallel Seq Scan on p2_c3
712          ->  Parallel Seq Scan on p2_c4
713          ->  Parallel Seq Scan on p2_c1_c1
714          ->  Parallel Seq Scan on p2_c1_c2
715          ->  Parallel Seq Scan on p2_c3_c1
716          ->  Parallel Seq Scan on p2_c3_c2
717 (21 rows)
718
719 -- num of workers of non-hinted relations should be default value
720 SET parallel_setup_cost to 0;
721 SET parallel_tuple_cost to 0;
722 SET min_parallel_relation_size to 0;
723 SET max_parallel_workers_per_gather to 3;
724 /*+Parallel(p1 8 hard) */
725 EXPLAIN (COSTS false) SELECT * FROM p1 join t1 on p1.id = t1.id;
726 LOG:  pg_hint_plan:
727 used hint:
728 Parallel(p1 8 hard)
729 not used hint:
730 duplication hint:
731 error hint:
732
733                       QUERY PLAN                       
734 -------------------------------------------------------
735  Hash Join
736    Hash Cond: (t1.id = p1.id)
737    ->  Gather
738          Workers Planned: 3
739          ->  Parallel Seq Scan on t1
740    ->  Hash
741          ->  Gather
742                Workers Planned: 8
743                ->  Append
744                      ->  Parallel Seq Scan on p1
745                      ->  Parallel Seq Scan on p1_c1
746                      ->  Parallel Seq Scan on p1_c2
747                      ->  Parallel Seq Scan on p1_c3
748                      ->  Parallel Seq Scan on p1_c4
749                      ->  Parallel Seq Scan on p1_c1_c1
750                      ->  Parallel Seq Scan on p1_c1_c2
751                      ->  Parallel Seq Scan on p1_c3_c1
752                      ->  Parallel Seq Scan on p1_c3_c2
753 (18 rows)
754
755 -- Negative hint
756 SET parallel_setup_cost to 0;
757 SET parallel_tuple_cost to 0;
758 SET min_parallel_relation_size to 0;
759 SET max_parallel_workers_per_gather to 5;
760 EXPLAIN (COSTS false) SELECT * FROM p1;
761                 QUERY PLAN                 
762 -------------------------------------------
763  Gather
764    Workers Planned: 1
765    ->  Append
766          ->  Parallel Seq Scan on p1
767          ->  Parallel Seq Scan on p1_c1
768          ->  Parallel Seq Scan on p1_c2
769          ->  Parallel Seq Scan on p1_c3
770          ->  Parallel Seq Scan on p1_c4
771          ->  Parallel Seq Scan on p1_c1_c1
772          ->  Parallel Seq Scan on p1_c1_c2
773          ->  Parallel Seq Scan on p1_c3_c1
774          ->  Parallel Seq Scan on p1_c3_c2
775 (12 rows)
776
777 /*+Parallel(p1 0 hard)*/
778 EXPLAIN (COSTS false) SELECT * FROM p1;
779 LOG:  pg_hint_plan:
780 used hint:
781 Parallel(p1 0 hard)
782 not used hint:
783 duplication hint:
784 error hint:
785
786          QUERY PLAN         
787 ----------------------------
788  Append
789    ->  Seq Scan on p1
790    ->  Seq Scan on p1_c1
791    ->  Seq Scan on p1_c2
792    ->  Seq Scan on p1_c3
793    ->  Seq Scan on p1_c4
794    ->  Seq Scan on p1_c1_c1
795    ->  Seq Scan on p1_c1_c2
796    ->  Seq Scan on p1_c3_c1
797    ->  Seq Scan on p1_c3_c2
798 (10 rows)
799
800 -- Errors
801 /*+Parallel(p1 100x hard)Parallel(p1 -1000 hard)Parallel(p1 1000000 hard)
802    Parallel(p1 8 hoge)Parallel(p1)Parallel(p1 100 soft x)*/
803 EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
804 INFO:  pg_hint_plan: hint syntax error at or near "100x"
805 DETAIL:  number of workers must be a number: Parallel
806 INFO:  pg_hint_plan: hint syntax error at or near "-1000"
807 DETAIL:  number of workers must be positive: Parallel
808 INFO:  pg_hint_plan: hint syntax error at or near "1000000"
809 DETAIL:  number of workers = 1000000 is larger than max_worker_processes(8): Parallel
810 INFO:  pg_hint_plan: hint syntax error at or near "hoge"
811 DETAIL:  enforcement must be soft or hard: Parallel
812 INFO:  pg_hint_plan: hint syntax error at or near ")"
813 DETAIL:  wrong number of arguments (1): Parallel
814 INFO:  pg_hint_plan: hint syntax error at or near ")"
815 DETAIL:  wrong number of arguments (4): Parallel
816 LOG:  pg_hint_plan:
817 used hint:
818 not used hint:
819 duplication hint:
820 error hint:
821 Parallel(p1 100x hard)
822 Parallel(p1 -1000 hard)
823 Parallel(p1 1000000 hard)
824 Parallel(p1 8 soft)
825 Parallel()
826 Parallel()
827
828                 QUERY PLAN                 
829 -------------------------------------------
830  Gather
831    Workers Planned: 1
832    ->  Append
833          ->  Parallel Seq Scan on p1
834          ->  Parallel Seq Scan on p1_c1
835          ->  Parallel Seq Scan on p1_c2
836          ->  Parallel Seq Scan on p1_c3
837          ->  Parallel Seq Scan on p1_c4
838          ->  Parallel Seq Scan on p1_c1_c1
839          ->  Parallel Seq Scan on p1_c1_c2
840          ->  Parallel Seq Scan on p1_c3_c1
841          ->  Parallel Seq Scan on p1_c3_c2
842          ->  Parallel Seq Scan on p2
843          ->  Parallel Seq Scan on p2_c1
844          ->  Parallel Seq Scan on p2_c2
845          ->  Parallel Seq Scan on p2_c3
846          ->  Parallel Seq Scan on p2_c4
847          ->  Parallel Seq Scan on p2_c1_c1
848          ->  Parallel Seq Scan on p2_c1_c2
849          ->  Parallel Seq Scan on p2_c3_c1
850          ->  Parallel Seq Scan on p2_c3_c2
851 (21 rows)
852
853 ALTER SYSTEM SET session_preload_libraries TO DEFAULT;
854 SELECT pg_reload_conf();
855  pg_reload_conf 
856 ----------------
857  t
858 (1 row)
859