in ext/pg_query/pg_query_normalize.c [299:371]
static bool const_record_walker(Node *node, pgssConstLocations *jstate)
{
bool result;
MemoryContext normalize_context = CurrentMemoryContext;
if (node == NULL) return false;
if (IsA(node, A_Const))
{
RecordConstLocation(jstate, castNode(A_Const, node)->location);
}
else if (IsA(node, ParamRef))
{
/* Track the highest ParamRef number */
if (((ParamRef *) node)->number > jstate->highest_extern_param_id)
jstate->highest_extern_param_id = castNode(ParamRef, node)->number;
}
else if (IsA(node, DefElem))
{
DefElem * defElem = (DefElem *) node;
if (defElem->arg != NULL && IsA(defElem->arg, String)) {
for (int i = defElem->location; i < jstate->query_len; i++) {
if (jstate->query[i] == '\'') {
RecordConstLocation(jstate, i);
break;
}
}
}
return const_record_walker((Node *) ((DefElem *) node)->arg, jstate);
}
else if (IsA(node, RawStmt))
{
return const_record_walker((Node *) ((RawStmt *) node)->stmt, jstate);
}
else if (IsA(node, VariableSetStmt))
{
return const_record_walker((Node *) ((VariableSetStmt *) node)->args, jstate);
}
else if (IsA(node, CopyStmt))
{
return const_record_walker((Node *) ((CopyStmt *) node)->query, jstate);
}
else if (IsA(node, ExplainStmt))
{
return const_record_walker((Node *) ((ExplainStmt *) node)->query, jstate);
}
else if (IsA(node, CreateRoleStmt))
{
return const_record_walker((Node *) ((CreateRoleStmt *) node)->options, jstate);
}
else if (IsA(node, AlterRoleStmt))
{
return const_record_walker((Node *) ((AlterRoleStmt *) node)->options, jstate);
}
else if (IsA(node, DeclareCursorStmt))
{
return const_record_walker((Node *) ((DeclareCursorStmt *) node)->query, jstate);
}
PG_TRY();
{
result = raw_expression_tree_walker(node, const_record_walker, (void*) jstate);
}
PG_CATCH();
{
MemoryContextSwitchTo(normalize_context);
result = false;
FlushErrorState();
}
PG_END_TRY();
return result;
}