diff --git a/dbms/src/Dictionaries/DictionaryStructure.cpp b/dbms/src/Dictionaries/DictionaryStructure.cpp index f68928c2c6ed75687e1f01645dbe21aebbcf69a1..65d2fb6c9d7c63ced5b7ff78d4089c84adb7fdb0 100644 --- a/dbms/src/Dictionaries/DictionaryStructure.cpp +++ b/dbms/src/Dictionaries/DictionaryStructure.cpp @@ -1,6 +1,7 @@ #include #include +#include namespace DB { @@ -231,6 +232,20 @@ std::size_t DictionaryStructure::getKeySize() const } +static void CheckAttributeKeys(const Poco::Util::AbstractConfiguration::Keys & keys) +{ + static const std::unordered_set valid_keys = + { "name", "type", "expression", "null_value", "hierarchical", "injective" }; + + for (const auto & key : keys) + { + if (valid_keys.find(key) == valid_keys.end()) + throw Exception{ + "Unknown key '" + key + "' inside attribute section", + ErrorCodes::BAD_ARGUMENTS}; + } +} + std::vector DictionaryStructure::getAttributes( const Poco::Util::AbstractConfiguration & config, const std::string & config_prefix, const bool hierarchy_allowed, const bool allow_null_values) @@ -247,6 +262,10 @@ std::vector DictionaryStructure::getAttributes( continue; const auto prefix = config_prefix + '.' + key + '.'; + Poco::Util::AbstractConfiguration::Keys attribute_keys; + config.keys(config_prefix + '.' + key, attribute_keys); + + CheckAttributeKeys(attribute_keys); const auto name = config.getString(prefix + "name"); const auto type_string = config.getString(prefix + "type");