diff options
| author | vitya-smirnov <[email protected]> | 2026-05-18 14:00:49 +0300 |
|---|---|---|
| committer | vitya-smirnov <[email protected]> | 2026-05-18 14:53:18 +0300 |
| commit | fefbb8b367e0063e3779d48c09caec4e07aa1e24 (patch) | |
| tree | af9c16a87839edeff5b54bdbd93f365598f94662 /yql/essentials | |
| parent | 847adc30c455cbe39acc3d348e0ef697ca0c2d21 (diff) | |
YQL-21046: Respect AnsiCurrentRow only on ordered window
commit_hash:4b9cf4d3a0b96523e7d66cb7a0ef308b48333e93
Diffstat (limited to 'yql/essentials')
| -rw-r--r-- | yql/essentials/sql/v1/sql_translation.cpp | 2 | ||||
| -rw-r--r-- | yql/essentials/sql/v1/sql_ut_common.h | 32 |
2 files changed, 33 insertions, 1 deletions
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), "<main>:1:8: Warning: Rank(<expression>) 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<TString> 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()); |
