From fefbb8b367e0063e3779d48c09caec4e07aa1e24 Mon Sep 17 00:00:00 2001 From: vitya-smirnov Date: Mon, 18 May 2026 14:00:49 +0300 Subject: YQL-21046: Respect AnsiCurrentRow only on ordered window commit_hash:4b9cf4d3a0b96523e7d66cb7a0ef308b48333e93 --- yql/essentials/sql/v1/sql_translation.cpp | 2 +- yql/essentials/sql/v1/sql_ut_common.h | 32 +++++++++++++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) diff --git a/yql/essentials/sql/v1/sql_translation.cpp b/yql/essentials/sql/v1/sql_translation.cpp index 73e178bf7ff..86885cd8d98 100644 --- a/yql/essentials/sql/v1/sql_translation.cpp +++ b/yql/essentials/sql/v1/sql_translation.cpp @@ -5110,7 +5110,7 @@ TWindowSpecificationPtr TSqlTranslation::WindowSpecification(const TRule_window_ winSpecPtr->Frame->FrameExclusion = EFrameExclusions::FrameExclNone; winSpecPtr->Frame->FrameBegin->Settings = EFrameSettings::FramePreceding; - if (Ctx_.AnsiCurrentRow) { + if (Ctx_.AnsiCurrentRow && ordered) { // RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW winSpecPtr->Frame->FrameType = EFrameType::FrameByRange; winSpecPtr->Frame->FrameEnd->Settings = EFrameSettings::FrameCurrentRow; diff --git a/yql/essentials/sql/v1/sql_ut_common.h b/yql/essentials/sql/v1/sql_ut_common.h index 537af75fcdf..c029e0c2e99 100644 --- a/yql/essentials/sql/v1/sql_ut_common.h +++ b/yql/essentials/sql/v1/sql_ut_common.h @@ -7115,6 +7115,38 @@ Y_UNIT_TEST(WarnOnRankExprWithUnorderedWindow) { UNIT_ASSERT_NO_DIFF(Err2Str(res), "
:1:8: Warning: Rank() is used with unordered window - the result is likely to be undefined, code: 4521\n"); } +Y_UNIT_TEST(AnsiCurrentRow) { + const auto check = [](TString spec, TString expected, TMaybe flag) { + TString query = R"sql( + $events = (SELECT * FROM (VALUES + (1, 10, 5), + (2, 10, 5), + (3, 20, 10) + ) AS events (event_id, ts, val)); + SELECT ts, val, SUM(val) OVER (SPEC) AS run_sum FROM $events ORDER BY ts, event_id; + )sql"; + SubstGlobal(query, "SPEC", spec); + + NSQLTranslation::TTranslationSettings settings; + if (flag) { + settings.Flags.emplace(*flag); + } + + NYql::TAstParseResult res = SqlToYqlWithSettings(query, settings); + UNIT_ASSERT_C(res.IsOk(), Err2Str(res)); + + TWordCountHive stat({"WinOnRows", "WinOnRange"}); + VerifyProgram(res, stat); + UNIT_ASSERT_VALUES_EQUAL(stat["WinOnRows"], expected == "WinOnRows" ? 1 : 0); + UNIT_ASSERT_VALUES_EQUAL(stat["WinOnRange"], expected == "WinOnRange" ? 1 : 0); + }; + + check("ORDER BY ts", "WinOnRows", Nothing()); + check("", "WinOnRows", Nothing()); + check("ORDER BY ts", "WinOnRange", "AnsiCurrentRow"); + check("", "WinOnRows", "AnsiCurrentRow"); +} + Y_UNIT_TEST(AnyAsTableName) { NYql::TAstParseResult res = SqlToYql("use plato; select * from any;"); UNIT_ASSERT(!res.IsOk()); -- cgit v1.3