From ef252bef9f46cdf8474c22929ea72ceed1d3a767 Mon Sep 17 00:00:00 2001 From: Evgeny Zverev Date: Fri, 29 Dec 2023 14:11:27 +0300 Subject: [PATCH 1/2] YQL-16218 fix SqlIn for tuples --- .../yql_opt_peephole_physical.cpp | 29 +++++++++++++++---- 1 file changed, 24 insertions(+), 5 deletions(-) diff --git a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp index 0a148c90f24d..e60024109e2e 100644 --- a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp +++ b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp @@ -1813,15 +1813,34 @@ TExprNode::TPtr BuildDictOverList(TPositionHandle pos, const TExprNode::TPtr& co TExprNode::TPtr BuildDictOverTuple(TExprNode::TPtr&& collection, const TTypeAnnotationNode*& dictKeyType, TExprContext& ctx) { - if (!collection->GetTypeAnn()->Cast()->GetSize()) { + const auto pos = collection->Pos(); + const auto tupleType = collection->GetTypeAnn()->Cast(); + if (!tupleType->GetSize()) { dictKeyType = nullptr; return nullptr; } - - dictKeyType = CommonTypeForChildren(*collection, ctx); + TTypeAnnotationNode::TListType types(tupleType->GetItems()); + dictKeyType = CommonType(pos, types, ctx); YQL_ENSURE(dictKeyType, "Uncompatible colllection elements."); - const auto pos = collection->Pos(); - return ctx.NewCallable(pos, "DictFromKeys", {ExpandType(pos, *dictKeyType, ctx), std::move(collection)}); + + TExprNode::TPtr tuple; + if (collection->IsList()) { + tuple = collection; + } else{ + TExprNode::TListType items; + items.reserve(tupleType->GetSize()); + for (size_t i = 0; i != tupleType->GetSize(); ++i) { + items.push_back( + ctx.NewCallable( + pos, + "Nth", + {collection, ctx.NewAtom(pos, ToString(i))} + ) + ); + } + tuple = ctx.NewList(pos, std::move(items)); + } + return ctx.NewCallable(pos, "DictFromKeys", {ExpandType(pos, *dictKeyType, ctx), std::move(tuple)}); } TExprNode::TPtr ExpandSqlIn(const TExprNode::TPtr& input, TExprContext& ctx) { From 674f875f5839aa95287e4e8aeda0738aee574caf Mon Sep 17 00:00:00 2001 From: Evgeny Zverev Date: Fri, 29 Dec 2023 17:26:40 +0300 Subject: [PATCH 2/2] fix typos --- .../yql/core/peephole_opt/yql_opt_peephole_physical.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp index e60024109e2e..43062171c0ec 100644 --- a/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp +++ b/ydb/library/yql/core/peephole_opt/yql_opt_peephole_physical.cpp @@ -1821,12 +1821,12 @@ TExprNode::TPtr BuildDictOverTuple(TExprNode::TPtr&& collection, const TTypeAnno } TTypeAnnotationNode::TListType types(tupleType->GetItems()); dictKeyType = CommonType(pos, types, ctx); - YQL_ENSURE(dictKeyType, "Uncompatible colllection elements."); + YQL_ENSURE(dictKeyType, "Uncompatible collection elements."); TExprNode::TPtr tuple; if (collection->IsList()) { tuple = collection; - } else{ + } else { TExprNode::TListType items; items.reserve(tupleType->GetSize()); for (size_t i = 0; i != tupleType->GetSize(); ++i) { @@ -1834,7 +1834,7 @@ TExprNode::TPtr BuildDictOverTuple(TExprNode::TPtr&& collection, const TTypeAnno ctx.NewCallable( pos, "Nth", - {collection, ctx.NewAtom(pos, ToString(i))} + {collection, ctx.NewAtom(pos, ui32(i))} ) ); }