@@ -807,17 +807,20 @@ bool IsSuitableToCollectProjection(TExprBase node) {
807807// Collects all operations for projections and returns a vector of pair - [columName, olap operation].
808808TVector<std::pair<TString, TExprNode::TPtr>> CollectOlapOperationsForProjections (const TExprNode::TPtr& node, const TExprNode& arg,
809809 TNodeOnNodeOwnedMap& replaces,
810- const THashSet<TString>& predicateMembers, TExprContext& ctx) {
810+ const THashSet<TString>& predicateMembers,
811+ TExprContext& ctx) {
811812 auto asStructPred = [](const TExprNode::TPtr& node) -> bool { return !!TMaybeNode<TCoAsStruct>(node); };
812813 auto memberPred = [](const TExprNode::TPtr& node) { return !!TMaybeNode<TCoMember>(node); };
813814 THashSet<TString> projectionMembers;
815+ THashSet<TString> notSuitableToPushMembers;
814816 ui32 nextMemberId = 0 ;
815817
816818 TVector<std::pair<TString, TExprNode::TPtr>> olapOperationsForProjections;
817819 // Expressions for projections are placed in `AsStruct` callable.
818820 if (auto asStruct = FindNode (node, asStructPred)) {
819821 // Process each child for `AsStruct` callable.
820822 for (auto child : TExprBase (asStruct).Cast <TCoAsStruct>()) {
823+ bool memberCollected = false ;
821824 if (IsSuitableToCollectProjection (child.Item (1 ))) {
822825 // Search for the `TCoMember` in expression, we need expression with only one `TCoMember`.
823826 if (auto originalMembers = FindNodes (child.Item (1 ).Ptr (), memberPred); originalMembers.size () == 1 ) {
@@ -834,24 +837,39 @@ TVector<std::pair<TString, TExprNode::TPtr>> CollectOlapOperationsForProjections
834837 projectionMembers.insert (originalMemberName);
835838 }
836839
840+ // clang-format off
837841 auto newMember = Build<TCoMember>(ctx, node->Pos ())
838842 .Struct (originalMember.Struct ())
839843 .Name <TCoAtom>()
840844 .Value (originalMemberName)
841845 .Build ()
842846 .Done ();
847+ // clang-format on
843848
844849 auto olapOperation = olapOperations.front ();
845850 // Replace full expression with only member.
846851 replaces[child.Item (1 ).Raw ()] = newMember.Ptr ();
847852 olapOperationsForProjections.emplace_back (TString (newMember.Name ()), olapOperation.Ptr ());
853+ memberCollected = true ;
848854
849855 YQL_CLOG (TRACE, ProviderKqp)
850856 << " [OLAP PROJECTION] Operation in olap dialect: " << KqpExprToPrettyString (olapOperation, ctx);
851857 }
852858 }
853859 }
854860 }
861+ if (!memberCollected) {
862+ auto members = FindNodes (child.Item (1 ).Ptr (), memberPred);
863+ for (const auto & member : members) {
864+ notSuitableToPushMembers.insert (TString (TExprBase (member).Cast <TCoMember>().Name ()));
865+ }
866+ }
867+ }
868+ }
869+
870+ for (const auto & [colName, expr] : olapOperationsForProjections) {
871+ if (notSuitableToPushMembers.count (colName)) {
872+ return {};
855873 }
856874 }
857875
0 commit comments