diff options
author | vitya-smirnov <[email protected]> | 2025-06-23 10:49:42 +0300 |
---|---|---|
committer | vitya-smirnov <[email protected]> | 2025-06-23 11:12:19 +0300 |
commit | d0741457b40bb95bc60a34d74b59fdc40e20eb57 (patch) | |
tree | 7420ced126ca258c28bb64ea184192835ac3ae8e | |
parent | bb0b9384b505c7ce8664a29174f1a89f6e72710b (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
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); } |