Skip to content

Commit 88a86d9

Browse files
authored
Fix RebuildCalcOverWindowGroup failing with PercentRank/CumeDist/Ntile (#8148)
1 parent 8c9a6ff commit 88a86d9

File tree

8 files changed

+108
-16
lines changed

8 files changed

+108
-16
lines changed

ydb/library/yql/core/common_opt/yql_co_extr_members.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -603,7 +603,7 @@ TExprNode::TPtr ApplyExtractMembersToCalcOverWindow(const TExprNode::TPtr& node,
603603
if (payload->IsCallable("WindowTraits")) {
604604
structType = payload->Child(0)->GetTypeAnn()->Cast<TTypeExprType>()->GetType()->Cast<TStructExprType>();
605605
}
606-
else if (payload->IsCallable({"Lead", "Lag", "Rank", "DenseRank"})) {
606+
else if (payload->IsCallable({"Lead", "Lag", "Rank", "DenseRank", "PercentRank"})) {
607607
structType = payload->Child(0)->GetTypeAnn()->Cast<TTypeExprType>()->GetType()->Cast<TListExprType>()
608608
->GetItemType()->Cast<TStructExprType>();
609609
} else {

ydb/library/yql/core/yql_execution.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -912,7 +912,7 @@ TAutoPtr<IGraphTransformer> CreateCheckExecutionTransformer(const TTypeAnnotatio
912912

913913
return true;
914914
};
915-
static const THashSet<TStringBuf> noExecutionList = {"InstanceOf", "Lag", "Lead", "Rank", "DenseRank", "RowNumber"};
915+
static const THashSet<TStringBuf> noExecutionList = {"InstanceOf", "Lag", "Lead", "RowNumber", "Rank", "DenseRank", "PercentRank", "CumeDist", "NTile"};
916916
static const THashSet<TStringBuf> noExecutionListForCalcOverWindow = {"InstanceOf"};
917917
VisitExpr(input, [funcCheckExecution](const TExprNode::TPtr& node) {
918918
bool collectCalcOverWindow = true;

ydb/library/yql/core/yql_opt_window.cpp

Lines changed: 6 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -3101,7 +3101,7 @@ TExprNode::TPtr RebuildCalcOverWindowGroup(TPositionHandle pos, const TExprNode:
31013101
auto columnName = kvTuple->ChildPtr(0);
31023102

31033103
auto traits = kvTuple->ChildPtr(1);
3104-
YQL_ENSURE(traits->IsCallable({"Lag", "Lead", "RowNumber", "Rank", "DenseRank", "WindowTraits"}));
3104+
YQL_ENSURE(traits->IsCallable({"Lag", "Lead", "RowNumber", "Rank", "DenseRank", "WindowTraits", "PercentRank", "CumeDist", "NTile"}));
31053105
if (traits->IsCallable("WindowTraits")) {
31063106
YQL_ENSURE(traits->Head().GetTypeAnn());
31073107
const TTypeAnnotationNode& oldItemType = *traits->Head().GetTypeAnn()->Cast<TTypeExprType>()->GetType();
@@ -3115,19 +3115,11 @@ TExprNode::TPtr RebuildCalcOverWindowGroup(TPositionHandle pos, const TExprNode:
31153115
.Add(5, traits->Child(5)->IsLambda() ? ctx.DeepCopyLambda(*traits->Child(5)) : traits->ChildPtr(5))
31163116
.Seal()
31173117
.Build();
3118-
} else {
3119-
TExprNodeList args;
3120-
args.push_back(inputType);
3121-
if (traits->ChildrenSize() > 1) {
3122-
YQL_ENSURE(traits->Head().GetTypeAnn());
3123-
const TTypeAnnotationNode& oldItemType = *traits->Head().GetTypeAnn()->Cast<TTypeExprType>()->GetType()
3124-
->Cast<TListExprType>()->GetItemType();
3125-
args.push_back(ctx.DeepCopyLambda(*ReplaceFirstLambdaArgWithCastStruct(*traits->Child(1), oldItemType, ctx)));
3126-
}
3127-
if (traits->ChildrenSize() > 2) {
3128-
args.push_back(traits->ChildPtr(2));
3129-
}
3130-
traits = ctx.NewCallable(traits->Pos(), traits->Content(), std::move(args));
3118+
} else if (traits->IsCallable({"Lag", "Lead", "Rank", "DenseRank", "PercentRank"})) {
3119+
YQL_ENSURE(traits->Head().GetTypeAnn());
3120+
const TTypeAnnotationNode& oldItemType = *traits->Head().GetTypeAnn()->Cast<TTypeExprType>()->GetType()
3121+
->Cast<TListExprType>()->GetItemType();
3122+
traits = ctx.ChangeChild(*traits, 1, ctx.DeepCopyLambda(*ReplaceFirstLambdaArgWithCastStruct(*traits->Child(1), oldItemType, ctx)));
31313123
}
31323124

31333125
winOnArgs.push_back(ctx.NewList(kvTuple->Pos(), {columnName, traits}));

ydb/library/yql/tests/sql/dq_file/part6/canondata/result.json

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2984,6 +2984,28 @@
29842984
}
29852985
],
29862986
"test.test[window-win_with_cur_row--Results]": [],
2987+
"test.test[window-yql-18879-default.txt-Analyze]": [
2988+
{
2989+
"checksum": "b2a2eb5d6b0a138ee924c128fc7738ef",
2990+
"size": 1331,
2991+
"uri": "https://{canondata_backend}/1936842/50b264d4daedd2dfbc510cffe988c135e4f73a28/resource.tar.gz#test.test_window-yql-18879-default.txt-Analyze_/plan.txt"
2992+
}
2993+
],
2994+
"test.test[window-yql-18879-default.txt-Debug]": [
2995+
{
2996+
"checksum": "8529758bc30fa229fd7a0769ba68a5b0",
2997+
"size": 2278,
2998+
"uri": "https://{canondata_backend}/1936842/50b264d4daedd2dfbc510cffe988c135e4f73a28/resource.tar.gz#test.test_window-yql-18879-default.txt-Debug_/opt.yql_patched"
2999+
}
3000+
],
3001+
"test.test[window-yql-18879-default.txt-Plan]": [
3002+
{
3003+
"checksum": "b2a2eb5d6b0a138ee924c128fc7738ef",
3004+
"size": 1331,
3005+
"uri": "https://{canondata_backend}/1936842/50b264d4daedd2dfbc510cffe988c135e4f73a28/resource.tar.gz#test.test_window-yql-18879-default.txt-Plan_/plan.txt"
3006+
}
3007+
],
3008+
"test.test[window-yql-18879-default.txt-Results]": [],
29873009
"test.test[ypath-empty_range--Analyze]": [
29883010
{
29893011
"checksum": "3dbb5da9da6aa6644bd298b1538eb071",

ydb/library/yql/tests/sql/hybrid_file/part9/canondata/result.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3120,5 +3120,19 @@
31203120
"size": 9696,
31213121
"uri": "https://{canondata_backend}/1900335/8eba31ae2dcfd9245ad9327a1ac3ca89667336e2/resource.tar.gz#test.test_window-win_func_over_group_by_compl--Plan_/plan.txt"
31223122
}
3123+
],
3124+
"test.test[window-yql-18879-default.txt-Debug]": [
3125+
{
3126+
"checksum": "107f886aa0e93d111584285ae5b82be0",
3127+
"size": 2277,
3128+
"uri": "https://{canondata_backend}/1871002/7e2607acdc67e4a5b8020e384ddfda98482a3dd6/resource.tar.gz#test.test_window-yql-18879-default.txt-Debug_/opt.yql_patched"
3129+
}
3130+
],
3131+
"test.test[window-yql-18879-default.txt-Plan]": [
3132+
{
3133+
"checksum": "b2a2eb5d6b0a138ee924c128fc7738ef",
3134+
"size": 1331,
3135+
"uri": "https://{canondata_backend}/1871002/7e2607acdc67e4a5b8020e384ddfda98482a3dd6/resource.tar.gz#test.test_window-yql-18879-default.txt-Plan_/plan.txt"
3136+
}
31233137
]
31243138
}

ydb/library/yql/tests/sql/sql2yql/canondata/result.json

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19473,6 +19473,13 @@
1947319473
"uri": "https://{canondata_backend}/1784117/d56ae82ad9d30397a41490647be1bd2124718f98/resource.tar.gz#test_sql2yql.test_window-yql-15636_/sql.yql"
1947419474
}
1947519475
],
19476+
"test_sql2yql.test[window-yql-18879]": [
19477+
{
19478+
"checksum": "acd0d2f0152d3728ef363717eb7ed654",
19479+
"size": 8530,
19480+
"uri": "https://{canondata_backend}/1942415/d0aa280e24836862b642f2bd8ee614bf63cf9088/resource.tar.gz#test_sql2yql.test_window-yql-18879_/sql.yql"
19481+
}
19482+
],
1947619483
"test_sql2yql.test[ypath-complex]": [
1947719484
{
1947819485
"checksum": "d11b6069940af0d1e033fbbf4997c040",
@@ -35860,6 +35867,13 @@
3586035867
"uri": "https://{canondata_backend}/1880306/64654158d6bfb1289c66c626a8162239289559d0/resource.tar.gz#test_sql_format.test_window-yql-15636_/formatted.sql"
3586135868
}
3586235869
],
35870+
"test_sql_format.test[window-yql-18879]": [
35871+
{
35872+
"checksum": "e82f980726591f4bed27ef8a7f1ac878",
35873+
"size": 1400,
35874+
"uri": "https://{canondata_backend}/1937027/7e0abe7a9623e4dd081b7634462dda3c0149635b/resource.tar.gz#test_sql_format.test_window-yql-18879_/formatted.sql"
35875+
}
35876+
],
3586335877
"test_sql_format.test[ypath-complex]": [
3586435878
{
3586535879
"checksum": "d8daa40cefd0f61a59c4bff1d2902d90",
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
/* syntax version 1 */
2+
/* postgres can not */
3+
4+
$t1 = AsList(
5+
AsStruct(100 AS itemid, 20 AS duration, 2 AS start_shows, 1 AS day),
6+
AsStruct(1001 AS itemid, 10 AS duration, 2 AS start_shows, 1 AS day),
7+
AsStruct(134 AS itemid, 25 AS duration, 1 AS start_shows, 1 AS day),
8+
AsStruct(123 AS itemid, 24 AS duration, 1 AS start_shows, 1 AS day),
9+
AsStruct(23 AS itemid, 30 AS duration, 1 AS start_shows, 2 AS day),
10+
AsStruct(23 AS itemid, 30 AS duration, 1 AS start_shows, 2 AS day),
11+
AsStruct(1 AS itemid, 45 AS duration, 1 AS start_shows, 2 AS day),
12+
AsStruct(30 AS itemid, 63 AS duration, 1 AS start_shows, 2 AS day),
13+
AsStruct(53 AS itemid, 1000 AS duration, 0 AS start_shows, 2 AS day),
14+
);
15+
16+
SELECT
17+
PERCENT_RANK() OVER (PARTITION BY day ORDER BY start_shows DESC) AS col1,
18+
SUM(start_shows) OVER (PARTITION BY day) AS col2
19+
FROM AS_TABLE($t1);
20+
21+
SELECT
22+
CUME_DIST() OVER (PARTITION BY day ORDER BY start_shows DESC) AS col1,
23+
SUM(start_shows) OVER (PARTITION BY day) AS col2
24+
FROM AS_TABLE($t1);
25+
26+
SELECT
27+
NTILE(2) OVER (PARTITION BY day ORDER BY start_shows DESC) AS col1,
28+
SUM(start_shows) OVER (PARTITION BY day) AS col2
29+
FROM AS_TABLE($t1);

ydb/library/yql/tests/sql/yt_native_file/part6/canondata/result.json

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2833,6 +2833,27 @@
28332833
"uri": "https://{canondata_backend}/1924537/2f28b0eebe4156125fa9fe084e0ede26fda21bd7/resource.tar.gz#test.test_window-win_with_cur_row--Results_/results.txt"
28342834
}
28352835
],
2836+
"test.test[window-yql-18879-default.txt-Debug]": [
2837+
{
2838+
"checksum": "1ffdfedc9788ef32d8e32c40a3248679",
2839+
"size": 2205,
2840+
"uri": "https://{canondata_backend}/1889210/6470d92307a88cf3afa7d93cebdbcb80c6907e9a/resource.tar.gz#test.test_window-yql-18879-default.txt-Debug_/opt.yql"
2841+
}
2842+
],
2843+
"test.test[window-yql-18879-default.txt-Plan]": [
2844+
{
2845+
"checksum": "b2a2eb5d6b0a138ee924c128fc7738ef",
2846+
"size": 1331,
2847+
"uri": "https://{canondata_backend}/1889210/6470d92307a88cf3afa7d93cebdbcb80c6907e9a/resource.tar.gz#test.test_window-yql-18879-default.txt-Plan_/plan.txt"
2848+
}
2849+
],
2850+
"test.test[window-yql-18879-default.txt-Results]": [
2851+
{
2852+
"checksum": "9b1737fb747a85450e769356ef0c3ebe",
2853+
"size": 5443,
2854+
"uri": "https://{canondata_backend}/1889210/6470d92307a88cf3afa7d93cebdbcb80c6907e9a/resource.tar.gz#test.test_window-yql-18879-default.txt-Results_/results.txt"
2855+
}
2856+
],
28362857
"test.test[ypath-empty_range--Debug]": [
28372858
{
28382859
"checksum": "950f33b6f040439ee060eae346b8a349",

0 commit comments

Comments
 (0)