aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFilitov Mikhail <filitovme@gmail.com>2025-06-02 17:10:22 +0200
committerGitHub <noreply@github.com>2025-06-02 17:10:22 +0200
commit55759352dd41a3915843cdfe6f9c4b46f44aaeff (patch)
tree5bbe6b6b69547f1d0fdae2b6fce4bb963f57e0b3
parent0ba13c1debef0c90ae62661be155092acf3c15ce (diff)
downloadydb-55759352dd41a3915843cdfe6f9c4b46f44aaeff.tar.gz
Added re2 compatibility test (#19177)
-rw-r--r--ydb/core/kqp/ut/runtime/kqp_re2_ut.cpp80
-rw-r--r--ydb/core/kqp/ut/runtime/ya.make1
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(