@@ -607,7 +607,7 @@ class PlannerActionsVisitorImpl
607607
608608 NodeNameAndNodeMinLevel visitColumn (const QueryTreeNodePtr & node);
609609
610- NodeNameAndNodeMinLevel visitConstant (const QueryTreeNodePtr & node);
610+ NodeNameAndNodeMinLevel visitConstant (const QueryTreeNodePtr & node, const std::string & override_column_name = {} );
611611
612612 NodeNameAndNodeMinLevel visitLambda (const QueryTreeNodePtr & node);
613613
@@ -675,8 +675,17 @@ PlannerActionsVisitorImpl::NodeNameAndNodeMinLevel PlannerActionsVisitorImpl::vi
675675{
676676 auto column_node_name = action_node_name_helper.calculateActionNodeName (node);
677677 const auto & column_node = node->as <ColumnNode &>();
678- if (column_node.hasExpression () && !use_column_identifier_as_action_node_name)
679- return visitImpl (column_node.getExpression ());
678+ if (column_node.hasExpression ())
679+ {
680+ auto expression = column_node.getExpression ();
681+ // / In case of constant expression, prefer constant value from QueryTree vs. re-calculating the expression.
682+ // / It is possible that during the execution of distributed queries
683+ // / source columns from constant expression are removed, so that the attempt to recalculate it fails.
684+ if (expression->getNodeType () == QueryTreeNodeType::CONSTANT)
685+ return visitConstant (expression, column_node_name);
686+ else if (!use_column_identifier_as_action_node_name)
687+ return visitImpl (expression);
688+ }
680689 Int64 actions_stack_size = static_cast <Int64>(actions_stack.size () - 1 );
681690 for (Int64 i = actions_stack_size; i >= 0 ; --i)
682691 {
@@ -694,12 +703,12 @@ PlannerActionsVisitorImpl::NodeNameAndNodeMinLevel PlannerActionsVisitorImpl::vi
694703 return {column_node_name, Levels (0 )};
695704}
696705
697- PlannerActionsVisitorImpl::NodeNameAndNodeMinLevel PlannerActionsVisitorImpl::visitConstant (const QueryTreeNodePtr & node)
706+ PlannerActionsVisitorImpl::NodeNameAndNodeMinLevel PlannerActionsVisitorImpl::visitConstant (const QueryTreeNodePtr & node, const std::string & override_column_name )
698707{
699708 const auto & constant_node = node->as <ConstantNode &>();
700709 const auto & constant_type = constant_node.getResultType ();
701710
702- auto constant_node_name = [&]()
711+ auto constant_node_name = !override_column_name. empty () ? override_column_name : [&]()
703712 {
704713 /* To ensure that headers match during distributed query we need to simulate action node naming on
705714 * secondary servers. If we don't do that headers will mismatch due to constant folding.
0 commit comments