summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorvitya-smirnov <[email protected]>2025-06-23 10:49:42 +0300
committervitya-smirnov <[email protected]>2025-06-23 11:12:19 +0300
commitd0741457b40bb95bc60a34d74b59fdc40e20eb57 (patch)
tree7420ced126ca258c28bb64ea184192835ac3ae8e
parentbb0b9384b505c7ce8664a29174f1a89f6e72710b (diff)
YQL-19747: Fix case sensivity
Bug was that titlecase columns are not completed on lowercase prefix, e.g. `SELECT a# FROM x`, where `x = {Age}`. commit_hash:e48f73176e94bcf16671af56d232450e368c9909
-rw-r--r--yql/essentials/sql/v1/complete/name/object/simple/schema.cpp10
-rw-r--r--yql/essentials/sql/v1/complete/name/object/simple/ya.make1
-rw-r--r--yql/essentials/sql/v1/complete/name/service/cluster/name_service.cpp6
-rw-r--r--yql/essentials/sql/v1/complete/name/service/cluster/ya.make1
-rw-r--r--yql/essentials/sql/v1/complete/sql_complete_ut.cpp20
5 files changed, 22 insertions, 16 deletions
diff --git a/yql/essentials/sql/v1/complete/name/object/simple/schema.cpp b/yql/essentials/sql/v1/complete/name/object/simple/schema.cpp
index 043464bd73e..2806b80eead 100644
--- a/yql/essentials/sql/v1/complete/name/object/simple/schema.cpp
+++ b/yql/essentials/sql/v1/complete/name/object/simple/schema.cpp
@@ -1,5 +1,7 @@
#include "schema.h"
+#include <library/cpp/case_insensitive_string/case_insensitive_string.h>
+
#include <util/charset/utf8.h>
namespace NSQLComplete {
@@ -11,8 +13,8 @@ namespace NSQLComplete {
static auto FilterEntriesByName(TString name) {
return [name = std::move(name)](auto f) {
TVector<TFolderEntry> entries = f.ExtractValue();
- EraseIf(entries, [prefix = ToLowerUTF8(name)](const TFolderEntry& entry) {
- return !entry.Name.StartsWith(prefix);
+ EraseIf(entries, [prefix = TCaseInsensitiveStringBuf(name)](const TFolderEntry& entry) {
+ return !TCaseInsensitiveStringBuf(entry.Name).StartsWith(prefix);
});
return entries;
};
@@ -49,8 +51,8 @@ namespace NSQLComplete {
static auto FilterColumnsByName(TString name) {
return [name = std::move(name)](auto f) {
return f.ExtractValue().Transform([&](auto&& table) {
- EraseIf(table.Columns, [prefix = ToLowerUTF8(name)](const TString& name) {
- return !name.StartsWith(prefix);
+ EraseIf(table.Columns, [prefix = TCaseInsensitiveStringBuf(name)](const TString& name) {
+ return !TCaseInsensitiveStringBuf(name).StartsWith(prefix);
});
return table;
});
diff --git a/yql/essentials/sql/v1/complete/name/object/simple/ya.make b/yql/essentials/sql/v1/complete/name/object/simple/ya.make
index 56eafc1b848..2456fbbeb69 100644
--- a/yql/essentials/sql/v1/complete/name/object/simple/ya.make
+++ b/yql/essentials/sql/v1/complete/name/object/simple/ya.make
@@ -6,6 +6,7 @@ SRCS(
PEERDIR(
yql/essentials/sql/v1/complete/name/object
+ library/cpp/case_insensitive_string
)
END()
diff --git a/yql/essentials/sql/v1/complete/name/service/cluster/name_service.cpp b/yql/essentials/sql/v1/complete/name/service/cluster/name_service.cpp
index db0ba00b667..6d4754b6d48 100644
--- a/yql/essentials/sql/v1/complete/name/service/cluster/name_service.cpp
+++ b/yql/essentials/sql/v1/complete/name/service/cluster/name_service.cpp
@@ -1,5 +1,7 @@
#include "name_service.h"
+#include <library/cpp/case_insensitive_string/case_insensitive_string.h>
+
#include <util/charset/utf8.h>
namespace NSQLComplete {
@@ -11,8 +13,8 @@ namespace NSQLComplete {
static auto FilterByName(TString name) {
return [name = std::move(name)](auto f) {
TClusterList clusters = f.ExtractValue();
- EraseIf(clusters, [prefix = ToLowerUTF8(name)](const TString& instance) {
- return !instance.StartsWith(prefix);
+ EraseIf(clusters, [prefix = TCaseInsensitiveStringBuf(name)](const TString& instance) {
+ return !TCaseInsensitiveStringBuf(instance).StartsWith(prefix);
});
return clusters;
};
diff --git a/yql/essentials/sql/v1/complete/name/service/cluster/ya.make b/yql/essentials/sql/v1/complete/name/service/cluster/ya.make
index 4849690a6f2..363814ef4f5 100644
--- a/yql/essentials/sql/v1/complete/name/service/cluster/ya.make
+++ b/yql/essentials/sql/v1/complete/name/service/cluster/ya.make
@@ -7,6 +7,7 @@ SRCS(
PEERDIR(
yql/essentials/sql/v1/complete/name/cluster
yql/essentials/sql/v1/complete/name/service
+ library/cpp/case_insensitive_string
)
END()
diff --git a/yql/essentials/sql/v1/complete/sql_complete_ut.cpp b/yql/essentials/sql/v1/complete/sql_complete_ut.cpp
index 3440fd16c20..e9dfad58282 100644
--- a/yql/essentials/sql/v1/complete/sql_complete_ut.cpp
+++ b/yql/essentials/sql/v1/complete/sql_complete_ut.cpp
@@ -109,8 +109,8 @@ Y_UNIT_TEST_SUITE(SqlCompleteTests) {
}},
"example": { "type": "Folder", "entries": {
"people": { "type": "Table", "columns": {
- "name": {},
- "age": {}
+ "Name": {},
+ "Age": {}
}},
"yql": { "type": "Folder", "entries": {
"tutorial": { "type": "Table", "columns": {} }
@@ -1075,29 +1075,29 @@ Y_UNIT_TEST_SUITE(SqlCompleteTests) {
auto engine = MakeSqlCompletionEngineUT();
{
TVector<TCandidate> expected = {
- {ColumnName, "age"},
- {ColumnName, "name"},
+ {ColumnName, "Age"},
+ {ColumnName, "Name"},
};
UNIT_ASSERT_VALUES_EQUAL(CompleteTop(2, engine, "SELECT # FROM example.`/people`"), expected);
}
{
TVector<TCandidate> expected = {
- {ColumnName, "age"},
+ {ColumnName, "Age"},
{Keyword, "ALL"},
};
UNIT_ASSERT_VALUES_EQUAL(CompleteTop(2, engine, "SELECT a# FROM example.`/people`"), expected);
}
{
TVector<TCandidate> expected = {
- {ColumnName, "age"},
- {ColumnName, "name"},
+ {ColumnName, "Age"},
+ {ColumnName, "Name"},
};
UNIT_ASSERT_VALUES_EQUAL(CompleteTop(2, engine, "USE example; SELECT # FROM `/people`"), expected);
}
{
TVector<TCandidate> expected = {
- {ColumnName, "x.age"},
- {ColumnName, "x.name"},
+ {ColumnName, "x.Age"},
+ {ColumnName, "x.Name"},
};
UNIT_ASSERT_VALUES_EQUAL(CompleteTop(2, engine, "SELECT # FROM example.`/people` AS x"), expected);
}
@@ -1107,7 +1107,7 @@ Y_UNIT_TEST_SUITE(SqlCompleteTests) {
}
{
TVector<TCandidate> expected = {
- {ColumnName, "age"},
+ {ColumnName, "Age"},
};
UNIT_ASSERT_VALUES_EQUAL(CompleteTop(2, engine, "SELECT x.a# FROM example.`/people` AS x"), expected);
}