From 91820e26f663eb2210080092b75a290a491424f6 Mon Sep 17 00:00:00 2001 From: Sven Klemm Date: Wed, 23 Feb 2022 17:33:45 +0100 Subject: [PATCH] Improve planner error messages regarding nodes Change error messages when unexpected nodes are encountered to actually show the node name instead of the node id. --- src/nodes/chunk_append/chunk_append.c | 2 +- src/nodes/chunk_append/planner.c | 5 +- .../constraint_aware_append.c | 20 ++++--- src/utils.c | 53 +++++++++++++++++++ tsl/src/nodes/async_append.c | 11 ++-- 5 files changed, 78 insertions(+), 13 deletions(-) diff --git a/src/nodes/chunk_append/chunk_append.c b/src/nodes/chunk_append/chunk_append.c index 31adcf73a..ae867d41b 100644 --- a/src/nodes/chunk_append/chunk_append.c +++ b/src/nodes/chunk_append/chunk_append.c @@ -168,7 +168,7 @@ ts_chunk_append_path_create(PlannerInfo *root, RelOptInfo *rel, Hypertable *ht, children = castNode(MergeAppendPath, subpath)->subpaths; break; default: - elog(ERROR, "invalid child of chunk append: %u", nodeTag(subpath)); + elog(ERROR, "invalid child of chunk append: %s", ts_get_node_name((Node *) subpath)); break; } diff --git a/src/nodes/chunk_append/planner.c b/src/nodes/chunk_append/planner.c index a9f45f160..6311e5d31 100644 --- a/src/nodes/chunk_append/planner.c +++ b/src/nodes/chunk_append/planner.c @@ -337,8 +337,7 @@ ts_chunk_append_get_scan_plan(Plan *plan) return NULL; break; default: - elog(ERROR, "invalid child of chunk append: %u", nodeTag(plan)); - return NULL; - break; + elog(ERROR, "invalid child of chunk append: %s", ts_get_node_name((Node *) plan)); } + pg_unreachable(); } diff --git a/src/nodes/constraint_aware_append/constraint_aware_append.c b/src/nodes/constraint_aware_append/constraint_aware_append.c index 964d56307..6f2d6850f 100644 --- a/src/nodes/constraint_aware_append/constraint_aware_append.c +++ b/src/nodes/constraint_aware_append/constraint_aware_append.c @@ -190,7 +190,9 @@ ca_append_begin(CustomScanState *node, EState *estate, int eflags) */ return; default: - elog(ERROR, "invalid child of constraint-aware append: %u", nodeTag(subplan)); + elog(ERROR, + "invalid child of constraint-aware append: %s", + ts_get_node_name((Node *) subplan)); } /* @@ -257,7 +259,9 @@ ca_append_begin(CustomScanState *node, EState *estate, int eflags) break; } default: - elog(ERROR, "invalid child of constraint-aware append: %u", nodeTag(plan)); + elog(ERROR, + "invalid child of constraint-aware append: %s", + ts_get_node_name((Node *) plan)); break; } } @@ -406,8 +410,8 @@ constraint_aware_append_plan_create(PlannerInfo *root, RelOptInfo *rel, CustomPa break; default: elog(ERROR, - "invalid child of constraint-aware append: %u", - nodeTag(linitial(custom_plans))); + "invalid child of constraint-aware append: %s", + ts_get_node_name((Node *) linitial(custom_plans))); break; } @@ -454,7 +458,9 @@ constraint_aware_append_plan_create(PlannerInfo *root, RelOptInfo *rel, CustomPa break; } default: - elog(ERROR, "invalid child of constraint-aware append: %u", nodeTag(plan)); + elog(ERROR, + "invalid child of constraint-aware append: %s", + ts_get_node_name((Node *) plan)); break; } } @@ -513,7 +519,9 @@ ts_constraint_aware_append_path_create(PlannerInfo *root, Path *subpath) case T_MergeAppendPath: break; default: - elog(ERROR, "invalid child of constraint-aware append: %u", nodeTag(subpath)); + elog(ERROR, + "invalid child of constraint-aware append: %s", + ts_get_node_name((Node *) subpath)); break; } diff --git a/src/utils.c b/src/utils.c index 4bfd67aff..cf18a57e2 100644 --- a/src/utils.c +++ b/src/utils.c @@ -944,8 +944,58 @@ ts_relation_size(Oid relid) const char * ts_get_node_name(Node *node) { + /* tags are defined in nodes/nodes.h postgres source */ switch (nodeTag(node)) { + /* + * plan nodes (plannodes.h) + */ + NODE_CASE(Plan); + NODE_CASE(Result); + NODE_CASE(ProjectSet); + NODE_CASE(ModifyTable); + NODE_CASE(Append); + NODE_CASE(MergeAppend); + NODE_CASE(RecursiveUnion); + NODE_CASE(BitmapAnd); + NODE_CASE(BitmapOr); + NODE_CASE(Scan); + NODE_CASE(SeqScan); + NODE_CASE(SampleScan); + NODE_CASE(IndexScan); + NODE_CASE(IndexOnlyScan); + NODE_CASE(BitmapIndexScan); + NODE_CASE(BitmapHeapScan); + NODE_CASE(TidScan); + NODE_CASE(SubqueryScan); + NODE_CASE(FunctionScan); + NODE_CASE(ValuesScan); + NODE_CASE(TableFuncScan); + NODE_CASE(CteScan); + NODE_CASE(NamedTuplestoreScan); + NODE_CASE(WorkTableScan); + NODE_CASE(ForeignScan); + NODE_CASE(CustomScan); + NODE_CASE(Join); + NODE_CASE(NestLoop); + NODE_CASE(MergeJoin); + NODE_CASE(HashJoin); + NODE_CASE(Material); + NODE_CASE(Sort); + NODE_CASE(Group); + NODE_CASE(Agg); + NODE_CASE(WindowAgg); + NODE_CASE(Unique); + NODE_CASE(Gather); + NODE_CASE(GatherMerge); + NODE_CASE(Hash); + NODE_CASE(SetOp); + NODE_CASE(LockRows); + NODE_CASE(Limit); + + /* + * planner nodes (pathnodes.h) + */ NODE_CASE(IndexPath); NODE_CASE(BitmapHeapPath); NODE_CASE(BitmapAndPath); @@ -977,6 +1027,7 @@ ts_get_node_name(Node *node) NODE_CASE(LockRowsPath); NODE_CASE(ModifyTablePath); NODE_CASE(LimitPath); + case T_Path: switch (castNode(Path, node)->pathtype) { @@ -991,8 +1042,10 @@ ts_get_node_name(Node *node) default: return psprintf("Path (%d)", castNode(Path, node)->pathtype); } + case T_CustomPath: return psprintf("CustomPath (%s)", castNode(CustomPath, node)->methods->CustomName); + default: return psprintf("Node (%d)", nodeTag(node)); } diff --git a/tsl/src/nodes/async_append.c b/tsl/src/nodes/async_append.c index 79a3d59aa..40334646e 100644 --- a/tsl/src/nodes/async_append.c +++ b/tsl/src/nodes/async_append.c @@ -23,6 +23,7 @@ #include "cache.h" #include "hypertable.h" #include "hypertable_cache.h" +#include "utils.h" /* * AsyncAppend provides an asynchronous API during query execution that @@ -163,7 +164,9 @@ find_data_node_scan_state_child(PlanState *state) /* Data scan state can be buried under AggState or SortState */ return find_data_node_scan_state_child(state->lefttree); default: - elog(ERROR, "unexpected child node of Append or MergeAppend: %d", nodeTag(state)); + elog(ERROR, + "unexpected child node of Append or MergeAppend: %s", + ts_get_node_name((Node *) state->plan)); } } @@ -192,7 +195,9 @@ get_data_node_async_scan_states(AsyncAppendState *state) num_child_plans = mstate->ms_nplans; } else - elog(ERROR, "unexpected child node %u of AsyncAppend", nodeTag(state->subplan_state)); + elog(ERROR, + "unexpected child node of AsyncAppend: %s", + ts_get_node_name((Node *) state->subplan_state->plan)); for (i = 0; i < num_child_plans; i++) dn_plans = lappend(dn_plans, find_data_node_scan_state_child(child_plans[i])); @@ -331,7 +336,7 @@ async_append_plan_create(PlannerInfo *root, RelOptInfo *rel, CustomPath *best_pa cscan->custom_plans = custom_plans; subplan = linitial(custom_plans); if (!(IsA(subplan, MergeAppend) || IsA(subplan, Append))) - elog(ERROR, "unexpected child node of AsyncAppend"); + elog(ERROR, "unexpected child node of AsyncAppend: %s", ts_get_node_name((Node *) subplan)); /* input target list */ cscan->custom_scan_tlist = subplan->targetlist;