diff --git a/src/Core/Settings.cpp b/src/Core/Settings.cpp index 2a8dd2acdc0..a72992d4af7 100644 --- a/src/Core/Settings.cpp +++ b/src/Core/Settings.cpp @@ -2,6 +2,7 @@ #include #include +#include #include #include #include @@ -56,40 +57,27 @@ void Settings::loadSettingsFromConfig(const String & path, const Poco::Util::Abs } } -void Settings::dumpToArrayColumns(IColumn * column_names_, IColumn * column_values_, bool changed_only) +void Settings::dumpToMapColumn(IColumn * column, bool changed_only) { /// Convert ptr and make simple check - auto * column_names = (column_names_) ? &typeid_cast(*column_names_) : nullptr; - auto * column_values = (column_values_) ? &typeid_cast(*column_values_) : nullptr; + auto * column_map = column ? &typeid_cast(*column) : nullptr; + if (!column_map) + return; - size_t count = 0; + auto & offsets = column_map->getNestedColumn().getOffsets(); + auto & tuple_column = column_map->getNestedData(); + auto & key_column = tuple_column.getColumn(0); + auto & value_column = tuple_column.getColumn(1); + size_t size = 0; for (const auto & setting : all(changed_only ? SKIP_UNCHANGED : SKIP_NONE)) { - if (column_names) - { - auto name = setting.getName(); - column_names->getData().insertData(name.data(), name.size()); - } - if (column_values) - column_values->getData().insert(setting.getValueString()); - ++count; - } - - if (column_names) - { - auto & offsets = column_names->getOffsets(); - offsets.push_back(offsets.back() + count); - } - - /// Nested columns case - bool the_same_offsets = column_names && column_values && column_names->getOffsetsPtr() == column_values->getOffsetsPtr(); - - if (column_values && !the_same_offsets) - { - auto & offsets = column_values->getOffsets(); - offsets.push_back(offsets.back() + count); + auto name = setting.getName(); + key_column.insertData(name.data(), name.size()); + value_column.insert(setting.getValueString()); + size++; } + offsets.push_back(offsets.back() + size); } void Settings::addProgramOptions(boost::program_options::options_description & options) diff --git a/src/Core/Settings.h b/src/Core/Settings.h index 00d4682332d..4453a74c713 100644 --- a/src/Core/Settings.h +++ b/src/Core/Settings.h @@ -523,7 +523,7 @@ struct Settings : public BaseSettings void loadSettingsFromConfig(const String & path, const Poco::Util::AbstractConfiguration & config); /// Dumps profile events to two columns of type Array(String) - void dumpToArrayColumns(IColumn * column_names, IColumn * column_values, bool changed_only = true); + void dumpToMapColumn(IColumn * column, bool changed_only = true); /// Adds program options to set the settings from a command line. /// (Don't forget to call notify() on the `variables_map` after parsing it!) diff --git a/src/Interpreters/InterpreterCreateQuery.cpp b/src/Interpreters/InterpreterCreateQuery.cpp index 9b087b3d2e5..5a553f89931 100644 --- a/src/Interpreters/InterpreterCreateQuery.cpp +++ b/src/Interpreters/InterpreterCreateQuery.cpp @@ -618,7 +618,8 @@ void InterpreterCreateQuery::validateTableStructure(const ASTCreateQuery & creat } } - if (!create.attach && !settings.allow_experimental_map_type) + // enable allow_experimental_map_type for system tables + if (create.database != "system" && !create.attach && !settings.allow_experimental_map_type) { for (const auto & name_and_type_pair : properties.columns.getAllPhysical()) { diff --git a/src/Interpreters/ProfileEventsExt.cpp b/src/Interpreters/ProfileEventsExt.cpp index bca845c4248..ec3131d39a3 100644 --- a/src/Interpreters/ProfileEventsExt.cpp +++ b/src/Interpreters/ProfileEventsExt.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -11,14 +12,18 @@ namespace ProfileEvents { /// Put implementation here to avoid extra linking dependencies for clickhouse_common_io -void dumpToArrayColumns(const Counters & counters, DB::IColumn * column_names_, DB::IColumn * column_values_, bool nonzero_only) +void dumpToMapColumn(const Counters & counters, DB::IColumn * column, bool nonzero_only) { - /// Convert ptr and make simple check - auto * column_names = (column_names_) ? &typeid_cast(*column_names_) : nullptr; - auto * column_values = (column_values_) ? &typeid_cast(*column_values_) : nullptr; + auto * column_map = column ? &typeid_cast(*column) : nullptr; + if (!column_map) + return; + + auto & offsets = column_map->getNestedColumn().getOffsets(); + auto & tuple_column = column_map->getNestedData(); + auto & key_column = tuple_column.getColumn(0); + auto & value_column = tuple_column.getColumn(1); size_t size = 0; - for (Event event = 0; event < Counters::num_counters; ++event) { UInt64 value = counters[event].load(std::memory_order_relaxed); @@ -26,34 +31,12 @@ void dumpToArrayColumns(const Counters & counters, DB::IColumn * column_names_, if (nonzero_only && 0 == value) continue; - ++size; - - if (column_names) - { - const char * desc = ProfileEvents::getName(event); - column_names->getData().insertData(desc, strlen(desc)); - } - - if (column_values) - column_values->getData().insert(value); - } - - if (column_names) - { - auto & offsets = column_names->getOffsets(); - offsets.push_back(offsets.back() + size); - } - - if (column_values) - { - /// Nested columns case - bool the_same_offsets = column_names && column_names->getOffsetsPtr().get() == column_values->getOffsetsPtr().get(); - if (!the_same_offsets) - { - auto & offsets = column_values->getOffsets(); - offsets.push_back(offsets.back() + size); - } + const char * desc = ProfileEvents::getName(event); + key_column.insertData(desc, strlen(desc)); + value_column.insert(value); + size++; } + offsets.push_back(offsets.back() + size); } } diff --git a/src/Interpreters/ProfileEventsExt.h b/src/Interpreters/ProfileEventsExt.h index 2ae9941b67f..7d513f0cd02 100644 --- a/src/Interpreters/ProfileEventsExt.h +++ b/src/Interpreters/ProfileEventsExt.h @@ -6,7 +6,7 @@ namespace ProfileEvents { -/// Dumps profile events to two columns Array(String) and Array(UInt64) -void dumpToArrayColumns(const Counters & counters, DB::IColumn * column_names, DB::IColumn * column_value, bool nonzero_only = true); +/// Dumps profile events to columns Map(String, UInt64) +void dumpToMapColumn(const Counters & counters, DB::IColumn * column, bool nonzero_only = true); } diff --git a/src/Interpreters/QueryLog.cpp b/src/Interpreters/QueryLog.cpp index 78c4072cd4c..5b62b73e841 100644 --- a/src/Interpreters/QueryLog.cpp +++ b/src/Interpreters/QueryLog.cpp @@ -3,6 +3,7 @@ #include #include #include +#include #include #include #include @@ -10,6 +11,7 @@ #include #include #include +#include #include #include #include @@ -19,6 +21,7 @@ #include #include #include +#include namespace DB @@ -35,67 +38,61 @@ Block QueryLogElement::createBlock() {"ExceptionWhileProcessing", static_cast(EXCEPTION_WHILE_PROCESSING)} }); - return - { - {std::move(query_status_datatype), "type"}, - {std::make_shared(), "event_date"}, - {std::make_shared(), "event_time"}, - {std::make_shared(6), "event_time_microseconds"}, - {std::make_shared(), "query_start_time"}, - {std::make_shared(6), "query_start_time_microseconds"}, - {std::make_shared(), "query_duration_ms"}, + return { + {std::move(query_status_datatype), "type"}, + {std::make_shared(), "event_date"}, + {std::make_shared(), "event_time"}, + {std::make_shared(6), "event_time_microseconds"}, + {std::make_shared(), "query_start_time"}, + {std::make_shared(6), "query_start_time_microseconds"}, + {std::make_shared(), "query_duration_ms"}, - {std::make_shared(), "read_rows"}, - {std::make_shared(), "read_bytes"}, - {std::make_shared(), "written_rows"}, - {std::make_shared(), "written_bytes"}, - {std::make_shared(), "result_rows"}, - {std::make_shared(), "result_bytes"}, - {std::make_shared(), "memory_usage"}, + {std::make_shared(), "read_rows"}, + {std::make_shared(), "read_bytes"}, + {std::make_shared(), "written_rows"}, + {std::make_shared(), "written_bytes"}, + {std::make_shared(), "result_rows"}, + {std::make_shared(), "result_bytes"}, + {std::make_shared(), "memory_usage"}, - {std::make_shared(), "current_database"}, - {std::make_shared(), "query"}, - {std::make_shared(), "normalized_query_hash"}, + {std::make_shared(), "current_database"}, + {std::make_shared(), "query"}, + {std::make_shared(), "normalized_query_hash"}, {std::make_shared(std::make_shared()), "query_kind"}, - {std::make_shared( - std::make_shared(std::make_shared())), "databases"}, - {std::make_shared( - std::make_shared(std::make_shared())), "tables"}, - {std::make_shared( - std::make_shared(std::make_shared())), "columns"}, - {std::make_shared(), "exception_code"}, - {std::make_shared(), "exception"}, - {std::make_shared(), "stack_trace"}, + {std::make_shared(std::make_shared(std::make_shared())), "databases"}, + {std::make_shared(std::make_shared(std::make_shared())), "tables"}, + {std::make_shared(std::make_shared(std::make_shared())), "columns"}, + {std::make_shared(), "exception_code"}, + {std::make_shared(), "exception"}, + {std::make_shared(), "stack_trace"}, - {std::make_shared(), "is_initial_query"}, - {std::make_shared(), "user"}, - {std::make_shared(), "query_id"}, - {DataTypeFactory::instance().get("IPv6"), "address"}, - {std::make_shared(), "port"}, - {std::make_shared(), "initial_user"}, - {std::make_shared(), "initial_query_id"}, - {DataTypeFactory::instance().get("IPv6"), "initial_address"}, - {std::make_shared(), "initial_port"}, - {std::make_shared(), "interface"}, - {std::make_shared(), "os_user"}, - {std::make_shared(), "client_hostname"}, - {std::make_shared(), "client_name"}, - {std::make_shared(), "client_revision"}, - {std::make_shared(), "client_version_major"}, - {std::make_shared(), "client_version_minor"}, - {std::make_shared(), "client_version_patch"}, - {std::make_shared(), "http_method"}, - {std::make_shared(), "http_user_agent"}, - {std::make_shared(), "forwarded_for"}, - {std::make_shared(), "quota_key"}, + {std::make_shared(), "is_initial_query"}, + {std::make_shared(), "user"}, + {std::make_shared(), "query_id"}, + {DataTypeFactory::instance().get("IPv6"), "address"}, + {std::make_shared(), "port"}, + {std::make_shared(), "initial_user"}, + {std::make_shared(), "initial_query_id"}, + {DataTypeFactory::instance().get("IPv6"), "initial_address"}, + {std::make_shared(), "initial_port"}, + {std::make_shared(), "interface"}, + {std::make_shared(), "os_user"}, + {std::make_shared(), "client_hostname"}, + {std::make_shared(), "client_name"}, + {std::make_shared(), "client_revision"}, + {std::make_shared(), "client_version_major"}, + {std::make_shared(), "client_version_minor"}, + {std::make_shared(), "client_version_patch"}, + {std::make_shared(), "http_method"}, + {std::make_shared(), "http_user_agent"}, + {std::make_shared(), "forwarded_for"}, + {std::make_shared(), "quota_key"}, - {std::make_shared(), "revision"}, + {std::make_shared(), "revision"}, {std::make_shared(std::make_shared()), "thread_ids"}, - {std::make_shared(std::make_shared()), "ProfileEvents.Names"}, - {std::make_shared(std::make_shared()), "ProfileEvents.Values"}, - {std::make_shared(std::make_shared()), "Settings.Names"}, - {std::make_shared(std::make_shared()), "Settings.Values"} + {std::make_shared(std::make_shared(), std::make_shared()), "ProfileEvents"}, + {std::make_shared(std::make_shared(), std::make_shared()), "Settings"}, }; } @@ -165,26 +162,22 @@ void QueryLogElement::appendToBlock(MutableColumns & columns) const if (profile_counters) { - auto * column_names = columns[i++].get(); - auto * column_values = columns[i++].get(); - ProfileEvents::dumpToArrayColumns(*profile_counters, column_names, column_values, true); + auto * column = columns[i++].get(); + ProfileEvents::dumpToMapColumn(*profile_counters, column, true); } else { columns[i++]->insertDefault(); - columns[i++]->insertDefault(); } if (query_settings) { - auto * column_names = columns[i++].get(); - auto * column_values = columns[i++].get(); - query_settings->dumpToArrayColumns(column_names, column_values, true); + auto * column = columns[i++].get(); + query_settings->dumpToMapColumn(column, true); } else { columns[i++]->insertDefault(); - columns[i++]->insertDefault(); } } diff --git a/src/Interpreters/QueryThreadLog.cpp b/src/Interpreters/QueryThreadLog.cpp index 5d325c05549..1f4441f6fd5 100644 --- a/src/Interpreters/QueryThreadLog.cpp +++ b/src/Interpreters/QueryThreadLog.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include #include #include @@ -66,8 +67,7 @@ Block QueryThreadLogElement::createBlock() {std::make_shared(), "revision"}, - {std::make_shared(std::make_shared()), "ProfileEvents.Names"}, - {std::make_shared(std::make_shared()), "ProfileEvents.Values"} + {std::make_shared(std::make_shared(), std::make_shared()), "ProfileEvents"}, }; } @@ -104,14 +104,12 @@ void QueryThreadLogElement::appendToBlock(MutableColumns & columns) const if (profile_counters) { - auto * column_names = columns[i++].get(); - auto * column_values = columns[i++].get(); - dumpToArrayColumns(*profile_counters, column_names, column_values, true); + auto * column = columns[i++].get(); + ProfileEvents::dumpToMapColumn(*profile_counters, column, true); } else { columns[i++]->insertDefault(); - columns[i++]->insertDefault(); } } diff --git a/src/Storages/System/StorageSystemProcesses.cpp b/src/Storages/System/StorageSystemProcesses.cpp index 178eedd9ad7..9b3136431c4 100644 --- a/src/Storages/System/StorageSystemProcesses.cpp +++ b/src/Storages/System/StorageSystemProcesses.cpp @@ -123,28 +123,24 @@ void StorageSystemProcesses::fillData(MutableColumns & res_columns, const Contex } { - IColumn * column_profile_events_names = res_columns[i++].get(); - IColumn * column_profile_events_values = res_columns[i++].get(); + IColumn * column = res_columns[i++].get(); if (process.profile_counters) - ProfileEvents::dumpToArrayColumns(*process.profile_counters, column_profile_events_names, column_profile_events_values, true); + ProfileEvents::dumpToMapColumn(*process.profile_counters, column, true); else { - column_profile_events_names->insertDefault(); - column_profile_events_values->insertDefault(); + column->insertDefault(); } } { - IColumn * column_settings_names = res_columns[i++].get(); - IColumn * column_settings_values = res_columns[i++].get(); + IColumn * column = res_columns[i++].get(); if (process.query_settings) - process.query_settings->dumpToArrayColumns(column_settings_names, column_settings_values, true); + process.query_settings->dumpToMapColumn(column, true); else { - column_settings_names->insertDefault(); - column_settings_values->insertDefault(); + column->insertDefault(); } } }