diff --git a/ydb/core/kqp/opt/logical/kqp_opt_log.cpp b/ydb/core/kqp/opt/logical/kqp_opt_log.cpp index 5546baa7db1c..2ea6edf076b5 100644 --- a/ydb/core/kqp/opt/logical/kqp_opt_log.cpp +++ b/ydb/core/kqp/opt/logical/kqp_opt_log.cpp @@ -193,7 +193,7 @@ class TKqpLogicalOptTransformer : public TOptimizeTransformerBase { } TMaybeNode ExpandWindowFunctions(TExprBase node, TExprContext& ctx) { - TExprBase output = DqExpandWindowFunctions(node, ctx, true); + TExprBase output = DqExpandWindowFunctions(node, ctx, TypesCtx, true); DumpAppliedRule("ExpandWindowFunctions", node.Ptr(), output.Ptr(), ctx); return output; } diff --git a/ydb/library/yql/core/common_opt/yql_co_flow2.cpp b/ydb/library/yql/core/common_opt/yql_co_flow2.cpp index a0e04b88960a..dfe6854be350 100644 --- a/ydb/library/yql/core/common_opt/yql_co_flow2.cpp +++ b/ydb/library/yql/core/common_opt/yql_co_flow2.cpp @@ -1758,22 +1758,32 @@ void RegisterCoFlowCallables2(TCallableOptimizerMap& map) { }; map["SessionWindowTraits"] = map["SortTraits"] = map["Lag"] = map["Lead"] = map["RowNumber"] = map["Rank"] = map["DenseRank"] = + map["CumeDist"] = map["PercentRank"] = map["NTile"] = [](const TExprNode::TPtr& node, TExprContext& ctx, TOptimizeContext& optCtx) { auto structType = node->Child(0)->GetTypeAnn()->Cast()->GetType() ->Cast()->GetItemType()->Cast(); - if (node->IsCallable("RowNumber")) { + if (node->IsCallable({"RowNumber", "CumeDist", "NTile"})) { if (structType->GetSize() == 0) { return node; } auto subsetType = ctx.MakeType(ctx.MakeType(TVector())); YQL_CLOG(DEBUG, Core) << "FieldSubset for " << node->Content(); - return ctx.Builder(node->Pos()) - .Callable(node->Content()) - .Add(0, ExpandType(node->Pos(), *subsetType, ctx)) - .Seal() - .Build(); + if (node->IsCallable("NTile")) { + return ctx.Builder(node->Pos()) + .Callable(node->Content()) + .Add(0, ExpandType(node->Pos(), *subsetType, ctx)) + .Add(1, node->TailPtr()) + .Seal() + .Build(); + } else { + return ctx.Builder(node->Pos()) + .Callable(node->Content()) + .Add(0, ExpandType(node->Pos(), *subsetType, ctx)) + .Seal() + .Build(); + } } TSet lambdaIndexes; diff --git a/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp b/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp index 9c07ffde0da7..e1b1f3c27fc5 100644 --- a/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp +++ b/ydb/library/yql/core/common_opt/yql_co_pgselect.cpp @@ -2691,17 +2691,30 @@ TExprNode::TPtr BuildWindows(TPositionHandle pos, const TExprNode::TPtr& list, c if (isAgg) { value = BuildAggregationTraits(pos, true, "", p, listTypeNode, &aggId, ctx, optCtx); } else { - if (name == "row_number") { + if (name == "row_number" || name == "cume_dist") { value = ctx.Builder(pos) - .Callable("RowNumber") + .Callable(name == "row_number" ? "RowNumber" : "CumeDist") .Callable(0, "TypeOf") - .Add(0, list) + .Add(0, list) + .Seal() + .Seal() + .Build(); + } else if (name == "ntile") { + value = ctx.Builder(pos) + .Callable("NTile") + .Callable(0, "TypeOf") + .Add(0, list) + .Seal() + .Callable(1, "Unwrap") + .Callable(0, "FromPg") + .Add(0, p.first->ChildPtr(3)) + .Seal() .Seal() .Seal() .Build(); - } else if (name == "rank" || name == "dense_rank") { + } else if (name == "rank" || name == "dense_rank" || name == "percent_rank") { value = ctx.Builder(pos) - .Callable((name == "rank") ? "Rank" : "DenseRank") + .Callable((name == "rank") ? "Rank" : (name == "dense_rank" ? "DenseRank" : "PercentRank")) .Callable(0, "TypeOf") .Add(0, list) .Seal() @@ -2804,6 +2817,32 @@ TExprNode::TPtr BuildWindows(TPositionHandle pos, const TExprNode::TPtr& list, c .Seal() .Seal() .Build(); + } else if (node->Head().Content() == "ntile") { + ret = ctx.Builder(node->Pos()) + .Callable("ToPg") + .Callable(0, "SafeCast") + .Add(0, ret) + .Atom(1, "Int32") + .Seal() + .Seal() + .Build(); + } else if (node->Head().Content() == "cume_dist" || node->Head().Content() == "percent_rank") { + if (node->Head().Content() == "percent_rank") { + ret = ctx.Builder(node->Pos()) + .Callable("Nanvl") + .Add(0, ret) + .Callable(1, "Double") + .Atom(0, "0.0") + .Seal() + .Seal() + .Build(); + } + + ret = ctx.Builder(node->Pos()) + .Callable("ToPg") + .Add(0, ret) + .Seal() + .Build(); } return ret; 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 0f889e56ca56..94d87dfdcfa7 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 @@ -8217,9 +8217,6 @@ struct TPeepHoleRules { {"FoldMap", &CleckClosureOnUpperLambdaOverList<2U>}, {"Fold1Map", &CleckClosureOnUpperLambdaOverList<1U, 2U>}, {"Chain1Map", &CleckClosureOnUpperLambdaOverList<1U, 2U>}, - {"CalcOverWindow", &ExpandCalcOverWindow}, - {"CalcOverSessionWindow", &ExpandCalcOverWindow}, - {"CalcOverWindowGroup", &ExpandCalcOverWindow}, {"PartitionsByKeys", &ExpandPartitionsByKeys}, {"DictItems", &MapForOptionalContainer}, {"DictKeys", &MapForOptionalContainer}, @@ -8283,7 +8280,10 @@ struct TPeepHoleRules { {"AggregateFinalize", &ExpandAggregatePeephole}, {"CostsOf", &ExpandCostsOf}, {"JsonQuery", &ExpandJsonQuery}, - {"MatchRecognize", &ExpandMatchRecognize} + {"MatchRecognize", &ExpandMatchRecognize}, + {"CalcOverWindow", &ExpandCalcOverWindow}, + {"CalcOverSessionWindow", &ExpandCalcOverWindow}, + {"CalcOverWindowGroup", &ExpandCalcOverWindow}, }; const TPeepHoleOptimizerMap SimplifyStageRules = { diff --git a/ydb/library/yql/core/services/yql_lineage.cpp b/ydb/library/yql/core/services/yql_lineage.cpp index 532c91927f2e..5468867e36d2 100644 --- a/ydb/library/yql/core/services/yql_lineage.cpp +++ b/ydb/library/yql/core/services/yql_lineage.cpp @@ -723,9 +723,9 @@ class TLineageScanner { const auto& list = f->Child(i); auto field = list->Head().Content(); auto& res = (*lineage.Fields)[field]; - if (list->Tail().IsCallable("RowNumber")) { + if (list->Tail().IsCallable({"RowNumber","CumeDist","NTile"})) { continue; - } else if (list->Tail().IsCallable({"Lag","Lead","Rank","DenseRank"})) { + } else if (list->Tail().IsCallable({"Lag","Lead","Rank","DenseRank","PercentRank"})) { const auto& lambda = list->Tail().Child(1); bool produceStruct = list->Tail().IsCallable({"Lag","Lead"}); MergeLineageFromUsedFields(lambda->Tail(), lambda->Head().Head(), innerLineage, res, produceStruct); diff --git a/ydb/library/yql/core/type_ann/type_ann_core.cpp b/ydb/library/yql/core/type_ann/type_ann_core.cpp index 41419dd6ccbd..139b75985ae1 100644 --- a/ydb/library/yql/core/type_ann/type_ann_core.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_core.cpp @@ -12315,6 +12315,9 @@ template Functions["RowNumber"] = &WinRowNumberWrapper; Functions["Rank"] = &WinRankWrapper; Functions["DenseRank"] = &WinRankWrapper; + Functions["PercentRank"] = &WinRankWrapper; + Functions["CumeDist"] = &WinRowNumberWrapper; + Functions["NTile"] = &WinNTileWrapper; Functions["Ascending"] = &PresortWrapper; Functions["Descending"] = &PresortWrapper; Functions["IsKeySwitch"] = &IsKeySwitchWrapper; diff --git a/ydb/library/yql/core/type_ann/type_ann_list.cpp b/ydb/library/yql/core/type_ann/type_ann_list.cpp index 8a48c6939c9c..55d0ab944e87 100644 --- a/ydb/library/yql/core/type_ann/type_ann_list.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_list.cpp @@ -540,7 +540,7 @@ namespace { const auto paramName = func->Child(0)->Content(); const auto calcSpec = func->Child(1); - YQL_ENSURE(calcSpec->IsCallable({"Lag", "Lead", "RowNumber", "Rank", "DenseRank", "WindowTraits"})); + YQL_ENSURE(calcSpec->IsCallable({"Lag", "Lead", "RowNumber", "Rank", "DenseRank", "WindowTraits", "PercentRank", "CumeDist", "NTile"})); auto traitsInputTypeNode = calcSpec->Child(0); YQL_ENSURE(traitsInputTypeNode->GetTypeAnn()); @@ -5948,7 +5948,7 @@ namespace { } auto currColumn = input->Child(i)->Child(0)->Content(); auto calcSpec = input->Child(i)->Child(1); - if (!calcSpec->IsCallable({"WindowTraits", "Lag", "Lead", "RowNumber", "Rank", "DenseRank", "Void"})) { + if (!calcSpec->IsCallable({"WindowTraits", "Lag", "Lead", "RowNumber", "Rank", "DenseRank", "PercentRank", "CumeDist", "NTile", "Void"})) { ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(calcSpec->Pos()), "Invalid traits or special function for calculation on window")); return IGraphTransformer::TStatus::Error; @@ -6305,6 +6305,26 @@ namespace { if (auto status = EnsureTypeRewrite(input->HeadRef(), ctx.Expr); status != IGraphTransformer::TStatus::Ok) { return status; } + input->SetTypeAnn(ctx.Expr.MakeType(input->IsCallable("CumeDist") ? EDataSlot::Double : EDataSlot::Uint64)); + return IGraphTransformer::TStatus::Ok; + } + + IGraphTransformer::TStatus WinNTileWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx) { + Y_UNUSED(output); + if (!EnsureArgsCount(*input, 2, ctx.Expr)) { + return IGraphTransformer::TStatus::Error; + } + + if (auto status = EnsureTypeRewrite(input->HeadRef(), ctx.Expr); status != IGraphTransformer::TStatus::Ok) { + return status; + } + + auto expectedType = ctx.Expr.MakeType(EDataSlot::Int64); + auto status = TryConvertTo(input->ChildRef(1), *expectedType, ctx.Expr); + if (status.Level != IGraphTransformer::TStatus::Ok) { + return status; + } + input->SetTypeAnn(ctx.Expr.MakeType(EDataSlot::Uint64)); return IGraphTransformer::TStatus::Ok; } @@ -6403,7 +6423,8 @@ namespace { return IGraphTransformer::TStatus::Repeat; } - const TTypeAnnotationNode* outputType = ctx.Expr.MakeType(EDataSlot::Uint64); + const TTypeAnnotationNode* outputType = ctx.Expr.MakeType(input->IsCallable("PercentRank") ? + EDataSlot::Double : EDataSlot::Uint64); if (!isAnsi && keyType->GetKind() == ETypeAnnotationKind::Optional) { outputType = ctx.Expr.MakeType(outputType); } diff --git a/ydb/library/yql/core/type_ann/type_ann_list.h b/ydb/library/yql/core/type_ann/type_ann_list.h index 98ac007c254c..7f5e508332e3 100644 --- a/ydb/library/yql/core/type_ann/type_ann_list.h +++ b/ydb/library/yql/core/type_ann/type_ann_list.h @@ -115,6 +115,7 @@ namespace NTypeAnnImpl { IGraphTransformer::TStatus WinLeadLagWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); IGraphTransformer::TStatus WinRowNumberWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); IGraphTransformer::TStatus WinRankWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); + IGraphTransformer::TStatus WinNTileWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); IGraphTransformer::TStatus HoppingCoreWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); IGraphTransformer::TStatus MultiHoppingCoreWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); IGraphTransformer::TStatus HoppingTraitsWrapper(const TExprNode::TPtr& input, TExprNode::TPtr& output, TContext& ctx); diff --git a/ydb/library/yql/core/type_ann/type_ann_pg.cpp b/ydb/library/yql/core/type_ann/type_ann_pg.cpp index f61572a99c3d..25a1f41e01dc 100644 --- a/ydb/library/yql/core/type_ann/type_ann_pg.cpp +++ b/ydb/library/yql/core/type_ann/type_ann_pg.cpp @@ -774,14 +774,6 @@ IGraphTransformer::TStatus PgWindowCallWrapper(const TExprNode::TPtr& input, TEx return IGraphTransformer::TStatus::Error; } - auto name = input->Child(4)->GetTypeAnn()->Cast()->GetName(); - if (name != "int4") { - ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Child(4)->Pos()), TStringBuilder() << - "Expected pgint4 type, but got: " << name)); - return IGraphTransformer::TStatus::Error; - } - - auto arg = input->Child(3)->GetTypeAnn(); if (arg->IsOptionalOrNull()) { input->SetTypeAnn(arg); @@ -796,6 +788,35 @@ IGraphTransformer::TStatus PgWindowCallWrapper(const TExprNode::TPtr& input, TEx } input->SetTypeAnn(ctx.Expr.MakeType(NPg::LookupType("int8").TypeId)); + } else if (name == "cume_dist" || name == "percent_rank") { + if (input->ChildrenSize() != 3) { + ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), + TStringBuilder() << "Expected no arguments in function " << name)); + return IGraphTransformer::TStatus::Error; + } + + input->SetTypeAnn(ctx.Expr.MakeType(NPg::LookupType("float8").TypeId)); + } else if (name == "ntile") { + if (input->ChildrenSize() != 4) { + ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), + TStringBuilder() << "Expected exactly one argument in function " << name)); + return IGraphTransformer::TStatus::Error; + } + + if (input->Child(3)->GetTypeAnn() && input->Child(3)->GetTypeAnn()->GetKind() == ETypeAnnotationKind::Pg) { + auto name = input->Child(3)->GetTypeAnn()->Cast()->GetName(); + if (name != "int4") { + ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Child(3)->Pos()), TStringBuilder() << + "Expected int4 type, but got: " << name)); + return IGraphTransformer::TStatus::Error; + } + } else { + ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Child(3)->Pos()), TStringBuilder() << + "Expected pg type, but got: " << input->Child(3)->GetTypeAnn()->GetKind())); + return IGraphTransformer::TStatus::Error; + } + + input->SetTypeAnn(ctx.Expr.MakeType(NPg::LookupType("int4").TypeId)); } else { ctx.Expr.AddError(TIssue(ctx.Expr.GetPosition(input->Pos()), TStringBuilder() << "Unsupported function: " << name)); diff --git a/ydb/library/yql/core/yql_opt_window.cpp b/ydb/library/yql/core/yql_opt_window.cpp index b92876b57c75..08d622aeef29 100644 --- a/ydb/library/yql/core/yql_opt_window.cpp +++ b/ydb/library/yql/core/yql_opt_window.cpp @@ -2,6 +2,8 @@ #include "yql_opt_utils.h" #include "yql_expr_type_annotation.h" +#include + #include namespace NYql { @@ -138,7 +140,7 @@ struct TRawTrait { TExprNode::TPtr CalculateLambda; TMaybe CalculateLambdaLead; // lead/lag for input to CalculateLambda; - + TVector Params; // NTile const TTypeAnnotationNode* OutputType = nullptr; @@ -268,16 +270,19 @@ TCalcOverWindowTraits ExtractCalcOverWindowTraits(const TExprNode::TPtr& frames, rawTraits.CalculateLambdaLead = lead; rawTraits.OutputType = traits->Child(1)->GetTypeAnn(); YQL_ENSURE(rawTraits.OutputType); - } else if (traits->IsCallable({"Rank", "DenseRank"})) { + } else if (traits->IsCallable({"Rank", "DenseRank", "PercentRank"})) { rawTraits.OutputType = traits->Child(1)->GetTypeAnn(); auto lambdaInputType = traits->Child(0)->GetTypeAnn()->Cast()->GetType()->Cast()->GetItemType(); auto lambda = ReplaceFirstLambdaArgWithCastStruct(*traits->Child(1), *lambdaInputType, ctx); rawTraits.CalculateLambda = ctx.ChangeChild(*traits, 1, std::move(lambda)); } else { - YQL_ENSURE(traits->IsCallable("RowNumber")); + YQL_ENSURE(traits->IsCallable({"RowNumber","CumeDist","NTile"})); rawTraits.CalculateLambda = traits; rawTraits.OutputType = traits->GetTypeAnn(); + for (ui32 i = 1; i < traits->ChildrenSize(); ++i) { + rawTraits.Params.push_back(traits->ChildPtr(i)); + } } } } @@ -295,6 +300,14 @@ TExprNode::TPtr BuildUint64(TPositionHandle pos, ui64 value, TExprContext& ctx) .Build(); } +TExprNode::TPtr BuildDouble(TPositionHandle pos, double value, TExprContext& ctx) { + return ctx.Builder(pos) + .Callable("Double") + .Atom(0, ToString(value)) + .Seal() + .Build(); +} + TExprNode::TPtr BuildQueuePeek(TPositionHandle pos, const TExprNode::TPtr& queue, ui64 index, const TExprNode::TPtr& dependsOn, TExprContext& ctx) { @@ -399,13 +412,28 @@ TExprNode::TPtr BuildInitLambdaForChain1Map(TPositionHandle pos, const TExprNode .Lambda() .Param("row") .List() - .Apply(0, calculateLambda) - .With(0) - .Apply(initStateLambda) - .With(0, "row") - .Seal() - .Done() - .Seal() + .Do([&](TExprNodeBuilder& parent)->TExprNodeBuilder& { + if (calculateLambda->Head().ChildrenSize() == 1) { + parent.Apply(0, calculateLambda) + .With(0) + .Apply(initStateLambda) + .With(0, "row") + .Seal() + .Done() + .Seal(); + } else { + parent.Apply(0, calculateLambda) + .With(0) + .Apply(initStateLambda) + .With(0, "row") + .Seal() + .Done() + .With(1, "row") + .Seal(); + } + + return parent; + }) .Apply(1, initStateLambda) .With(0, "row") .Seal() @@ -422,14 +450,30 @@ TExprNode::TPtr BuildUpdateLambdaForChain1Map(TPositionHandle pos, const TExprNo .Param("row") .Param("state") .List() - .Apply(0, calculateLambda) - .With(0) - .Apply(updateStateLambda) - .With(0, "row") - .With(1, "state") - .Seal() - .Done() - .Seal() + .Do([&](TExprNodeBuilder& parent)->TExprNodeBuilder& { + if (calculateLambda->Head().ChildrenSize() == 1) { + parent.Apply(0, calculateLambda) + .With(0) + .Apply(updateStateLambda) + .With(0, "row") + .With(1, "state") + .Seal() + .Done() + .Seal(); + } else { + parent.Apply(0, calculateLambda) + .With(0) + .Apply(updateStateLambda) + .With(0, "row") + .With(1, "state") + .Seal() + .Done() + .With(1, "row") + .Seal(); + } + + return parent; + }) .Apply(1, updateStateLambda) .With(0, "row") .With(1, "state") @@ -586,6 +630,128 @@ class TChain1MapTraitsRowNumber : public TChain1MapTraits { } }; +class TChain1MapTraitsCumeDist : public TChain1MapTraits { +public: + TChain1MapTraitsCumeDist(TStringBuf name, const TRawTrait& raw, const TString& partitionRowsColumn) + : TChain1MapTraits(name, raw.Pos) + , PartitionRowsColumn(partitionRowsColumn) + { + } + + // Lambda(row) -> AsTuple(output, state) + TExprNode::TPtr BuildInitLambda(const TExprNode::TPtr& dataQueue, TExprContext& ctx) const override { + Y_UNUSED(dataQueue); + return ctx.Builder(GetPos()) + .Lambda() + .Param("row") + .List() + .Callable(0, "/") + .Add(0, BuildDouble(GetPos(), 1.0, ctx)) + .Callable(1, "Member") + .Arg(0, "row") + .Atom(1, PartitionRowsColumn) + .Seal() + .Seal() + .Add(1, BuildUint64(GetPos(), 1, ctx)) + .Seal() + .Seal() + .Build(); + } + + // Lambda(row, state) -> AsTuple(output, state) + TExprNode::TPtr BuildUpdateLambda(const TExprNode::TPtr& dataQueue, TExprContext& ctx) const override { + Y_UNUSED(dataQueue); + return ctx.Builder(GetPos()) + .Lambda() + .Param("row") + .Param("state") + .List() + .Callable(0, "/") + .Callable(0, "SafeCast") + .Callable(0, "Inc") + .Arg(0, "state") + .Seal() + .Atom(1, "Double") + .Seal() + .Callable(1, "Member") + .Arg(0, "row") + .Atom(1, PartitionRowsColumn) + .Seal() + .Seal() + .Callable(1, "Inc") + .Arg(0, "state") + .Seal() + .Seal() + .Seal() + .Build(); + } + +private: + const TString PartitionRowsColumn; +}; + +class TChain1MapTraitsNTile : public TChain1MapTraits { +public: + TChain1MapTraitsNTile(TStringBuf name, const TRawTrait& raw, const TString& partitionRowsColumn) + : TChain1MapTraits(name, raw.Pos) + , PartitionRowsColumn(partitionRowsColumn) + { + YQL_ENSURE(raw.Params.size() == 1); + Param = raw.Params[0]; + } + + // Lambda(row) -> AsTuple(output, state) + TExprNode::TPtr BuildInitLambda(const TExprNode::TPtr& dataQueue, TExprContext& ctx) const override { + Y_UNUSED(dataQueue); + return ctx.Builder(GetPos()) + .Lambda() + .Param("row") + .List() + .Add(0, BuildUint64(GetPos(), 1, ctx)) + .Add(1, BuildUint64(GetPos(), 1, ctx)) + .Seal() + .Seal() + .Build(); + } + + // Lambda(row, state) -> AsTuple(output, state) + TExprNode::TPtr BuildUpdateLambda(const TExprNode::TPtr& dataQueue, TExprContext& ctx) const override { + Y_UNUSED(dataQueue); + return ctx.Builder(GetPos()) + .Lambda() + .Param("row") + .Param("state") + .List() + .Callable(0, "Inc") + .Callable(0, "Unwrap") + .Callable(0, "/") + .Callable(0, "*") + .Callable(0, "SafeCast") + .Add(0, Param) + .Atom(1, "Uint64") + .Seal() + .Arg(1, "state") + .Seal() + .Callable(1, "Member") + .Arg(0, "row") + .Atom(1, PartitionRowsColumn) + .Seal() + .Seal() + .Seal() + .Seal() + .Callable(1, "Inc") + .Arg(0, "state") + .Seal() + .Seal() + .Seal() + .Build(); + } + +private: + const TString PartitionRowsColumn; + TExprNode::TPtr Param; +}; + class TChain1MapTraitsRankBase : public TChain1MapTraits { public: TChain1MapTraitsRankBase(TStringBuf name, const TRawTrait& raw) @@ -796,6 +962,44 @@ class TChain1MapTraitsRank : public TChain1MapTraitsRankBase { } }; +class TChain1MapTraitsPercentRank : public TChain1MapTraitsRank { +public: + TChain1MapTraitsPercentRank(TStringBuf name, const TRawTrait& raw, const TString& partitionRowsColumn) + : TChain1MapTraitsRank(name, raw) + , PartitionRowsColumn(partitionRowsColumn) + { + } + + virtual TExprNode::TPtr BuildCalculateLambda(TExprContext& ctx) const { + return ctx.Builder(GetPos()) + .Lambda() + .Param("state") + .Param("row") + .Callable("/") + .Callable(0, "SafeCast") + .Callable(0, "Dec") + .Callable(0, "Nth") + .Arg(0, "state") + .Atom(1, "0") + .Seal() + .Seal() + .Atom(1, "Double") + .Seal() + .Callable(1, "Dec") + .Callable(0, "Member") + .Arg(0, "row") + .Atom(1, PartitionRowsColumn) + .Seal() + .Seal() + .Seal() + .Seal() + .Build(); + } + +private: + const TString PartitionRowsColumn; +}; + class TChain1MapTraitsDenseRank : public TChain1MapTraitsRankBase { public: TChain1MapTraitsDenseRank(TStringBuf name, const TRawTrait& raw) @@ -1247,7 +1451,8 @@ struct TQueueParams { const TTypeAnnotationNode* LagQueueItemType = nullptr; }; -TVector BuildFoldMapTraits(TQueueParams& queueParams, const TExprNode::TPtr& frames, TExprContext& ctx) { +TVector BuildFoldMapTraits(TQueueParams& queueParams, const TExprNode::TPtr& frames, + const TMaybe& partitionRowsColumn, TExprContext& ctx) { queueParams = {}; TVector result; @@ -1287,6 +1492,12 @@ TVector BuildFoldMapTraits(TQueueParams& queueParams, co result.push_back(new TChain1MapTraitsRowNumber(name, trait)); } else if (trait.CalculateLambda->IsCallable("Rank")) { result.push_back(new TChain1MapTraitsRank(name, trait)); + } else if (trait.CalculateLambda->IsCallable("CumeDist")) { + result.push_back(new TChain1MapTraitsCumeDist(name, trait, *partitionRowsColumn)); + } else if (trait.CalculateLambda->IsCallable("NTile")) { + result.push_back(new TChain1MapTraitsNTile(name, trait, *partitionRowsColumn)); + } else if (trait.CalculateLambda->IsCallable("PercentRank")) { + result.push_back(new TChain1MapTraitsPercentRank(name, trait, *partitionRowsColumn)); } else { YQL_ENSURE(trait.CalculateLambda->IsCallable("DenseRank")); result.push_back(new TChain1MapTraitsDenseRank(name, trait)); @@ -2301,8 +2512,108 @@ const TStructExprType* ApplyFramesToType(const TStructExprType& inputType, const return ctx.MakeType(resultItems); } +bool NeedPartitionRows(const TExprNode::TPtr& frames, TExprContext& ctx) { + if (frames->ChildrenSize() == 0) { + return false; + } + + TCalcOverWindowTraits traits = ExtractCalcOverWindowTraits(frames, ctx); + for (const auto& item : traits.RawTraits) { + const TRawTrait& trait = item.second; + if (trait.CalculateLambda->IsCallable({"CumeDist","NTile","PercentRank"})) { + return true; + } + } + + return false; +} + +TString AllocatePartitionRowsColumn(const TStructExprType& rowType) { + ui64 index = 0; + for (;;) { + auto name = "_yql_partition_rows_" + ToString(index); + if (!rowType.FindItemType(name)) { + return name; + } + + ++index; + } +} + +TExprNode::TPtr AddPartitionRowsColumn(TPositionHandle pos, const TExprNode::TPtr& input, const TExprNode::TPtr& keyColumns, + const TString& columnName, TExprContext& ctx, TTypeAnnotationContext& types) { + auto exportsPtr = types.Modules->GetModule("/lib/yql/window.yql"); + YQL_ENSURE(exportsPtr); + const auto& exports = exportsPtr->Symbols(); + const auto ex = exports.find("count_traits_factory"); + YQL_ENSURE(exports.cend() != ex); + TNodeOnNodeOwnedMap deepClones; + auto lambda = ctx.DeepCopy(*ex->second, exportsPtr->ExprCtx(), deepClones, true, false); + auto listTypeNode = ctx.NewCallable(pos, "TypeOf", {input}); + auto extractor = ctx.Builder(pos) + .Lambda() + .Param("row") + .Callable("Void") + .Seal() + .Seal() + .Build(); + + auto traits = ctx.ReplaceNodes(lambda->TailPtr(), { + {lambda->Head().Child(0), listTypeNode}, + {lambda->Head().Child(1), extractor} + }); + + ctx.Step.Repeat(TExprStep::ExpandApplyForLambdas); + auto status = ExpandApply(traits, traits, ctx); + YQL_ENSURE(status != IGraphTransformer::TStatus::Error); + + return ctx.Builder(pos) + .Callable("CalcOverWindow") + .Add(0, input) + .Add(1, keyColumns) + .Callable(2, "Void") + .Seal() + .List(3) + .Callable(0, "WinOnRows") + .List(0) + .List(0) + .Atom(0, "begin") + .Callable(1, "Void") + .Seal() + .Seal() + .List(1) + .Atom(0, "end") + .Callable(1, "Void") + .Seal() + .Seal() + .Seal() + .List(1) + .Atom(0, columnName) + .Add(1, traits) + .Seal() + .Seal() + .Seal() + .Seal() + .Build(); +} + +TExprNode::TPtr RemovePartitionRowsColumn(TPositionHandle pos, const TExprNode::TPtr& input, const TString& columnName, TExprContext& ctx) { + return ctx.Builder(pos) + .Callable("Map") + .Add(0, input) + .Lambda(1) + .Param("row") + .Callable("RemoveMember") + .Arg(0, "row") + .Atom(1, columnName) + .Seal() + .Seal() + .Seal() + .Build(); +} + TExprNode::TPtr ProcessRowsFrames(TPositionHandle pos, const TExprNode::TPtr& input, const TStructExprType& rowType, const TExprNode::TPtr& dependsOn, - const TExprNode::TPtr& frames, TExprContext& ctx) + const TExprNode::TPtr& frames, const TMaybe& partitionRowsColumn, TExprContext& ctx) { if (frames->ChildrenSize() == 0) { return input; @@ -2310,7 +2621,7 @@ TExprNode::TPtr ProcessRowsFrames(TPositionHandle pos, const TExprNode::TPtr& in TExprNode::TPtr processed = input; TExprNode::TPtr dataQueue; TQueueParams queueParams; - TVector traits = BuildFoldMapTraits(queueParams, frames, ctx); + TVector traits = BuildFoldMapTraits(queueParams, frames, partitionRowsColumn, ctx); if (queueParams.DataQueueNeeded) { ui64 queueSize = (queueParams.DataOutpace == Max()) ? Max() : (queueParams.DataOutpace + queueParams.DataLag + 2); dataQueue = BuildQueue(pos, rowType, queueSize, queueParams.DataLag, dependsOn, ctx); @@ -2350,7 +2661,7 @@ TExprNode::TPtr ProcessRangeFrames(TPositionHandle pos, const TExprNode::TPtr& i TExprNode::TPtr processed = input; TQueueParams queueParams; - TVector traits = BuildFoldMapTraits(queueParams, frames, ctx); + TVector traits = BuildFoldMapTraits(queueParams, frames, {}, ctx); YQL_ENSURE(!queueParams.DataQueueNeeded); YQL_ENSURE(queueParams.LagQueueSize == 0); YQL_ENSURE(queueParams.LagQueueItemType == nullptr); @@ -2570,7 +2881,7 @@ TExprNode::TPtr ProcessRangeFrames(TPositionHandle pos, const TExprNode::TPtr& i TExprNode::TPtr ExpandSingleCalcOverWindow(TPositionHandle pos, const TExprNode::TPtr& inputList, const TExprNode::TPtr& keyColumns, const TExprNode::TPtr& sortTraits, const TExprNode::TPtr& frames, const TExprNode::TPtr& sessionTraits, - const TExprNode::TPtr& sessionColumns, const TStructExprType& outputRowType, TExprContext& ctx) + const TExprNode::TPtr& sessionColumns, const TStructExprType& outputRowType, TExprContext& ctx, TTypeAnnotationContext& types) { if (auto expanded = TryExpandNonCompactFullFrames(pos, inputList, keyColumns, sortTraits, frames, sessionTraits, sessionColumns, ctx)) { YQL_CLOG(INFO, Core) << "Expanded non-compact CalcOverWindow"; @@ -2604,6 +2915,7 @@ TExprNode::TPtr ExpandSingleCalcOverWindow(TPositionHandle pos, const TExprNode: const auto commonSortTraits = DeduceCompatibleSort(sortTraits, sessionSortTraits); ExtractSortKeyAndOrder(pos, commonSortTraits ? commonSortTraits : sortTraits, sortKey, sortOrder, ctx); + auto fullKeyColumns = keyColumns; if (!commonSortTraits) { YQL_ENSURE(sessionKey); YQL_ENSURE(sessionInit); @@ -2630,6 +2942,7 @@ TExprNode::TPtr ExpandSingleCalcOverWindow(TPositionHandle pos, const TExprNode: keyColumnsList.push_back(ctx.NewAtom(pos, SessionStartMemberName)); auto keyColumnsWithSessionStart = ctx.NewList(pos, std::move(keyColumnsList)); + fullKeyColumns = keyColumnsWithSessionStart; keySelector = BuildKeySelector(pos, *rowType, keyColumnsWithSessionStart, ctx); sessionKey = sessionInit = sessionUpdate = {}; @@ -2649,18 +2962,30 @@ TExprNode::TPtr ExpandSingleCalcOverWindow(TPositionHandle pos, const TExprNode: // (i.e. process range frames first) processed = ProcessRangeFrames(pos, processed, originalSortKey, rangeFrames, ctx); rowType = ApplyFramesToType(*rowType, outputRowType, *rangeFrames, ctx); - processed = ProcessRowsFrames(pos, processed, *rowType, topLevelStreamArg, rowsFrames, ctx); + + TMaybe partitionRowsColumn; + if (NeedPartitionRows(rowsFrames, ctx)) { + partitionRowsColumn = AllocatePartitionRowsColumn(*rowType); + input = AddPartitionRowsColumn(pos, input, fullKeyColumns, *partitionRowsColumn, ctx, types); + } + + processed = ProcessRowsFrames(pos, processed, *rowType, topLevelStreamArg, rowsFrames, partitionRowsColumn, ctx); auto topLevelStreamProcessingLambda = ctx.NewLambda(pos, ctx.NewArguments(pos, {topLevelStreamArg}), std::move(processed)); YQL_CLOG(INFO, Core) << "Expanded compact CalcOverWindow"; - return BuildPartitionsByKeys(pos, input, keySelector, sortOrder, sortKey, topLevelStreamProcessingLambda, sessionKey, + auto res = BuildPartitionsByKeys(pos, input, keySelector, sortOrder, sortKey, topLevelStreamProcessingLambda, sessionKey, sessionInit, sessionUpdate, sessionColumns, ctx); + if (partitionRowsColumn) { + res = RemovePartitionRowsColumn(pos, res, *partitionRowsColumn, ctx); + } + + return res; } } // namespace -TExprNode::TPtr ExpandCalcOverWindow(const TExprNode::TPtr& node, TExprContext& ctx) { +TExprNode::TPtr ExpandCalcOverWindow(const TExprNode::TPtr& node, TExprContext& ctx, TTypeAnnotationContext& types) { YQL_ENSURE(node->IsCallable({"CalcOverWindow", "CalcOverSessionWindow", "CalcOverWindowGroup"})); auto input = node->ChildPtr(0); @@ -2673,7 +2998,7 @@ TExprNode::TPtr ExpandCalcOverWindow(const TExprNode::TPtr& node, TExprContext& if (calc.Frames().Size() != 0 || calc.SessionColumns().Size() != 0) { const TStructExprType& outputRowType = *node->GetTypeAnn()->Cast()->GetItemType()->Cast(); input = ExpandSingleCalcOverWindow(node->Pos(), input, calc.Keys().Ptr(), calc.SortSpec().Ptr(), calc.Frames().Ptr(), - calc.SessionSpec().Ptr(), calc.SessionColumns().Ptr(), outputRowType, ctx); + calc.SessionSpec().Ptr(), calc.SessionColumns().Ptr(), outputRowType, ctx, types); } calcs.erase(calcs.begin()); diff --git a/ydb/library/yql/core/yql_opt_window.h b/ydb/library/yql/core/yql_opt_window.h index 0e909f1d9def..cf98cea31d3f 100644 --- a/ydb/library/yql/core/yql_opt_window.h +++ b/ydb/library/yql/core/yql_opt_window.h @@ -3,7 +3,8 @@ namespace NYql { -TExprNode::TPtr ExpandCalcOverWindow(const TExprNode::TPtr& node, TExprContext& ctx); +struct TTypeAnnotationContext; +TExprNode::TPtr ExpandCalcOverWindow(const TExprNode::TPtr& node, TExprContext& ctx, TTypeAnnotationContext& types); TExprNodeList ExtractCalcsOverWindow(const TExprNode::TPtr& node, TExprContext& ctx); TExprNode::TPtr RebuildCalcOverWindowGroup(TPositionHandle pos, const TExprNode::TPtr& input, const TExprNodeList& calcs, TExprContext& ctx); diff --git a/ydb/library/yql/dq/opt/dq_opt_log.cpp b/ydb/library/yql/dq/opt/dq_opt_log.cpp index cf86e2a7f210..fafb751981b8 100644 --- a/ydb/library/yql/dq/opt/dq_opt_log.cpp +++ b/ydb/library/yql/dq/opt/dq_opt_log.cpp @@ -152,7 +152,7 @@ TExprBase DqEnforceCompactPartition(TExprBase node, TExprList frames, TExprConte return node; } -TExprBase DqExpandWindowFunctions(TExprBase node, TExprContext& ctx, bool enforceCompact) { +TExprBase DqExpandWindowFunctions(TExprBase node, TExprContext& ctx, TTypeAnnotationContext& typesCtx, bool enforceCompact) { if (node.Maybe() || node.Maybe()) { if (enforceCompact) { auto calcs = ExtractCalcsOverWindow(node.Ptr(), ctx); @@ -169,7 +169,7 @@ TExprBase DqExpandWindowFunctions(TExprBase node, TExprContext& ctx, bool enforc } } - return TExprBase(ExpandCalcOverWindow(node.Ptr(), ctx)); + return TExprBase(ExpandCalcOverWindow(node.Ptr(), ctx, typesCtx)); } else { return node; } diff --git a/ydb/library/yql/dq/opt/dq_opt_log.h b/ydb/library/yql/dq/opt/dq_opt_log.h index d9b5cd96e2af..69a5025f6c12 100644 --- a/ydb/library/yql/dq/opt/dq_opt_log.h +++ b/ydb/library/yql/dq/opt/dq_opt_log.h @@ -35,7 +35,7 @@ NNodes::TExprBase DqRewriteEquiJoin(const NNodes::TExprBase& node, TExprContext& NNodes::TExprBase DqEnforceCompactPartition(NNodes::TExprBase node, NNodes::TExprList frames, TExprContext& ctx); -NNodes::TExprBase DqExpandWindowFunctions(NNodes::TExprBase node, TExprContext& ctx, bool enforceCompact); +NNodes::TExprBase DqExpandWindowFunctions(NNodes::TExprBase node, TExprContext& ctx, TTypeAnnotationContext& typesCtx, bool enforceCompact); NNodes::TExprBase DqMergeQueriesWithSinks(NNodes::TExprBase dqQueryNode, TExprContext& ctx); diff --git a/ydb/library/yql/providers/dq/opt/logical_optimize.cpp b/ydb/library/yql/providers/dq/opt/logical_optimize.cpp index 2bbaa480b5b2..e4af3bf574d3 100644 --- a/ydb/library/yql/providers/dq/opt/logical_optimize.cpp +++ b/ydb/library/yql/providers/dq/opt/logical_optimize.cpp @@ -185,7 +185,7 @@ class TDqsLogicalOptProposalTransformer : public TOptimizeTransformerBase { TMaybeNode ExpandWindowFunctions(TExprBase node, TExprContext& ctx) { if (node.Cast().Input().Maybe()) { - return DqExpandWindowFunctions(node, ctx, true); + return DqExpandWindowFunctions(node, ctx, TypesCtx, true); } return node; } diff --git a/ydb/library/yql/providers/yt/provider/yql_yt_logical_optimize.cpp b/ydb/library/yql/providers/yt/provider/yql_yt_logical_optimize.cpp index b9d080afe1a9..49bb8f814b87 100644 --- a/ydb/library/yql/providers/yt/provider/yql_yt_logical_optimize.cpp +++ b/ydb/library/yql/providers/yt/provider/yql_yt_logical_optimize.cpp @@ -726,7 +726,7 @@ class TYtLogicalOptProposalTransformer : public TOptimizeTransformerBase { } } - return ExpandCalcOverWindow(node.Ptr(), ctx); + return ExpandCalcOverWindow(node.Ptr(), ctx, *State_->Types); } template diff --git a/ydb/library/yql/sql/v1/builtin.cpp b/ydb/library/yql/sql/v1/builtin.cpp index c7e2f52af241..cb5e2d30abfa 100644 --- a/ydb/library/yql/sql/v1/builtin.cpp +++ b/ydb/library/yql/sql/v1/builtin.cpp @@ -3122,6 +3122,9 @@ struct TBuiltinFuncData { {"denserank", BuildNamedArgcBuiltinFactoryCallback("DenseRank", 0, 1)}, {"lead", BuildNamedArgcBuiltinFactoryCallback("Lead", 1, 2)}, {"lag", BuildNamedArgcBuiltinFactoryCallback("Lag", 1, 2)}, + {"percentrank", BuildNamedArgcBuiltinFactoryCallback("PercentRank", 0, 1)}, + {"cumedist", BuildNamedArgcBuiltinFactoryCallback("CumeDist", 0, 0)}, + {"ntile", BuildNamedArgcBuiltinFactoryCallback("NTile", 1, 1)}, // Session window {"sessionwindow", BuildSimpleBuiltinFactoryCallback()}, diff --git a/ydb/library/yql/sql/v1/node.cpp b/ydb/library/yql/sql/v1/node.cpp index 93c9dc0c70d6..e15471b73fc9 100644 --- a/ydb/library/yql/sql/v1/node.cpp +++ b/ydb/library/yql/sql/v1/node.cpp @@ -1042,6 +1042,23 @@ TWinRowNumber::TWinRowNumber(TPosition pos, const TString& opName, i32 minArgs, : TWinAggrEmulation(pos, opName, minArgs, maxArgs, args) {} +TWinNTile::TWinNTile(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector& args) + : TWinAggrEmulation(pos, opName, minArgs, maxArgs, args) +{ + FakeSource = BuildFakeSource(pos); +} + +bool TWinNTile::DoInit(TContext& ctx, ISource* src) { + if (Args.size() >= 1 && !Args[0]->Init(ctx, FakeSource.Get())) { + return false; + } + + if (!TWinAggrEmulation::DoInit(ctx, src)) { + return false; + } + return true; +} + TWinLeadLag::TWinLeadLag(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector& args) : TWinAggrEmulation(pos, opName, minArgs, maxArgs, args) {} diff --git a/ydb/library/yql/sql/v1/node.h b/ydb/library/yql/sql/v1/node.h index ae94b11885c1..47bf6e58d3f1 100644 --- a/ydb/library/yql/sql/v1/node.h +++ b/ydb/library/yql/sql/v1/node.h @@ -92,6 +92,7 @@ namespace NSQLTranslationV1 { class TAccessNode; class TLambdaNode; class TUdfNode; + typedef TIntrusivePtr TSourcePtr; struct TScopedState; typedef TIntrusivePtr TScopedStatePtr; @@ -555,6 +556,18 @@ namespace NSQLTranslationV1 { TWinRowNumber(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector& args); }; + class TWinNTile final: public TWinAggrEmulation { + TPtr DoClone() const final { + return CallNodeClone(); + } + bool DoInit(TContext& ctx, ISource* src) override; + public: + TWinNTile(TPosition pos, const TString& opName, i32 minArgs, i32 maxArgs, const TVector& args); + + private: + TSourcePtr FakeSource; + }; + class TWinLeadLag final: public TWinAggrEmulation { TPtr DoClone() const final { return CallNodeClone(); diff --git a/ydb/library/yql/tests/sql/dq_file/part12/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part12/canondata/result.json index 4fd4ec713212..839b5e1e6d77 100644 --- a/ydb/library/yql/tests/sql/dq_file/part12/canondata/result.json +++ b/ydb/library/yql/tests/sql/dq_file/part12/canondata/result.json @@ -3530,6 +3530,28 @@ } ], "test.test[window-win_func_aggr_4func_sort--Results]": [], + "test.test[window-win_func_percent_rank-default.txt-Analyze]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1031349/12c4584507630678ad646e234c8e75078785de4d/resource.tar.gz#test.test_window-win_func_percent_rank-default.txt-Analyze_/plan.txt" + } + ], + "test.test[window-win_func_percent_rank-default.txt-Debug]": [ + { + "checksum": "8874e85f86b8b253bd547e9a8916b512", + "size": 1262, + "uri": "https://{canondata_backend}/1031349/12c4584507630678ad646e234c8e75078785de4d/resource.tar.gz#test.test_window-win_func_percent_rank-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[window-win_func_percent_rank-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1031349/12c4584507630678ad646e234c8e75078785de4d/resource.tar.gz#test.test_window-win_func_percent_rank-default.txt-Plan_/plan.txt" + } + ], + "test.test[window-win_func_percent_rank-default.txt-Results]": [], "test.test[window-win_func_spec_with_part--Analyze]": [ { "checksum": "41d4c0b859c1d8a3ec761f7a22064044", diff --git a/ydb/library/yql/tests/sql/dq_file/part13/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part13/canondata/result.json index 722cbcd6060d..e757f9c61de2 100644 --- a/ydb/library/yql/tests/sql/dq_file/part13/canondata/result.json +++ b/ydb/library/yql/tests/sql/dq_file/part13/canondata/result.json @@ -1959,6 +1959,28 @@ } ], "test.test[pg-select_table1-default.txt-Results]": [], + "test.test[pg-select_win_cume_dist-default.txt-Analyze]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1937367/1c67f3b284e4254e921806deed7356235d09b497/resource.tar.gz#test.test_pg-select_win_cume_dist-default.txt-Analyze_/plan.txt" + } + ], + "test.test[pg-select_win_cume_dist-default.txt-Debug]": [ + { + "checksum": "abaf162f1295810134584f2927d6ffba", + "size": 1171, + "uri": "https://{canondata_backend}/1937367/1c67f3b284e4254e921806deed7356235d09b497/resource.tar.gz#test.test_pg-select_win_cume_dist-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[pg-select_win_cume_dist-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1937367/1c67f3b284e4254e921806deed7356235d09b497/resource.tar.gz#test.test_pg-select_win_cume_dist-default.txt-Plan_/plan.txt" + } + ], + "test.test[pg-select_win_cume_dist-default.txt-Results]": [], "test.test[pg-select_win_expr_order-default.txt-Analyze]": [ { "checksum": "b4dd508a329723c74293d80f0278c705", diff --git a/ydb/library/yql/tests/sql/dq_file/part14/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part14/canondata/result.json index b3460ad5a1c6..c925092e704e 100644 --- a/ydb/library/yql/tests/sql/dq_file/part14/canondata/result.json +++ b/ydb/library/yql/tests/sql/dq_file/part14/canondata/result.json @@ -2391,6 +2391,28 @@ } ], "test.test[pg-select_where-default.txt-Results]": [], + "test.test[pg-select_win_ntile-default.txt-Analyze]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1942278/5982c0f62a0472a9822a5612ad84d4aae9998491/resource.tar.gz#test.test_pg-select_win_ntile-default.txt-Analyze_/plan.txt" + } + ], + "test.test[pg-select_win_ntile-default.txt-Debug]": [ + { + "checksum": "3f5ae02215c44248154f246bb8d12319", + "size": 1253, + "uri": "https://{canondata_backend}/1942278/5982c0f62a0472a9822a5612ad84d4aae9998491/resource.tar.gz#test.test_pg-select_win_ntile-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[pg-select_win_ntile-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1942278/5982c0f62a0472a9822a5612ad84d4aae9998491/resource.tar.gz#test.test_pg-select_win_ntile-default.txt-Plan_/plan.txt" + } + ], + "test.test[pg-select_win_ntile-default.txt-Results]": [], "test.test[pg-sublink_projection_array-default.txt-Analyze]": [ { "checksum": "a3b64a2cf9903b3868a2dd88a18fc46e", diff --git a/ydb/library/yql/tests/sql/dq_file/part19/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part19/canondata/result.json index 37103a043058..367c264adc0c 100644 --- a/ydb/library/yql/tests/sql/dq_file/part19/canondata/result.json +++ b/ydb/library/yql/tests/sql/dq_file/part19/canondata/result.json @@ -2271,6 +2271,28 @@ } ], "test.test[pg-select_win_min_null-default.txt-Results]": [], + "test.test[pg-select_win_percent_rank-default.txt-Analyze]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1937367/6753adf109c979219bfffa5389a252ae034aa308/resource.tar.gz#test.test_pg-select_win_percent_rank-default.txt-Analyze_/plan.txt" + } + ], + "test.test[pg-select_win_percent_rank-default.txt-Debug]": [ + { + "checksum": "aa8bcb95e7e459a9de1fd76954ed3680", + "size": 1231, + "uri": "https://{canondata_backend}/1937367/6753adf109c979219bfffa5389a252ae034aa308/resource.tar.gz#test.test_pg-select_win_percent_rank-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[pg-select_win_percent_rank-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1937367/6753adf109c979219bfffa5389a252ae034aa308/resource.tar.gz#test.test_pg-select_win_percent_rank-default.txt-Plan_/plan.txt" + } + ], + "test.test[pg-select_win_percent_rank-default.txt-Results]": [], "test.test[pg-sublink_having_in-default.txt-Analyze]": [ { "checksum": "b2a2eb5d6b0a138ee924c128fc7738ef", diff --git a/ydb/library/yql/tests/sql/dq_file/part2/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part2/canondata/result.json index 9ce26611a5b3..c7e884521fc2 100644 --- a/ydb/library/yql/tests/sql/dq_file/part2/canondata/result.json +++ b/ydb/library/yql/tests/sql/dq_file/part2/canondata/result.json @@ -2831,6 +2831,28 @@ } ], "test.test[window-win_expr_bounds--Results]": [], + "test.test[window-win_func_cume_dist-default.txt-Analyze]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1597364/81324d44a583c1e929d9afce72a977f6bafb04dd/resource.tar.gz#test.test_window-win_func_cume_dist-default.txt-Analyze_/plan.txt" + } + ], + "test.test[window-win_func_cume_dist-default.txt-Debug]": [ + { + "checksum": "8b2974aadc3e89715fbb478097ffff78", + "size": 1018, + "uri": "https://{canondata_backend}/1597364/81324d44a583c1e929d9afce72a977f6bafb04dd/resource.tar.gz#test.test_window-win_func_cume_dist-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[window-win_func_cume_dist-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1597364/81324d44a583c1e929d9afce72a977f6bafb04dd/resource.tar.gz#test.test_window-win_func_cume_dist-default.txt-Plan_/plan.txt" + } + ], + "test.test[window-win_func_cume_dist-default.txt-Results]": [], "test.test[window-win_func_into_udf--Analyze]": [ { "checksum": "b42b9e0be38d4cfd6b0e2a11dcd88177", diff --git a/ydb/library/yql/tests/sql/dq_file/part9/canondata/result.json b/ydb/library/yql/tests/sql/dq_file/part9/canondata/result.json index 5d20ecbd6176..8b60093b6f34 100644 --- a/ydb/library/yql/tests/sql/dq_file/part9/canondata/result.json +++ b/ydb/library/yql/tests/sql/dq_file/part9/canondata/result.json @@ -2815,5 +2815,27 @@ "uri": "https://{canondata_backend}/1925821/236e8d3234ab439980869279c30846a1eb87487f/resource.tar.gz#test.test_window-win_func_aggr_stat--Plan_/plan.txt" } ], - "test.test[window-win_func_aggr_stat--Results]": [] + "test.test[window-win_func_aggr_stat--Results]": [], + "test.test[window-win_func_ntile-default.txt-Analyze]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1784826/cd0b26ce347141d51c45b6088135a15077b56483/resource.tar.gz#test.test_window-win_func_ntile-default.txt-Analyze_/plan.txt" + } + ], + "test.test[window-win_func_ntile-default.txt-Debug]": [ + { + "checksum": "dc1eb9875194a9865b55521b38c2e9b4", + "size": 1018, + "uri": "https://{canondata_backend}/1784826/cd0b26ce347141d51c45b6088135a15077b56483/resource.tar.gz#test.test_window-win_func_ntile-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[window-win_func_ntile-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1784826/cd0b26ce347141d51c45b6088135a15077b56483/resource.tar.gz#test.test_window-win_func_ntile-default.txt-Plan_/plan.txt" + } + ], + "test.test[window-win_func_ntile-default.txt-Results]": [] } diff --git a/ydb/library/yql/tests/sql/hybrid_file/part0/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part0/canondata/result.json index f22db3e1883e..a91ddd471ed5 100644 --- a/ydb/library/yql/tests/sql/hybrid_file/part0/canondata/result.json +++ b/ydb/library/yql/tests/sql/hybrid_file/part0/canondata/result.json @@ -1959,6 +1959,20 @@ "uri": "https://{canondata_backend}/1936947/581aa6d896ffe57e25bdb8006459e912860e61fa/resource.tar.gz#test.test_pg-select_win_min_null-default.txt-Plan_/plan.txt" } ], + "test.test[pg-select_win_ntile-default.txt-Debug]": [ + { + "checksum": "2f18ad420bd6096581b6d3f52c31265d", + "size": 1252, + "uri": "https://{canondata_backend}/937458/c423db03e0e9f65962fec3378f160c7d70d32138/resource.tar.gz#test.test_pg-select_win_ntile-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[pg-select_win_ntile-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/937458/c423db03e0e9f65962fec3378f160c7d70d32138/resource.tar.gz#test.test_pg-select_win_ntile-default.txt-Plan_/plan.txt" + } + ], "test.test[pg-simple_ops-default.txt-Debug]": [ { "checksum": "467d03a0db0198f46c7375071bf35b9c", diff --git a/ydb/library/yql/tests/sql/hybrid_file/part1/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part1/canondata/result.json index 3fe84a671b56..fc6910314ef2 100644 --- a/ydb/library/yql/tests/sql/hybrid_file/part1/canondata/result.json +++ b/ydb/library/yql/tests/sql/hybrid_file/part1/canondata/result.json @@ -1875,6 +1875,20 @@ "uri": "https://{canondata_backend}/1936273/85968a675c17dd0728c8d7ba5fd43bd0b237dc65/resource.tar.gz#test.test_pg-select_unionall_scalar-default.txt-Plan_/plan.txt" } ], + "test.test[pg-select_win_cume_dist-default.txt-Debug]": [ + { + "checksum": "1021cfc7e7b0d08839166b0c4a596da1", + "size": 1170, + "uri": "https://{canondata_backend}/1942278/a9dafa0c92a2a568391db5df4c8a2a950955314c/resource.tar.gz#test.test_pg-select_win_cume_dist-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[pg-select_win_cume_dist-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1942278/a9dafa0c92a2a568391db5df4c8a2a950955314c/resource.tar.gz#test.test_pg-select_win_cume_dist-default.txt-Plan_/plan.txt" + } + ], "test.test[pg-select_win_first_last_value-default.txt-Debug]": [ { "checksum": "d79e19a54e197363fb005be49d4507e7", diff --git a/ydb/library/yql/tests/sql/hybrid_file/part10/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part10/canondata/result.json index ff34a08cf83e..37f8d9ab1afe 100644 --- a/ydb/library/yql/tests/sql/hybrid_file/part10/canondata/result.json +++ b/ydb/library/yql/tests/sql/hybrid_file/part10/canondata/result.json @@ -2953,6 +2953,20 @@ "uri": "https://{canondata_backend}/1775319/3515b86fb929979a6751f93bd43a0291eaa01262/resource.tar.gz#test.test_window-rank_nulls_legacy-default.txt-Plan_/plan.txt" } ], + "test.test[window-win_func_cume_dist-default.txt-Debug]": [ + { + "checksum": "b711667dede74d1b4b564e9b56652240", + "size": 1017, + "uri": "https://{canondata_backend}/1925842/8b22a63573110228fc6a5e75beb97252b4db0e2a/resource.tar.gz#test.test_window-win_func_cume_dist-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[window-win_func_cume_dist-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1925842/8b22a63573110228fc6a5e75beb97252b4db0e2a/resource.tar.gz#test.test_window-win_func_cume_dist-default.txt-Plan_/plan.txt" + } + ], "test.test[window-win_func_mutable_resource-default.txt-Debug]": [ { "checksum": "6a326061fbad7b7b21f7b6aecd278301", diff --git a/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json index 35654b31a6e1..38d6ddf8aa95 100644 --- a/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json +++ b/ydb/library/yql/tests/sql/hybrid_file/part4/canondata/result.json @@ -3093,6 +3093,20 @@ "uri": "https://{canondata_backend}/1931696/8382830b676a61af36d1344910d51cd1bf39f3ef/resource.tar.gz#test.test_window-win_func_aggr_with_qualified_all--Plan_/plan.txt" } ], + "test.test[window-win_func_percent_rank-default.txt-Debug]": [ + { + "checksum": "61da880978e75d9d3500e8adbcb9bdc9", + "size": 1261, + "uri": "https://{canondata_backend}/1942415/0be95092588fe1a5379e1336687f83ad5f8d20f7/resource.tar.gz#test.test_window-win_func_percent_rank-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[window-win_func_percent_rank-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1942415/0be95092588fe1a5379e1336687f83ad5f8d20f7/resource.tar.gz#test.test_window-win_func_percent_rank-default.txt-Plan_/plan.txt" + } + ], "test.test[window-win_func_with_struct_access-default.txt-Debug]": [ { "checksum": "5fd0123a68e009dbb4abfb0b0e6203a3", diff --git a/ydb/library/yql/tests/sql/hybrid_file/part6/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part6/canondata/result.json index e98cbdb6833c..7cce4902c591 100644 --- a/ydb/library/yql/tests/sql/hybrid_file/part6/canondata/result.json +++ b/ydb/library/yql/tests/sql/hybrid_file/part6/canondata/result.json @@ -3037,6 +3037,20 @@ "uri": "https://{canondata_backend}/1031349/201452dd8c883b2adcbf46cb075c912d25efe67e/resource.tar.gz#test.test_window-win_func_lead_lag_worm_with_part--Plan_/plan.txt" } ], + "test.test[window-win_func_ntile-default.txt-Debug]": [ + { + "checksum": "0e5d9ecbca896e2c0d9fb173107b46d5", + "size": 1017, + "uri": "https://{canondata_backend}/1942525/4286c760bf658fe8e2079ca57866e3a8a4db409d/resource.tar.gz#test.test_window-win_func_ntile-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[window-win_func_ntile-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1942525/4286c760bf658fe8e2079ca57866e3a8a4db409d/resource.tar.gz#test.test_window-win_func_ntile-default.txt-Plan_/plan.txt" + } + ], "test.test[window-win_func_special--Debug]": [ { "checksum": "f3dceea6a640f166101d80c84a10d6ac", diff --git a/ydb/library/yql/tests/sql/hybrid_file/part8/canondata/result.json b/ydb/library/yql/tests/sql/hybrid_file/part8/canondata/result.json index 4f453faca7a9..00be3366e02e 100644 --- a/ydb/library/yql/tests/sql/hybrid_file/part8/canondata/result.json +++ b/ydb/library/yql/tests/sql/hybrid_file/part8/canondata/result.json @@ -2225,6 +2225,20 @@ "uri": "https://{canondata_backend}/1925821/2978b18b76f4a1f7b0e4690d2015acea4775834c/resource.tar.gz#test.test_pg-select_win_nth_value-default.txt-Plan_/plan.txt" } ], + "test.test[pg-select_win_percent_rank-default.txt-Debug]": [ + { + "checksum": "1f58d0b2fa7ac02d3e6e94f5bafea276", + "size": 1230, + "uri": "https://{canondata_backend}/1937367/46e259d63bb269eac924a02dbf163b759073a96a/resource.tar.gz#test.test_pg-select_win_percent_rank-default.txt-Debug_/opt.yql_patched" + } + ], + "test.test[pg-select_win_percent_rank-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1937367/46e259d63bb269eac924a02dbf163b759073a96a/resource.tar.gz#test.test_pg-select_win_percent_rank-default.txt-Plan_/plan.txt" + } + ], "test.test[pg-set_of_as_structs-default.txt-Debug]": [ { "checksum": "83b5c2777a579c47143ad0f215215d81", diff --git a/ydb/library/yql/tests/sql/sql2yql/canondata/result.json b/ydb/library/yql/tests/sql/sql2yql/canondata/result.json index ebd4dce64906..19727046dad8 100644 --- a/ydb/library/yql/tests/sql/sql2yql/canondata/result.json +++ b/ydb/library/yql/tests/sql/sql2yql/canondata/result.json @@ -13005,6 +13005,13 @@ "uri": "https://{canondata_backend}/1881367/79a71c1478c556da1931a7565c12bdd14cc63567/resource.tar.gz#test_sql2yql.test_pg-select_win_count_all_/sql.yql" } ], + "test_sql2yql.test[pg-select_win_cume_dist]": [ + { + "checksum": "e5e020bb6ad9ad41d1f4e5757ae3793e", + "size": 1343, + "uri": "https://{canondata_backend}/1889210/9eae9dde3e4ccce7ed58c152526ff01da2d33ccb/resource.tar.gz#test_sql2yql.test_pg-select_win_cume_dist_/sql.yql" + } + ], "test_sql2yql.test[pg-select_win_expr_agg]": [ { "checksum": "96c31e8993d0b08a37cddf4886db96a9", @@ -13096,6 +13103,13 @@ "uri": "https://{canondata_backend}/1871182/567779c73d6cc9df23501e596c52b2adf09b5b7b/resource.tar.gz#test_sql2yql.test_pg-select_win_nth_value_/sql.yql" } ], + "test_sql2yql.test[pg-select_win_ntile]": [ + { + "checksum": "b1c2a7b02c6efcc3b6f68d64a35a0803", + "size": 1363, + "uri": "https://{canondata_backend}/1889210/9eae9dde3e4ccce7ed58c152526ff01da2d33ccb/resource.tar.gz#test_sql2yql.test_pg-select_win_ntile_/sql.yql" + } + ], "test_sql2yql.test[pg-select_win_partition_sort]": [ { "checksum": "bd5985cc249fcf7c6c8a2ac90c4aa62a", @@ -13103,6 +13117,13 @@ "uri": "https://{canondata_backend}/1881367/79a71c1478c556da1931a7565c12bdd14cc63567/resource.tar.gz#test_sql2yql.test_pg-select_win_partition_sort_/sql.yql" } ], + "test_sql2yql.test[pg-select_win_percent_rank]": [ + { + "checksum": "bbf8c3e7692ec2ca27ae31754e123281", + "size": 1349, + "uri": "https://{canondata_backend}/1889210/9eae9dde3e4ccce7ed58c152526ff01da2d33ccb/resource.tar.gz#test_sql2yql.test_pg-select_win_percent_rank_/sql.yql" + } + ], "test_sql2yql.test[pg-select_win_rank]": [ { "checksum": "fd877435b4337db2d1deab20c05f4e89", @@ -18304,6 +18325,13 @@ "uri": "https://{canondata_backend}/1600758/deef50cb75de37e031f94336485e9272fdd5a9af/resource.tar.gz#test_sql2yql.test_window-win_func_auto_arg_two_sort_/sql.yql" } ], + "test_sql2yql.test[window-win_func_cume_dist]": [ + { + "checksum": "5d9cae983ad0a0420eb5e819f088656c", + "size": 2333, + "uri": "https://{canondata_backend}/1924537/1e6c4bd0b6a388eb0c3be13c5222f8b798f7e45c/resource.tar.gz#test_sql2yql.test_window-win_func_cume_dist_/sql.yql" + } + ], "test_sql2yql.test[window-win_func_first_last]": [ { "checksum": "2876d5cba15d8dd9e4249d6a6ed1c562", @@ -18388,6 +18416,13 @@ "uri": "https://{canondata_backend}/1937367/f9c5e2ce003fa874f20946cc39a5807e02d6b085/resource.tar.gz#test_sql2yql.test_window-win_func_nth_value_/sql.yql" } ], + "test_sql2yql.test[window-win_func_ntile]": [ + { + "checksum": "7d9e8bb02850d9a7c833114f249cacad", + "size": 2337, + "uri": "https://{canondata_backend}/1924537/1e6c4bd0b6a388eb0c3be13c5222f8b798f7e45c/resource.tar.gz#test_sql2yql.test_window-win_func_ntile_/sql.yql" + } + ], "test_sql2yql.test[window-win_func_on_cloned_source]": [ { "checksum": "d64b85d66b7adaa9f59d01653861c470", @@ -18444,6 +18479,13 @@ "uri": "https://{canondata_backend}/1600758/d2be12e3cc8a37157a962bd9b58c2874635d2195/resource.tar.gz#test_sql2yql.test_window-win_func_part_by_expr_new_/sql.yql" } ], + "test_sql2yql.test[window-win_func_percent_rank]": [ + { + "checksum": "cb092ec46c8034ee21ebdd8388bc6d21", + "size": 2658, + "uri": "https://{canondata_backend}/1924537/1e6c4bd0b6a388eb0c3be13c5222f8b798f7e45c/resource.tar.gz#test_sql2yql.test_window-win_func_percent_rank_/sql.yql" + } + ], "test_sql2yql.test[window-win_func_rank_by_all]": [ { "checksum": "bdd6fb5d15f54c67f6960402c1099d86", @@ -34005,6 +34047,13 @@ "uri": "https://{canondata_backend}/1880306/64654158d6bfb1289c66c626a8162239289559d0/resource.tar.gz#test_sql_format.test_window-win_func_auto_arg_two_sort_/formatted.sql" } ], + "test_sql_format.test[window-win_func_cume_dist]": [ + { + "checksum": "c2da6ca06ae843d6193bbcf4a8068225", + "size": 323, + "uri": "https://{canondata_backend}/1924537/1e6c4bd0b6a388eb0c3be13c5222f8b798f7e45c/resource.tar.gz#test_sql_format.test_window-win_func_cume_dist_/formatted.sql" + } + ], "test_sql_format.test[window-win_func_first_last]": [ { "checksum": "1dba48dd53fd6e870b89b62edaf34540", @@ -34089,6 +34138,13 @@ "uri": "https://{canondata_backend}/1937367/f9c5e2ce003fa874f20946cc39a5807e02d6b085/resource.tar.gz#test_sql_format.test_window-win_func_nth_value_/formatted.sql" } ], + "test_sql_format.test[window-win_func_ntile]": [ + { + "checksum": "05a41b22e12f50577f6663518f92fb2f", + "size": 320, + "uri": "https://{canondata_backend}/1924537/1e6c4bd0b6a388eb0c3be13c5222f8b798f7e45c/resource.tar.gz#test_sql_format.test_window-win_func_ntile_/formatted.sql" + } + ], "test_sql_format.test[window-win_func_on_cloned_source]": [ { "checksum": "53a5dd557cae808a17be6d127d4b5178", @@ -34145,6 +34201,13 @@ "uri": "https://{canondata_backend}/1600758/d2be12e3cc8a37157a962bd9b58c2874635d2195/resource.tar.gz#test_sql_format.test_window-win_func_part_by_expr_new_/formatted.sql" } ], + "test_sql_format.test[window-win_func_percent_rank]": [ + { + "checksum": "4f5c46173d8534a8dd74eaeb902e1a5c", + "size": 354, + "uri": "https://{canondata_backend}/1924537/1e6c4bd0b6a388eb0c3be13c5222f8b798f7e45c/resource.tar.gz#test_sql_format.test_window-win_func_percent_rank_/formatted.sql" + } + ], "test_sql_format.test[window-win_func_rank_by_all]": [ { "checksum": "7961a8077b82fc245dd4d80b4dec081a", diff --git a/ydb/library/yql/tests/sql/suites/pg/select_win_cume_dist.sql b/ydb/library/yql/tests/sql/suites/pg/select_win_cume_dist.sql new file mode 100644 index 000000000000..38ba4e076900 --- /dev/null +++ b/ydb/library/yql/tests/sql/suites/pg/select_win_cume_dist.sql @@ -0,0 +1,8 @@ +--!syntax_pg +select +r,x, +cume_dist() over w +from (select * from (values (1,3),(2,null),(3,4),(4,5)) as a(r,x)) as z +window w as (order by r) +order by r + diff --git a/ydb/library/yql/tests/sql/suites/pg/select_win_ntile.sql b/ydb/library/yql/tests/sql/suites/pg/select_win_ntile.sql new file mode 100644 index 000000000000..42f69b3e578b --- /dev/null +++ b/ydb/library/yql/tests/sql/suites/pg/select_win_ntile.sql @@ -0,0 +1,8 @@ +--!syntax_pg +select +r,x, +ntile(3) over w +from (select * from (values (1,3),(2,null),(3,4),(4,5)) as a(r,x)) as z +window w as (order by r) +order by r + diff --git a/ydb/library/yql/tests/sql/suites/pg/select_win_percent_rank.sql b/ydb/library/yql/tests/sql/suites/pg/select_win_percent_rank.sql new file mode 100644 index 000000000000..e0ccd1c4508d --- /dev/null +++ b/ydb/library/yql/tests/sql/suites/pg/select_win_percent_rank.sql @@ -0,0 +1,8 @@ +--!syntax_pg +select +r,x, +percent_rank() over w +from (select * from (values (1,null),(2,3),(3,4),(4,4)) as a(r,x)) as z +window w as (order by r) +order by r + diff --git a/ydb/library/yql/tests/sql/suites/window/win_func_cume_dist.sql b/ydb/library/yql/tests/sql/suites/window/win_func_cume_dist.sql new file mode 100644 index 000000000000..864cfcc6ead6 --- /dev/null +++ b/ydb/library/yql/tests/sql/suites/window/win_func_cume_dist.sql @@ -0,0 +1,7 @@ +select +r,x, +cume_dist() over w, +from (select * from (values (1,3),(2,null),(3,4),(4,5)) as a(r,x)) as z +window w as (order by r) +order by r + diff --git a/ydb/library/yql/tests/sql/suites/window/win_func_ntile.sql b/ydb/library/yql/tests/sql/suites/window/win_func_ntile.sql new file mode 100644 index 000000000000..86b622e239d4 --- /dev/null +++ b/ydb/library/yql/tests/sql/suites/window/win_func_ntile.sql @@ -0,0 +1,7 @@ +select +r,x, +ntile(3) over w, +from (select * from (values (1,3),(2,null),(3,4),(4,5)) as a(r,x)) as z +window w as (order by r) +order by r + diff --git a/ydb/library/yql/tests/sql/suites/window/win_func_percent_rank.sql b/ydb/library/yql/tests/sql/suites/window/win_func_percent_rank.sql new file mode 100644 index 000000000000..f249d901e361 --- /dev/null +++ b/ydb/library/yql/tests/sql/suites/window/win_func_percent_rank.sql @@ -0,0 +1,8 @@ +select +r,x, +percent_rank() over w, +percent_rank(x) over w, +from (select * from (values (1,null),(2,3),(3,4),(4,4)) as a(r,x)) as z +window w as (order by r) +order by r + diff --git a/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json index 512b5f2a619c..7c9dead80200 100644 --- a/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json +++ b/ydb/library/yql/tests/sql/yt_native_file/part12/canondata/result.json @@ -3387,6 +3387,27 @@ "uri": "https://{canondata_backend}/1936997/a95cccf3209d441f2d222d56081bdfc240fc8b83/resource.tar.gz#test.test_window-win_func_aggr_4func_sort--Results_/results.txt" } ], + "test.test[window-win_func_percent_rank-default.txt-Debug]": [ + { + "checksum": "31d3e8335c44ef9e8705832ae3db498f", + "size": 1191, + "uri": "https://{canondata_backend}/1942525/07685b90122fc858d517af116d938fa435d86833/resource.tar.gz#test.test_window-win_func_percent_rank-default.txt-Debug_/opt.yql" + } + ], + "test.test[window-win_func_percent_rank-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1942525/07685b90122fc858d517af116d938fa435d86833/resource.tar.gz#test.test_window-win_func_percent_rank-default.txt-Plan_/plan.txt" + } + ], + "test.test[window-win_func_percent_rank-default.txt-Results]": [ + { + "checksum": "498a4405ea43c12551009c6672c00356", + "size": 2401, + "uri": "https://{canondata_backend}/1942525/07685b90122fc858d517af116d938fa435d86833/resource.tar.gz#test.test_window-win_func_percent_rank-default.txt-Results_/results.txt" + } + ], "test.test[window-win_func_spec_with_part--Debug]": [ { "checksum": "fc05d4b33d06c75d8224a9b82af0368c", diff --git a/ydb/library/yql/tests/sql/yt_native_file/part13/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part13/canondata/result.json index 771c8ad95102..021ac0fb12da 100644 --- a/ydb/library/yql/tests/sql/yt_native_file/part13/canondata/result.json +++ b/ydb/library/yql/tests/sql/yt_native_file/part13/canondata/result.json @@ -2087,6 +2087,27 @@ "uri": "https://{canondata_backend}/1937424/9bc2b8c2d88f8e65c3b04f141709ba87ca3b124c/resource.tar.gz#test.test_pg-select_table1-default.txt-Results_/results.txt" } ], + "test.test[pg-select_win_cume_dist-default.txt-Debug]": [ + { + "checksum": "f1df6aeaacef0fa9b983af8bdb6ea489", + "size": 1111, + "uri": "https://{canondata_backend}/1942278/d0382e3ec3a47bd0e4a1b52acd0f29b3d81e78c9/resource.tar.gz#test.test_pg-select_win_cume_dist-default.txt-Debug_/opt.yql" + } + ], + "test.test[pg-select_win_cume_dist-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1942278/d0382e3ec3a47bd0e4a1b52acd0f29b3d81e78c9/resource.tar.gz#test.test_pg-select_win_cume_dist-default.txt-Plan_/plan.txt" + } + ], + "test.test[pg-select_win_cume_dist-default.txt-Results]": [ + { + "checksum": "c89cff7be5b62c6003636fcd977dc883", + "size": 1756, + "uri": "https://{canondata_backend}/1942278/d0382e3ec3a47bd0e4a1b52acd0f29b3d81e78c9/resource.tar.gz#test.test_pg-select_win_cume_dist-default.txt-Results_/results.txt" + } + ], "test.test[pg-select_win_expr_order-default.txt-Debug]": [ { "checksum": "b644ac35fcdbf386cc3b67ad13f75470", diff --git a/ydb/library/yql/tests/sql/yt_native_file/part14/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part14/canondata/result.json index 249b69ab42eb..de6fe9646ac4 100644 --- a/ydb/library/yql/tests/sql/yt_native_file/part14/canondata/result.json +++ b/ydb/library/yql/tests/sql/yt_native_file/part14/canondata/result.json @@ -2495,6 +2495,27 @@ "uri": "https://{canondata_backend}/1900335/4dc3e91261a8379bce0dded756efcd135e099347/resource.tar.gz#test.test_pg-select_where-default.txt-Results_/results.txt" } ], + "test.test[pg-select_win_ntile-default.txt-Debug]": [ + { + "checksum": "9795cddef12d4548af103e3712a4f6ba", + "size": 1193, + "uri": "https://{canondata_backend}/1946324/69ab4b2460e9b99fe4fb1fe2023492651ad0ede1/resource.tar.gz#test.test_pg-select_win_ntile-default.txt-Debug_/opt.yql" + } + ], + "test.test[pg-select_win_ntile-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1946324/69ab4b2460e9b99fe4fb1fe2023492651ad0ede1/resource.tar.gz#test.test_pg-select_win_ntile-default.txt-Plan_/plan.txt" + } + ], + "test.test[pg-select_win_ntile-default.txt-Results]": [ + { + "checksum": "7412d73add6a22607c65044f2feff6b2", + "size": 1742, + "uri": "https://{canondata_backend}/1946324/69ab4b2460e9b99fe4fb1fe2023492651ad0ede1/resource.tar.gz#test.test_pg-select_win_ntile-default.txt-Results_/results.txt" + } + ], "test.test[pg-sublink_projection_array-default.txt-Debug]": [ { "checksum": "00ba82742033be5f59410ea2e45f3b99", diff --git a/ydb/library/yql/tests/sql/yt_native_file/part19/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part19/canondata/result.json index 19e037a5a20f..9510c79ef387 100644 --- a/ydb/library/yql/tests/sql/yt_native_file/part19/canondata/result.json +++ b/ydb/library/yql/tests/sql/yt_native_file/part19/canondata/result.json @@ -2076,6 +2076,27 @@ "uri": "https://{canondata_backend}/1899731/35236262db500d349ca85236f500b0173ae98a5d/resource.tar.gz#test.test_pg-select_win_min_null-default.txt-Results_/results.txt" } ], + "test.test[pg-select_win_percent_rank-default.txt-Debug]": [ + { + "checksum": "4f5c3cbceec4d47e859bddcc1e5de8d9", + "size": 1169, + "uri": "https://{canondata_backend}/1937424/14c75a7495a678020a26b0deb245c4287a2d0905/resource.tar.gz#test.test_pg-select_win_percent_rank-default.txt-Debug_/opt.yql" + } + ], + "test.test[pg-select_win_percent_rank-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1937424/14c75a7495a678020a26b0deb245c4287a2d0905/resource.tar.gz#test.test_pg-select_win_percent_rank-default.txt-Plan_/plan.txt" + } + ], + "test.test[pg-select_win_percent_rank-default.txt-Results]": [ + { + "checksum": "8c7ffec3488cd07c29c9b4cdc0f60248", + "size": 1785, + "uri": "https://{canondata_backend}/1937424/14c75a7495a678020a26b0deb245c4287a2d0905/resource.tar.gz#test.test_pg-select_win_percent_rank-default.txt-Results_/results.txt" + } + ], "test.test[pg-sublink_having_in-default.txt-Debug]": [ { "checksum": "f0af46eb32dd6c590fb75115f5757461", diff --git a/ydb/library/yql/tests/sql/yt_native_file/part2/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part2/canondata/result.json index fb7a9cf78294..6b8a214b3720 100644 --- a/ydb/library/yql/tests/sql/yt_native_file/part2/canondata/result.json +++ b/ydb/library/yql/tests/sql/yt_native_file/part2/canondata/result.json @@ -2541,6 +2541,27 @@ "uri": "https://{canondata_backend}/1946324/7d1d6b1f697cbe9fb62c81047eb61d3fa72baf62/resource.tar.gz#test.test_window-win_expr_bounds--Results_/results.txt" } ], + "test.test[window-win_func_cume_dist-default.txt-Debug]": [ + { + "checksum": "875f52a8d7ea3bb403b577da92ed4680", + "size": 948, + "uri": "https://{canondata_backend}/1031349/e983f7c9dd73bbe56ec3ecb5f26c239d73471a4d/resource.tar.gz#test.test_window-win_func_cume_dist-default.txt-Debug_/opt.yql" + } + ], + "test.test[window-win_func_cume_dist-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1031349/e983f7c9dd73bbe56ec3ecb5f26c239d73471a4d/resource.tar.gz#test.test_window-win_func_cume_dist-default.txt-Plan_/plan.txt" + } + ], + "test.test[window-win_func_cume_dist-default.txt-Results]": [ + { + "checksum": "e8e0f1c699aa0fe193d57f6cf9f53d89", + "size": 1943, + "uri": "https://{canondata_backend}/1031349/e983f7c9dd73bbe56ec3ecb5f26c239d73471a4d/resource.tar.gz#test.test_window-win_func_cume_dist-default.txt-Results_/results.txt" + } + ], "test.test[window-win_func_into_udf--Debug]": [ { "checksum": "8c3022ceeb0aa0db5ac885fee9387e9f", diff --git a/ydb/library/yql/tests/sql/yt_native_file/part9/canondata/result.json b/ydb/library/yql/tests/sql/yt_native_file/part9/canondata/result.json index 0da320c81f0b..f5fb59c703db 100644 --- a/ydb/library/yql/tests/sql/yt_native_file/part9/canondata/result.json +++ b/ydb/library/yql/tests/sql/yt_native_file/part9/canondata/result.json @@ -2808,5 +2808,26 @@ "size": 2788, "uri": "https://{canondata_backend}/1031349/973ac2c3179380cbbb19c8340babd53a1b9220b8/resource.tar.gz#test.test_window-win_func_aggr_stat--Results_/results.txt" } + ], + "test.test[window-win_func_ntile-default.txt-Debug]": [ + { + "checksum": "44bc3e039931f4ab82a8b3f8307a0a9d", + "size": 948, + "uri": "https://{canondata_backend}/1942525/6ef3adf56d590c2e57cb58687258a55255f5a4ec/resource.tar.gz#test.test_window-win_func_ntile-default.txt-Debug_/opt.yql" + } + ], + "test.test[window-win_func_ntile-default.txt-Plan]": [ + { + "checksum": "b4dd508a329723c74293d80f0278c705", + "size": 505, + "uri": "https://{canondata_backend}/1942525/6ef3adf56d590c2e57cb58687258a55255f5a4ec/resource.tar.gz#test.test_window-win_func_ntile-default.txt-Plan_/plan.txt" + } + ], + "test.test[window-win_func_ntile-default.txt-Results]": [ + { + "checksum": "6643a4e8b1c2dfab5aa0079c6f1aded4", + "size": 1935, + "uri": "https://{canondata_backend}/1942525/6ef3adf56d590c2e57cb58687258a55255f5a4ec/resource.tar.gz#test.test_window-win_func_ntile-default.txt-Results_/results.txt" + } ] }