summaryrefslogtreecommitdiffstats
path: root/yql/essentials/sql
diff options
context:
space:
mode:
authorvitya-smirnov <[email protected]>2026-05-18 14:00:49 +0300
committervitya-smirnov <[email protected]>2026-05-18 14:53:18 +0300
commitfefbb8b367e0063e3779d48c09caec4e07aa1e24 (patch)
treeaf9c16a87839edeff5b54bdbd93f365598f94662 /yql/essentials/sql
parent847adc30c455cbe39acc3d348e0ef697ca0c2d21 (diff)
YQL-21046: Respect AnsiCurrentRow only on ordered window
commit_hash:4b9cf4d3a0b96523e7d66cb7a0ef308b48333e93
Diffstat (limited to 'yql/essentials/sql')
-rw-r--r--yql/essentials/sql/v1/sql_translation.cpp2
-rw-r--r--yql/essentials/sql/v1/sql_ut_common.h32
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());