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.
This commit is contained in:
Sven Klemm 2022-02-23 17:33:45 +01:00 committed by Sven Klemm
parent 3f303c7d42
commit 91820e26f6
5 changed files with 78 additions and 13 deletions

View File

@ -168,7 +168,7 @@ ts_chunk_append_path_create(PlannerInfo *root, RelOptInfo *rel, Hypertable *ht,
children = castNode(MergeAppendPath, subpath)->subpaths; children = castNode(MergeAppendPath, subpath)->subpaths;
break; break;
default: 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; break;
} }

View File

@ -337,8 +337,7 @@ ts_chunk_append_get_scan_plan(Plan *plan)
return NULL; return NULL;
break; break;
default: default:
elog(ERROR, "invalid child of chunk append: %u", nodeTag(plan)); elog(ERROR, "invalid child of chunk append: %s", ts_get_node_name((Node *) plan));
return NULL;
break;
} }
pg_unreachable();
} }

View File

@ -190,7 +190,9 @@ ca_append_begin(CustomScanState *node, EState *estate, int eflags)
*/ */
return; return;
default: 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; break;
} }
default: 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; break;
} }
} }
@ -406,8 +410,8 @@ constraint_aware_append_plan_create(PlannerInfo *root, RelOptInfo *rel, CustomPa
break; break;
default: default:
elog(ERROR, elog(ERROR,
"invalid child of constraint-aware append: %u", "invalid child of constraint-aware append: %s",
nodeTag(linitial(custom_plans))); ts_get_node_name((Node *) linitial(custom_plans)));
break; break;
} }
@ -454,7 +458,9 @@ constraint_aware_append_plan_create(PlannerInfo *root, RelOptInfo *rel, CustomPa
break; break;
} }
default: 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; break;
} }
} }
@ -513,7 +519,9 @@ ts_constraint_aware_append_path_create(PlannerInfo *root, Path *subpath)
case T_MergeAppendPath: case T_MergeAppendPath:
break; break;
default: 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; break;
} }

View File

@ -944,8 +944,58 @@ ts_relation_size(Oid relid)
const char * const char *
ts_get_node_name(Node *node) ts_get_node_name(Node *node)
{ {
/* tags are defined in nodes/nodes.h postgres source */
switch (nodeTag(node)) 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(IndexPath);
NODE_CASE(BitmapHeapPath); NODE_CASE(BitmapHeapPath);
NODE_CASE(BitmapAndPath); NODE_CASE(BitmapAndPath);
@ -977,6 +1027,7 @@ ts_get_node_name(Node *node)
NODE_CASE(LockRowsPath); NODE_CASE(LockRowsPath);
NODE_CASE(ModifyTablePath); NODE_CASE(ModifyTablePath);
NODE_CASE(LimitPath); NODE_CASE(LimitPath);
case T_Path: case T_Path:
switch (castNode(Path, node)->pathtype) switch (castNode(Path, node)->pathtype)
{ {
@ -991,8 +1042,10 @@ ts_get_node_name(Node *node)
default: default:
return psprintf("Path (%d)", castNode(Path, node)->pathtype); return psprintf("Path (%d)", castNode(Path, node)->pathtype);
} }
case T_CustomPath: case T_CustomPath:
return psprintf("CustomPath (%s)", castNode(CustomPath, node)->methods->CustomName); return psprintf("CustomPath (%s)", castNode(CustomPath, node)->methods->CustomName);
default: default:
return psprintf("Node (%d)", nodeTag(node)); return psprintf("Node (%d)", nodeTag(node));
} }

View File

@ -23,6 +23,7 @@
#include "cache.h" #include "cache.h"
#include "hypertable.h" #include "hypertable.h"
#include "hypertable_cache.h" #include "hypertable_cache.h"
#include "utils.h"
/* /*
* AsyncAppend provides an asynchronous API during query execution that * 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 */ /* Data scan state can be buried under AggState or SortState */
return find_data_node_scan_state_child(state->lefttree); return find_data_node_scan_state_child(state->lefttree);
default: 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; num_child_plans = mstate->ms_nplans;
} }
else 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++) for (i = 0; i < num_child_plans; i++)
dn_plans = lappend(dn_plans, find_data_node_scan_state_child(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; cscan->custom_plans = custom_plans;
subplan = linitial(custom_plans); subplan = linitial(custom_plans);
if (!(IsA(subplan, MergeAppend) || IsA(subplan, Append))) 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 */ /* input target list */
cscan->custom_scan_tlist = subplan->targetlist; cscan->custom_scan_tlist = subplan->targetlist;