@@ -77,7 +77,7 @@ struct JoinExpressionActions
7777
7878 JoinExpressionActions clone () const
7979 {
80- return JoinExpressionActions (
80+ return JoinExpressionActions (
8181 std::make_unique<ActionsDAG>(left_pre_join_actions->clone ()),
8282 std::make_unique<ActionsDAG>(right_pre_join_actions->clone ()),
8383 std::make_unique<ActionsDAG>(post_join_actions->clone ())
@@ -117,7 +117,11 @@ class JoinActionRef
117117 void serialize (WriteBuffer & out, const ActionsDAGRawPtrs & dags) const ;
118118 static JoinActionRef deserialize (ReadBuffer & in, const ActionsDAGRawPtrs & dags);
119119
120+ JoinActionRef clone (const ActionsDAG * actions_dag_) const ;
121+
120122private:
123+ JoinActionRef (const ActionsDAG * actions_dag_, const String & column_name_);
124+
121125 const ActionsDAG * actions_dag = nullptr ;
122126 String column_name;
123127};
@@ -148,32 +152,10 @@ struct JoinCondition
148152 // / Unlike the join predicates, these conditions can be arbitrary expressions.
149153 std::vector<JoinActionRef> residual_conditions;
150154
151- void fixReferences (const JoinExpressionActions & expression_actions)
152- {
153- for (auto & predicate : predicates)
154- {
155- predicate.left_node = JoinActionRef (&expression_actions.left_pre_join_actions ->findInOutputs (predicate.left_node .getColumnName ()), expression_actions.left_pre_join_actions .get ());
156- predicate.right_node = JoinActionRef (&expression_actions.right_pre_join_actions ->findInOutputs (predicate.right_node .getColumnName ()), expression_actions.right_pre_join_actions .get ());
157- }
158-
159- for (auto & condition: left_filter_conditions)
160- {
161- condition = JoinActionRef (&expression_actions.left_pre_join_actions ->findInOutputs (condition.getColumnName ()), expression_actions.left_pre_join_actions .get ());
162- }
163-
164- for (auto & condition: right_filter_conditions)
165- {
166- condition = JoinActionRef (&expression_actions.right_pre_join_actions ->findInOutputs (condition.getColumnName ()), expression_actions.right_pre_join_actions .get ());
167- }
168-
169- for (auto & condition: residual_conditions)
170- {
171- condition = JoinActionRef (&expression_actions.post_join_actions ->findInOutputs (condition.getColumnName ()), expression_actions.post_join_actions .get ());
172- }
173- }
174-
175155 void serialize (WriteBuffer & out, const JoinActionRef::ActionsDAGRawPtrs & dags) const ;
176156 static JoinCondition deserialize (ReadBuffer & in, const JoinActionRef::ActionsDAGRawPtrs & dags);
157+
158+ JoinCondition clone (const JoinExpressionActions & expression_actions) const ;
177159};
178160
179161struct JoinExpression
@@ -192,6 +174,8 @@ struct JoinExpression
192174
193175 void serialize (WriteBuffer & out, const JoinActionRef::ActionsDAGRawPtrs & dags) const ;
194176 static JoinExpression deserialize (ReadBuffer & in, const JoinActionRef::ActionsDAGRawPtrs & dags);
177+
178+ JoinExpression clone (const JoinExpressionActions & expression_copy) const ;
195179};
196180
197181struct JoinInfo
@@ -208,6 +192,11 @@ struct JoinInfo
208192 // / The locality of the join (e.g., LOCAL, GLOBAL)
209193 JoinLocality locality;
210194
195+ JoinInfo clone (const JoinExpressionActions & expression_actions) const
196+ {
197+ return JoinInfo{ expression.clone (expression_actions), kind, strictness, locality};
198+ }
199+
211200 void serialize (WriteBuffer & out, const JoinActionRef::ActionsDAGRawPtrs & dags) const ;
212201 static JoinInfo deserialize (ReadBuffer & in, const JoinActionRef::ActionsDAGRawPtrs & dags);
213202};
0 commit comments