diff options
author | Filitov Mikhail <filitovme@gmail.com> | 2025-06-02 17:10:22 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-06-02 17:10:22 +0200 |
commit | 55759352dd41a3915843cdfe6f9c4b46f44aaeff (patch) | |
tree | 5bbe6b6b69547f1d0fdae2b6fce4bb963f57e0b3 | |
parent | 0ba13c1debef0c90ae62661be155092acf3c15ce (diff) | |
download | ydb-55759352dd41a3915843cdfe6f9c4b46f44aaeff.tar.gz |
Added re2 compatibility test (#19177)
-rw-r--r-- | ydb/core/kqp/ut/runtime/kqp_re2_ut.cpp | 80 | ||||
-rw-r--r-- | ydb/core/kqp/ut/runtime/ya.make | 1 |
2 files changed, 81 insertions, 0 deletions
diff --git a/ydb/core/kqp/ut/runtime/kqp_re2_ut.cpp b/ydb/core/kqp/ut/runtime/kqp_re2_ut.cpp new file mode 100644 index 00000000000..e88e763b78e --- /dev/null +++ b/ydb/core/kqp/ut/runtime/kqp_re2_ut.cpp @@ -0,0 +1,80 @@ + +#include <ydb/core/kqp/ut/common/kqp_ut_common.h> +#include <ydb/core/kqp/counters/kqp_counters.h> + +#include <ydb/library/yql/dq/actors/compute/dq_compute_actor.h> + +#include <util/system/fs.h> + +namespace NKikimr { +namespace NKqp { + +using namespace NYdb; +using namespace NYdb::NTable; + +namespace { + +void FillTableWithData(NQuery::TQueryClient& db, ui64 numRows=10) { + for (ui32 i = 0; i < numRows; ++i) { + auto result = db.ExecuteQuery(Sprintf(R"( + --!syntax_v1 + REPLACE INTO `/Root/KeyValue` (Key, Value) VALUES (%d, "%s") + )", i, TString(10 + i, 'a' + (i % 26)).c_str()), NYdb::NQuery::TTxControl::BeginTx().CommitTx()).GetValueSync(); + UNIT_ASSERT_C(result.IsSuccess(), result.GetIssues().ToString()); + } +} + +} // anonymous namespace + + +// Currently re2 udf ignores incorrect regexes. +// But this behaviour will be changed in this ticket: https://nda.ya.ru/t/kp3S6IYx7F2jgV. +// There may be queries that use the old behavior, so it is planned to use the feature flag. +// This test checks that the behavior is not changed by default. +Y_UNIT_TEST_SUITE(KqpRe2) { + +Y_UNIT_TEST(IncorrectRegexNoError) { + NKikimrConfig::TAppConfig appCfg; + TKikimrRunner kikimr(appCfg); + + auto db = kikimr.GetQueryClient(); + auto query = R"( + select "a[x" REGEXP "a[x"; + )"; + + auto explainMode = NYdb::NQuery::TExecuteQuerySettings().ExecMode(NYdb::NQuery::EExecMode::Explain); + auto planres = db.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx(), explainMode).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(planres.GetStatus(), EStatus::SUCCESS, planres.GetIssues().ToString()); + + Cerr << planres.GetStats()->GetAst() << Endl; + + auto result = db.ExecuteQuery(query, NYdb::NQuery::TTxControl::BeginTx().CommitTx(), NYdb::NQuery::TExecuteQuerySettings()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); +} + +Y_UNIT_TEST(IncorrectRegexWithoutExecutionNoError) { + NKikimrConfig::TAppConfig appCfg; + TKikimrRunner kikimr(appCfg); + + auto db = kikimr.GetQueryClient(); + + FillTableWithData(db); + + auto query = R"( + select * from `/Root/KeyValue` where Key = 1 or Value regexp "["; + )"; + + auto explainMode = NYdb::NQuery::TExecuteQuerySettings().ExecMode(NYdb::NQuery::EExecMode::Explain); + auto planres = db.ExecuteQuery(query, NYdb::NQuery::TTxControl::NoTx(), explainMode).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(planres.GetStatus(), EStatus::SUCCESS, planres.GetIssues().ToString()); + + Cerr << planres.GetStats()->GetAst() << Endl; + + auto result = db.ExecuteQuery(query, NYdb::NQuery::TTxControl::BeginTx().CommitTx(), NYdb::NQuery::TExecuteQuerySettings()).ExtractValueSync(); + UNIT_ASSERT_VALUES_EQUAL_C(result.GetStatus(), EStatus::SUCCESS, result.GetIssues().ToString()); +} + +} // suite + +} // namespace NKqp +} // namespace NKikimr diff --git a/ydb/core/kqp/ut/runtime/ya.make b/ydb/core/kqp/ut/runtime/ya.make index 5f15bda6690..01c0c6c5218 100644 --- a/ydb/core/kqp/ut/runtime/ya.make +++ b/ydb/core/kqp/ut/runtime/ya.make @@ -7,6 +7,7 @@ SIZE(MEDIUM) SRCS( kqp_scan_spilling_ut.cpp kqp_scan_logging_ut.cpp + kqp_re2_ut.cpp ) PEERDIR( |