From 21295f757f07d3113567184a44e01cc4eaf181c2 Mon Sep 17 00:00:00 2001 From: Daniil Timizhev Date: Thu, 6 Nov 2025 19:55:36 +0300 Subject: [PATCH 1/5] Impl test --- ydb/core/kqp/ut/query/kqp_params_ut.cpp | 91 +++++++++++++++++++++++++ 1 file changed, 91 insertions(+) diff --git a/ydb/core/kqp/ut/query/kqp_params_ut.cpp b/ydb/core/kqp/ut/query/kqp_params_ut.cpp index fc79a8b15d2d..be27589ee520 100644 --- a/ydb/core/kqp/ut/query/kqp_params_ut.cpp +++ b/ydb/core/kqp/ut/query/kqp_params_ut.cpp @@ -1450,6 +1450,97 @@ Y_UNIT_TEST_SUITE(KqpParams) { } } + Y_UNIT_TEST_TWIN(WriteDatetimeValues, ColumnStore) { + auto settings = TKikimrSettings().SetWithSampleTables(false); + TKikimrRunner kikimr(settings); + + auto db = kikimr.GetQueryClient(); + + { + auto query = Sprintf(R"( + CREATE TABLE TestTable ( + Key UInt32 NOT NULL, + V_Date32 Date32, + V_Datetime64 Datetime64, + V_Timestamp64 Timestamp64, + PRIMARY KEY (Key) + ) WITH ( STORE = %s ); + )", ColumnStore ? "COLUMN" : "ROW"); + auto result = db.ExecuteQuery(query, NQuery::TTxControl::NoTx()).ExtractValueSync(); + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + } + + auto fUpsert = [&] (ui32 key, i32 date, i64 datetime, i64 timestamp) { + auto params = TParamsBuilder() + .AddParam("$key") + .Uint32(key).Build() + .AddParam("$date") + .OptionalDate32(std::chrono::sys_time(TWideDays(date))) + .Build() + .AddParam("$datetime") + .OptionalDatetime64(std::chrono::sys_time(TWideSeconds(datetime))) + .Build() + .AddParam("$timestamp") + .OptionalTimestamp64(std::chrono::sys_time(TWideMicroseconds(timestamp))) + .Build() + .Build(); + + auto result = db.ExecuteQuery(Q_(R"( + DECLARE $key AS UInt32; + DECLARE $date AS Optional; + DECLARE $datetime AS Optional; + DECLARE $timestamp AS Optional; + UPSERT INTO TestTable (Key, V_Date32, V_Datetime64, V_Timestamp64) VALUES ($key, $date, $datetime, $timestamp); + )"), NQuery::TTxControl::NoTx(), params).ExtractValueSync(); + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + }; + + std::vector> testData = { // Some values cannot be converted with TInstant::ParseIso8601(): + {0, -2208988800, 4611669811199999999}, // 1970-01-01, 1900-01-01T00:00:00Z,  148107-12-31T23:59:59.999999Z + {53375807, 0, 654243132}, // 148107-12-31, 1970-01-01T00:00:00Z,   1970-01-01T00:10:54.243132Z + {6412542, 4611669811199, 0}, // 19526-12-12, 148107-12-31T23:59:59Z,   1970-01-01T00:00:00Z + {-5677, -4611669897600, 1234567890123456}, // 1954-06-17, -144169-01-01T00:00:00Z,   2009-02-13T23:31:30.123456Z + {123, -2208988801, -4235647865}, // 1970-05-04, 1899-12-31T23:59:59Z, 1969-12-31T22:49:24.352135Z + {-53375809, -1234567890, -4611669897600000000}, // -144169-01-01, 1930-11-18T00:28:30Z, -144169-01-01T00:00:00Z + {2145, 1362485267, 1564354654123456}, // 1975-11-16, 2013-03-05T12:07:47Z, 2019-07-28T22:57:34.123456Z + {74, 2208988801, 922337203854775807}, // 1970-03-16, 2040-01-01T00:00:01Z, 31197-09-14T02:50:54.775807Z + {-389, 1762441275, 321456}, // 1968-12-08, 2025-11-06T15:01:15Z, 1970-01-01T00:00:00.321456Z + }; + + for (ui32 i = 0; i < testData.size(); ++i) { + auto [date, datetime, timestamp] = testData[i]; + fUpsert(i + 1, date, datetime, timestamp); + } + + { + TString expected = "["; + for (size_t i = 0; i < testData.size(); ++i) { + if (i > 0) { + expected += ";"; + } + auto [date, datetime, timestamp] = testData[i]; + expected += TStringBuilder() << "[" << (i + 1) << "u;[" << date << "];[" << datetime << "];[" << timestamp << "]]"; + } + expected += "]"; + + auto result = db.ExecuteQuery(Q_(R"( + SELECT Key, V_Date32, V_Datetime64, V_Timestamp64 FROM TestTable ORDER BY Key; + )"), NQuery::TTxControl::NoTx()).ExtractValueSync(); + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + CompareYson(expected, FormatResultSetYson(result.GetResultSet(0))); + } + + { + auto result = db.ExecuteQuery(Q_(R"( + SELECT DateTime::ToMicroseconds(MAX(V_Datetime64)) FROM TestTable; + )"), NQuery::TTxControl::NoTx()).ExtractValueSync(); + + i64 maxValue = std::get<1>(*std::max_element(testData.begin(), testData.end(), + [](const auto& a, const auto& b) { return std::get<1>(a) < std::get<1>(b); })); + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + CompareYson("[[[" + std::to_string(maxValue) + "000000]]]", FormatResultSetYson(result.GetResultSet(0))); + } + } } } // namespace NKqp From fb83d437a8712c1e3c5323233bcb212fceb12970 Mon Sep 17 00:00:00 2001 From: Daniil Timizhev Date: Fri, 7 Nov 2025 16:43:10 +0300 Subject: [PATCH 2/5] Revert "Impl test" This reverts commit 21295f757f07d3113567184a44e01cc4eaf181c2. --- ydb/core/kqp/ut/query/kqp_params_ut.cpp | 91 ------------------------- 1 file changed, 91 deletions(-) diff --git a/ydb/core/kqp/ut/query/kqp_params_ut.cpp b/ydb/core/kqp/ut/query/kqp_params_ut.cpp index be27589ee520..fc79a8b15d2d 100644 --- a/ydb/core/kqp/ut/query/kqp_params_ut.cpp +++ b/ydb/core/kqp/ut/query/kqp_params_ut.cpp @@ -1450,97 +1450,6 @@ Y_UNIT_TEST_SUITE(KqpParams) { } } - Y_UNIT_TEST_TWIN(WriteDatetimeValues, ColumnStore) { - auto settings = TKikimrSettings().SetWithSampleTables(false); - TKikimrRunner kikimr(settings); - - auto db = kikimr.GetQueryClient(); - - { - auto query = Sprintf(R"( - CREATE TABLE TestTable ( - Key UInt32 NOT NULL, - V_Date32 Date32, - V_Datetime64 Datetime64, - V_Timestamp64 Timestamp64, - PRIMARY KEY (Key) - ) WITH ( STORE = %s ); - )", ColumnStore ? "COLUMN" : "ROW"); - auto result = db.ExecuteQuery(query, NQuery::TTxControl::NoTx()).ExtractValueSync(); - UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); - } - - auto fUpsert = [&] (ui32 key, i32 date, i64 datetime, i64 timestamp) { - auto params = TParamsBuilder() - .AddParam("$key") - .Uint32(key).Build() - .AddParam("$date") - .OptionalDate32(std::chrono::sys_time(TWideDays(date))) - .Build() - .AddParam("$datetime") - .OptionalDatetime64(std::chrono::sys_time(TWideSeconds(datetime))) - .Build() - .AddParam("$timestamp") - .OptionalTimestamp64(std::chrono::sys_time(TWideMicroseconds(timestamp))) - .Build() - .Build(); - - auto result = db.ExecuteQuery(Q_(R"( - DECLARE $key AS UInt32; - DECLARE $date AS Optional; - DECLARE $datetime AS Optional; - DECLARE $timestamp AS Optional; - UPSERT INTO TestTable (Key, V_Date32, V_Datetime64, V_Timestamp64) VALUES ($key, $date, $datetime, $timestamp); - )"), NQuery::TTxControl::NoTx(), params).ExtractValueSync(); - UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); - }; - - std::vector> testData = { // Some values cannot be converted with TInstant::ParseIso8601(): - {0, -2208988800, 4611669811199999999}, // 1970-01-01, 1900-01-01T00:00:00Z,  148107-12-31T23:59:59.999999Z - {53375807, 0, 654243132}, // 148107-12-31, 1970-01-01T00:00:00Z,   1970-01-01T00:10:54.243132Z - {6412542, 4611669811199, 0}, // 19526-12-12, 148107-12-31T23:59:59Z,   1970-01-01T00:00:00Z - {-5677, -4611669897600, 1234567890123456}, // 1954-06-17, -144169-01-01T00:00:00Z,   2009-02-13T23:31:30.123456Z - {123, -2208988801, -4235647865}, // 1970-05-04, 1899-12-31T23:59:59Z, 1969-12-31T22:49:24.352135Z - {-53375809, -1234567890, -4611669897600000000}, // -144169-01-01, 1930-11-18T00:28:30Z, -144169-01-01T00:00:00Z - {2145, 1362485267, 1564354654123456}, // 1975-11-16, 2013-03-05T12:07:47Z, 2019-07-28T22:57:34.123456Z - {74, 2208988801, 922337203854775807}, // 1970-03-16, 2040-01-01T00:00:01Z, 31197-09-14T02:50:54.775807Z - {-389, 1762441275, 321456}, // 1968-12-08, 2025-11-06T15:01:15Z, 1970-01-01T00:00:00.321456Z - }; - - for (ui32 i = 0; i < testData.size(); ++i) { - auto [date, datetime, timestamp] = testData[i]; - fUpsert(i + 1, date, datetime, timestamp); - } - - { - TString expected = "["; - for (size_t i = 0; i < testData.size(); ++i) { - if (i > 0) { - expected += ";"; - } - auto [date, datetime, timestamp] = testData[i]; - expected += TStringBuilder() << "[" << (i + 1) << "u;[" << date << "];[" << datetime << "];[" << timestamp << "]]"; - } - expected += "]"; - - auto result = db.ExecuteQuery(Q_(R"( - SELECT Key, V_Date32, V_Datetime64, V_Timestamp64 FROM TestTable ORDER BY Key; - )"), NQuery::TTxControl::NoTx()).ExtractValueSync(); - UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); - CompareYson(expected, FormatResultSetYson(result.GetResultSet(0))); - } - - { - auto result = db.ExecuteQuery(Q_(R"( - SELECT DateTime::ToMicroseconds(MAX(V_Datetime64)) FROM TestTable; - )"), NQuery::TTxControl::NoTx()).ExtractValueSync(); - - i64 maxValue = std::get<1>(*std::max_element(testData.begin(), testData.end(), - [](const auto& a, const auto& b) { return std::get<1>(a) < std::get<1>(b); })); - UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); - CompareYson("[[[" + std::to_string(maxValue) + "000000]]]", FormatResultSetYson(result.GetResultSet(0))); - } - } } } // namespace NKqp From 11352c32bd9589e78e8345bde4057db33f44be89 Mon Sep 17 00:00:00 2001 From: Daniil Timizhev Date: Fri, 7 Nov 2025 16:44:51 +0300 Subject: [PATCH 3/5] Fix check bounds for time extended types --- ydb/core/io_formats/cell_maker/cell_maker.cpp | 8 ++++---- ydb/core/ydb_convert/ydb_convert.cpp | 16 ++++++++-------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/ydb/core/io_formats/cell_maker/cell_maker.cpp b/ydb/core/io_formats/cell_maker/cell_maker.cpp index e1b07e187ade..618285bf5971 100644 --- a/ydb/core/io_formats/cell_maker/cell_maker.cpp +++ b/ydb/core/io_formats/cell_maker/cell_maker.cpp @@ -518,13 +518,13 @@ bool CheckCellValue(const TCell& cell, const NScheme::TTypeInfo& typeInfo) { case NScheme::NTypeIds::Interval: return (ui64)std::abs(cell.AsValue()) < NUdf::MAX_TIMESTAMP; case NScheme::NTypeIds::Date32: - return cell.AsValue() < NUdf::MAX_DATE32; + return cell.AsValue() >= NUdf::MIN_DATE32 && cell.AsValue() <= NUdf::MAX_DATE32; case NScheme::NTypeIds::Datetime64: - return cell.AsValue() < NUdf::MAX_DATETIME64; + return cell.AsValue() >= NUdf::MIN_DATETIME64 && cell.AsValue() <= NUdf::MAX_DATETIME64; case NScheme::NTypeIds::Timestamp64: - return cell.AsValue() < NUdf::MAX_TIMESTAMP64; + return cell.AsValue() >= NUdf::MIN_TIMESTAMP64 && cell.AsValue() <= NUdf::MAX_TIMESTAMP64; case NScheme::NTypeIds::Interval64: - return std::abs(cell.AsValue()) < NUdf::MAX_INTERVAL64; + return std::abs(cell.AsValue()) <= NUdf::MAX_INTERVAL64; case NScheme::NTypeIds::Utf8: return NYql::IsUtf8(cell.AsBuf()); case NScheme::NTypeIds::Yson: diff --git a/ydb/core/ydb_convert/ydb_convert.cpp b/ydb/core/ydb_convert/ydb_convert.cpp index 1cc081bd59ea..ae60e8153a0d 100644 --- a/ydb/core/ydb_convert/ydb_convert.cpp +++ b/ydb/core/ydb_convert/ydb_convert.cpp @@ -480,28 +480,28 @@ Y_FORCE_INLINE void ConvertData(NUdf::TDataTypeId typeId, const Ydb::Value& valu break; case NUdf::TDataType::Id: CheckTypeId(value.value_case(), Ydb::Value::kInt32Value, "Date32"); - if (value.int32_value() >= NUdf::MAX_DATE32) { + if (value.int32_value() < NUdf::MIN_DATE32 || value.int32_value() > NUdf::MAX_DATE32) { throw yexception() << "Invalid Date32 value"; } res.SetInt32(value.int32_value()); break; case NUdf::TDataType::Id: CheckTypeId(value.value_case(), Ydb::Value::kInt64Value, "Datetime64"); - if (value.int64_value() >= NUdf::MAX_DATETIME64) { + if (value.int64_value() < NUdf::MIN_DATETIME64 || value.int64_value() > NUdf::MAX_DATETIME64) { throw yexception() << "Invalid Datetime64 value"; } res.SetInt64(value.int64_value()); break; case NUdf::TDataType::Id: CheckTypeId(value.value_case(), Ydb::Value::kInt64Value, "Timestamp64"); - if (value.int64_value() >= NUdf::MAX_TIMESTAMP64) { + if (value.int64_value() < NUdf::MIN_TIMESTAMP64 || value.int64_value() > NUdf::MAX_TIMESTAMP64) { throw yexception() << "Invalid Timestamp64 value"; } res.SetInt64(value.int64_value()); break; case NUdf::TDataType::Id: CheckTypeId(value.value_case(), Ydb::Value::kInt64Value, "Interval64"); - if (std::abs(value.int64_value()) >= NUdf::MAX_INTERVAL64) { + if (std::abs(value.int64_value()) > NUdf::MAX_INTERVAL64) { throw yexception() << "Invalid Interval64 value"; } res.SetInt64(value.int64_value()); @@ -1123,19 +1123,19 @@ bool CheckValueData(NScheme::TTypeInfo type, const TCell& cell, TString& err) { break; case NScheme::NTypeIds::Date32: - ok = cell.AsValue() < NUdf::MAX_DATE32; + ok = cell.AsValue() >= NUdf::MIN_DATE32 && cell.AsValue() <= NUdf::MAX_DATE32; break; case NScheme::NTypeIds::Datetime64: - ok = cell.AsValue() < NUdf::MAX_DATETIME64; + ok = cell.AsValue() >= NUdf::MIN_DATETIME64 && cell.AsValue() <= NUdf::MAX_DATETIME64; break; case NScheme::NTypeIds::Timestamp64: - ok = cell.AsValue() < NUdf::MAX_TIMESTAMP64; + ok = cell.AsValue() >= NUdf::MIN_TIMESTAMP64 && cell.AsValue() <= NUdf::MAX_TIMESTAMP64; break; case NScheme::NTypeIds::Interval64: - ok = std::abs(cell.AsValue()) < NUdf::MAX_INTERVAL64; + ok = std::abs(cell.AsValue()) <= NUdf::MAX_INTERVAL64; break; case NScheme::NTypeIds::Utf8: From 030a42f86c3f0961625aa28e6a037db0db5c1e0a Mon Sep 17 00:00:00 2001 From: Daniil Timizhev Date: Fri, 7 Nov 2025 16:55:37 +0300 Subject: [PATCH 4/5] Impl test to check bounds --- ydb/core/kqp/ut/query/kqp_query_ut.cpp | 110 +++++++++++++++++++++++++ 1 file changed, 110 insertions(+) diff --git a/ydb/core/kqp/ut/query/kqp_query_ut.cpp b/ydb/core/kqp/ut/query/kqp_query_ut.cpp index 6cda15664830..5869379912af 100644 --- a/ydb/core/kqp/ut/query/kqp_query_ut.cpp +++ b/ydb/core/kqp/ut/query/kqp_query_ut.cpp @@ -11,6 +11,7 @@ #include #include #include +#include #include @@ -74,6 +75,115 @@ Y_UNIT_TEST_SUITE(KqpQuery) { UNIT_ASSERT_VALUES_EQUAL(counters.RecompileRequestGet()->Val(), 1); } + Y_UNIT_TEST_TWIN(ExtendedTimeOutOfBounds, BulkUpsert) { + auto settings = TKikimrSettings().SetWithSampleTables(false); + TKikimrRunner kikimr(settings); + + auto queryClient = kikimr.GetQueryClient(); + auto tableClient = kikimr.GetTableClient(); + + { + const std::string query = R"( + CREATE TABLE `/Root/TimeTable` ( + Key UInt32 NOT NULL, + V_Date32 Date32, + V_Datetime64 Datetime64, + V_Timestamp64 Timestamp64, + V_Interval64 Interval64, + PRIMARY KEY (Key) + ); + )"; + auto result = queryClient.ExecuteQuery(query, NQuery::TTxControl::NoTx()).ExtractValueSync(); + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + } + + auto fUpsertAndCheck = [&](ui32 key, T value, bool success) { + std::string colName; + if (BulkUpsert) { + TValueBuilder rows; + rows.BeginList(); + rows.AddListItem().BeginStruct().AddMember("Key").Uint32(key); + if constexpr (std::is_same_v) { + rows.AddMember("V_Date32").Date32(std::chrono::sys_time(TWideDays(value))); + colName = "V_Date32"; + } else if constexpr (std::is_same_v) { + rows.AddMember("V_Datetime64").Datetime64(std::chrono::sys_time(TWideSeconds(value))); + colName = "V_Datetime64"; + } else if constexpr (std::is_same_v) { + rows.AddMember("V_Timestamp64").Timestamp64(std::chrono::sys_time(TWideMicroseconds(value))); + colName = "V_Timestamp64"; + } else if constexpr (std::is_same_v) { + rows.AddMember("V_Interval64").Interval64(TWideMicroseconds(value)); + colName = "V_Interval64"; + } else { + UNIT_ASSERT_C(false, "Unsupported type"); + } + rows.EndStruct().EndList(); + + auto result = tableClient.BulkUpsert("/Root/TimeTable", rows.Build()).GetValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.IsSuccess(), success, result.GetIssues().ToString()); + } else { + auto params = std::move(TParamsBuilder().AddParam("$key").Uint32(key).Build()); + if constexpr (std::is_same_v) { + params.AddParam("$param").Date32(std::chrono::sys_time(TWideDays(value))).Build(); + colName = "V_Date32"; + } else if constexpr (std::is_same_v) { + params.AddParam("$param").Datetime64(std::chrono::sys_time(TWideSeconds(value))).Build(); + colName = "V_Datetime64"; + } else if constexpr (std::is_same_v) { + params.AddParam("$param").Timestamp64(std::chrono::sys_time(TWideMicroseconds(value))).Build(); + colName = "V_Timestamp64"; + } else if constexpr (std::is_same_v) { + params.AddParam("$param").Interval64(TWideMicroseconds(value)).Build(); + colName = "V_Interval64"; + } else { + UNIT_ASSERT_C(false, "Unsupported type"); + } + + auto result = queryClient.ExecuteQuery(Sprintf(R"( + UPSERT INTO `/Root/TimeTable` (Key, %s) VALUES ($key, $param); + )", colName.c_str()), NQuery::TTxControl::NoTx(), params.Build()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.IsSuccess(), success, result.GetIssues().ToString()); + } + }; + + { + // Date32 + fUpsertAndCheck(1, TWideDays(0), /* success */ true); // Basic + fUpsertAndCheck(2, TWideDays(NYql::NUdf::MIN_DATE32), /* success */ true); // Min is inclusive + fUpsertAndCheck(3, TWideDays(NYql::NUdf::MAX_DATE32), /* success */ true); // Max is inclusive + fUpsertAndCheck(4, TWideDays(NYql::NUdf::MIN_DATE32 - 1), /* success */ false); // Out of bounds + fUpsertAndCheck(5, TWideDays(NYql::NUdf::MAX_DATE32 + 1), /* success */ false); // Out of bounds + } + + { + // Datetime64 + fUpsertAndCheck(11, TWideSeconds(0), /* success */ true); // Basic + fUpsertAndCheck(12, TWideSeconds(NYql::NUdf::MIN_DATETIME64), /* success */ true); // Min is inclusive + fUpsertAndCheck(13, TWideSeconds(NYql::NUdf::MAX_DATETIME64), /* success */ true); // Max is inclusive + fUpsertAndCheck(14, TWideSeconds(NYql::NUdf::MIN_DATETIME64 - 1), /* success */ false); // Out of bounds + fUpsertAndCheck(15, TWideSeconds(NYql::NUdf::MAX_DATETIME64 + 1), /* success */ false); // Out of bounds + } + + { + // Timestamp64 + fUpsertAndCheck(21, TWideMicroseconds(0), /* success */ true); // Basic + fUpsertAndCheck(22, TWideMicroseconds(NYql::NUdf::MIN_TIMESTAMP64), /* success */ true); // Min is inclusive + fUpsertAndCheck(23, TWideMicroseconds(NYql::NUdf::MAX_TIMESTAMP64), /* success */ true); // Max is inclusive + fUpsertAndCheck(24, TWideMicroseconds(NYql::NUdf::MIN_TIMESTAMP64 - 1), /* success */ false); // Out of bounds + fUpsertAndCheck(25, TWideMicroseconds(NYql::NUdf::MAX_TIMESTAMP64 + 1), /* success */ false); // Out of bounds + } + + { + // Interval64 + fUpsertAndCheck(31, static_cast(0), /* success */ true); // Basic + fUpsertAndCheck(33, NYql::NUdf::MAX_INTERVAL64, /* success */ true); // Max is inclusive + fUpsertAndCheck(33, -NYql::NUdf::MAX_INTERVAL64, /* success */ true); // -Max is inclusive + fUpsertAndCheck(34, NYql::NUdf::MAX_INTERVAL64 + 1, /* success */ false); // Out of bounds + fUpsertAndCheck(35, -(NYql::NUdf::MAX_INTERVAL64 + 1), /* success */ false); // Out of bounds + } + } + Y_UNIT_TEST_TWIN(DecimalOutOfPrecisionBulk, EnableParameterizedDecimal) { TKikimrSettings serverSettings; serverSettings.FeatureFlags.SetEnableParameterizedDecimal(EnableParameterizedDecimal); From 6004f4a8531ee4ff3ba1ddd36755b2be4e220723 Mon Sep 17 00:00:00 2001 From: Daniil Timizhev Date: Fri, 7 Nov 2025 17:22:39 +0300 Subject: [PATCH 5/5] typo fix --- ydb/core/kqp/ut/query/kqp_query_ut.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ydb/core/kqp/ut/query/kqp_query_ut.cpp b/ydb/core/kqp/ut/query/kqp_query_ut.cpp index 5869379912af..4886de4c7ab3 100644 --- a/ydb/core/kqp/ut/query/kqp_query_ut.cpp +++ b/ydb/core/kqp/ut/query/kqp_query_ut.cpp @@ -177,7 +177,7 @@ Y_UNIT_TEST_SUITE(KqpQuery) { { // Interval64 fUpsertAndCheck(31, static_cast(0), /* success */ true); // Basic - fUpsertAndCheck(33, NYql::NUdf::MAX_INTERVAL64, /* success */ true); // Max is inclusive + fUpsertAndCheck(32, NYql::NUdf::MAX_INTERVAL64, /* success */ true); // Max is inclusive fUpsertAndCheck(33, -NYql::NUdf::MAX_INTERVAL64, /* success */ true); // -Max is inclusive fUpsertAndCheck(34, NYql::NUdf::MAX_INTERVAL64 + 1, /* success */ false); // Out of bounds fUpsertAndCheck(35, -(NYql::NUdf::MAX_INTERVAL64 + 1), /* success */ false); // Out of bounds