summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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());