OSDN Git Service

Improve error handling of Parallel hint
authorKyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Fri, 10 Feb 2017 02:06:05 +0000 (11:06 +0900)
committerKyotaro Horiguchi <horiguchi.kyotaro@lab.ntt.co.jp>
Fri, 10 Feb 2017 08:02:50 +0000 (17:02 +0900)
Improve poor error report for Parallel hint.

expected/ut-W.out
pg_hint_plan.c
sql/ut-W.sql

index 4d22b77..93d1f1a 100644 (file)
@@ -726,6 +726,59 @@ error hint:
    ->  Seq Scan on p1_c3_c2
 (10 rows)
 
+-- Errors
+/*+Parallel(p1 100x hard)Parallel(p1 -1000 hard)Parallel(p1 1000000 hard)
+   Parallel(p1 10 hoge)Parallel(p1)Parallel(p1 100 soft x)*/
+EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
+INFO:  pg_hint_plan: hint syntax error at or near "100x"
+DETAIL:  number of workers must be a number: Parallel
+INFO:  pg_hint_plan: hint syntax error at or near "-1000"
+DETAIL:  number of workers must be positive: Parallel
+INFO:  pg_hint_plan: hint syntax error at or near "1000000"
+DETAIL:  number of workers = 1000000 is larger than max_worker_processes(100): Parallel
+INFO:  pg_hint_plan: hint syntax error at or near "hoge"
+DETAIL:  enforcement must be soft or hard: Parallel
+INFO:  pg_hint_plan: hint syntax error at or near ")"
+DETAIL:  wrong number of arguments (1): Parallel
+INFO:  pg_hint_plan: hint syntax error at or near ")"
+DETAIL:  wrong number of arguments (4): Parallel
+LOG:  pg_hint_plan:
+used hint:
+not used hint:
+duplication hint:
+error hint:
+Parallel(p1 100x hard)
+Parallel(p1 -1000 hard)
+Parallel(p1 1000000 hard)
+Parallel(p1 10 hard)
+Parallel()
+Parallel()
+
+                QUERY PLAN                 
+-------------------------------------------
+ Gather
+   Workers Planned: 1
+   ->  Append
+         ->  Parallel Seq Scan on p1
+         ->  Parallel Seq Scan on p1_c1
+         ->  Parallel Seq Scan on p1_c2
+         ->  Parallel Seq Scan on p1_c3
+         ->  Parallel Seq Scan on p1_c4
+         ->  Parallel Seq Scan on p1_c1_c1
+         ->  Parallel Seq Scan on p1_c1_c2
+         ->  Parallel Seq Scan on p1_c3_c1
+         ->  Parallel Seq Scan on p1_c3_c2
+         ->  Parallel Seq Scan on p2
+         ->  Parallel Seq Scan on p2_c1
+         ->  Parallel Seq Scan on p2_c2
+         ->  Parallel Seq Scan on p2_c3
+         ->  Parallel Seq Scan on p2_c4
+         ->  Parallel Seq Scan on p2_c1_c1
+         ->  Parallel Seq Scan on p2_c1_c2
+         ->  Parallel Seq Scan on p2_c3_c1
+         ->  Parallel Seq Scan on p2_c3_c2
+(21 rows)
+
 ALTER SYSTEM SET session_preload_libraries TO DEFAULT;
 SELECT pg_reload_conf();
  pg_reload_conf 
index 61820a8..c3988f9 100644 (file)
@@ -2345,9 +2345,9 @@ ParallelHintParse(ParallelHint *hint, HintState *hstate, Query *parse,
 
        if (length < 2 || length > 3)
        {
-               hint_ereport(str,
-                                        ("Wrong number of arguments for %s hint.",
-                                         hint->base.keyword));
+               hint_ereport(")",
+                                        ("wrong number of arguments (%d): %s",
+                                         length,  hint->base.keyword));
                hint->base.state = HINT_STATE_ERROR;
                return str;
        }
@@ -2357,11 +2357,21 @@ ParallelHintParse(ParallelHint *hint, HintState *hstate, Query *parse,
        /* The second parameter is number of workers */
        hint->nworkers_str = list_nth(name_list, 1);
        nworkers = strtod(hint->nworkers_str, &end_ptr);
-       if (*end_ptr || nworkers < 0)
+       if (*end_ptr || nworkers < 0 || nworkers > max_worker_processes)
        {
-               hint_ereport(hint->nworkers_str,
-                                        ("number of workers must be a positive integer: %s",
-                                         hint->base.keyword));
+               if (*end_ptr)
+                       hint_ereport(hint->nworkers_str,
+                                                ("number of workers must be a number: %s",
+                                                 hint->base.keyword));
+               else if (nworkers < 0)
+                       hint_ereport(hint->nworkers_str,
+                                                ("number of workers must be positive: %s",
+                                                 hint->base.keyword));
+               if ( nworkers > max_worker_processes)
+                       hint_ereport(hint->nworkers_str,
+                                                ("number of workers = %d is larger than max_worker_processes(%d): %s",
+                                                 nworkers, max_worker_processes, hint->base.keyword));
+
                hint->base.state = HINT_STATE_ERROR;
                return str;
        }
@@ -2379,8 +2389,9 @@ ParallelHintParse(ParallelHint *hint, HintState *hstate, Query *parse,
                        force_parallel = true;
                else if (strcasecmp(modeparam, "soft") != 0)
                {
-                       hint_ereport(str,
-                                                ("The mode of Worker hint must be soft or hard."));
+                       hint_ereport(modeparam,
+                                                ("enforcement must be soft or hard: %s",
+                                                        hint->base.keyword));
                        hint->base.state = HINT_STATE_ERROR;
                        return str;
                }
index 3652089..23e2f63 100644 (file)
@@ -130,5 +130,10 @@ EXPLAIN (COSTS false) SELECT * FROM p1;
 /*+Parallel(p1 0 hard)*/
 EXPLAIN (COSTS false) SELECT * FROM p1;
 
+-- Errors
+/*+Parallel(p1 100x hard)Parallel(p1 -1000 hard)Parallel(p1 1000000 hard)
+   Parallel(p1 10 hoge)Parallel(p1)Parallel(p1 100 soft x)*/
+EXPLAIN (COSTS false) SELECT id FROM p1 UNION ALL SELECT id FROM p2;
+
 ALTER SYSTEM SET session_preload_libraries TO DEFAULT;
 SELECT pg_reload_conf();