From fae9c33282e593151e14e0ca4df7b59eb213b3b0 Mon Sep 17 00:00:00 2001 From: alesapin Date: Fri, 20 Jul 2018 16:17:16 +0300 Subject: [PATCH] CLICKHOUSE-3791: Add system table collations --- dbms/src/Columns/Collator.cpp | 11 ++++++++ dbms/src/Columns/Collator.h | 3 +++ .../System/StorageSystemCollations.cpp | 13 ++++++++++ .../Storages/System/StorageSystemCollations.h | 26 +++++++++++++++++++ .../Storages/System/attachSystemTables.cpp | 2 ++ 5 files changed, 55 insertions(+) create mode 100644 dbms/src/Storages/System/StorageSystemCollations.cpp create mode 100644 dbms/src/Storages/System/StorageSystemCollations.h diff --git a/dbms/src/Columns/Collator.cpp b/dbms/src/Columns/Collator.cpp index b6cea96ed2f..a386de1c255 100644 --- a/dbms/src/Columns/Collator.cpp +++ b/dbms/src/Columns/Collator.cpp @@ -87,3 +87,14 @@ const std::string & Collator::getLocale() const { return locale; } + +std::vector Collator::getAvailableCollations() { + std::vector result; +#if USE_ICU + size_t available_locales_count = ucol_countAvailable(); + for (size_t i = 0; i < available_locales_count; ++i) { + result.push_back(ucol_getAvailable(i)); + } +#endif + return result; +} diff --git a/dbms/src/Columns/Collator.h b/dbms/src/Columns/Collator.h index 53341fb1aeb..0bafe6b1dba 100644 --- a/dbms/src/Columns/Collator.h +++ b/dbms/src/Columns/Collator.h @@ -1,6 +1,7 @@ #pragma once #include +#include #include struct UCollator; @@ -15,6 +16,8 @@ public: const std::string & getLocale() const; + static std::vector getAvailableCollations(); + private: std::string locale; UCollator * collator; diff --git a/dbms/src/Storages/System/StorageSystemCollations.cpp b/dbms/src/Storages/System/StorageSystemCollations.cpp new file mode 100644 index 00000000000..b75a2e70298 --- /dev/null +++ b/dbms/src/Storages/System/StorageSystemCollations.cpp @@ -0,0 +1,13 @@ +#include +#include + +namespace DB +{ +void StorageSystemCollations::fillData(MutableColumns & res_columns) const +{ + for (const auto & collation : Collator::getAvailableCollations()) + { + res_columns[0]->insert(collation); + } +} +} diff --git a/dbms/src/Storages/System/StorageSystemCollations.h b/dbms/src/Storages/System/StorageSystemCollations.h new file mode 100644 index 00000000000..a10b19bb954 --- /dev/null +++ b/dbms/src/Storages/System/StorageSystemCollations.h @@ -0,0 +1,26 @@ +#pragma once +#include +#include + +namespace DB +{ +class StorageSystemCollations : public ext::shared_ptr_helper, + public IStorageSystemWithStringColumns +{ +protected: + void fillData(MutableColumns & res_columns) const override; + +public: + using IStorageSystemWithStringColumns::IStorageSystemWithStringColumns; + + std::string getName() const override + { + return "SystemTableCollations"; + } + + static std::vector getColumnNames() + { + return {"name"}; + } +}; +} diff --git a/dbms/src/Storages/System/attachSystemTables.cpp b/dbms/src/Storages/System/attachSystemTables.cpp index ef7ed8d7da5..e29a26df4eb 100644 --- a/dbms/src/Storages/System/attachSystemTables.cpp +++ b/dbms/src/Storages/System/attachSystemTables.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include #include @@ -50,6 +51,7 @@ void attachSystemTablesLocal(IDatabase & system_database) system_database.attachTable("table_functions", StorageSystemTableFunctions::create("table_functions")); system_database.attachTable("aggregate_function_combinators", StorageSystemAggregateFunctionCombinators::create("aggregate_function_combinators")); system_database.attachTable("data_type_families", StorageSystemDataTypeFamilies::create("data_type_families")); + system_database.attachTable("collations", StorageSystemCollations::create("collations")); } void attachSystemTablesServer(IDatabase & system_database, bool has_zookeeper)