Add hints for SET query and HTTP request param settings

This commit is contained in:
Antonio Andelic 2021-12-19 11:10:36 +01:00
parent f9b585fcdf
commit 25f88356e4
3 changed files with 32 additions and 2 deletions

View File

@ -15,6 +15,7 @@ namespace ErrorCodes
extern const int READONLY; extern const int READONLY;
extern const int QUERY_IS_PROHIBITED; extern const int QUERY_IS_PROHIBITED;
extern const int SETTING_CONSTRAINT_VIOLATION; extern const int SETTING_CONSTRAINT_VIOLATION;
extern const int UNKNOWN_SETTING;
} }
@ -200,7 +201,23 @@ bool SettingsConstraints::checkImpl(const Settings & current_settings, SettingCh
}; };
if (reaction == THROW_ON_VIOLATION) if (reaction == THROW_ON_VIOLATION)
access_control->checkSettingNameIsAllowed(setting_name); {
try
{
access_control->checkSettingNameIsAllowed(setting_name);
}
catch (Exception & e)
{
if (e.code() == ErrorCodes::UNKNOWN_SETTING)
{
if (const auto hints = current_settings.getHints(change.name); !hints.empty())
{
e.addMessage(fmt::format("Maybe you meant {}", toString(hints)));
}
}
throw;
}
}
else if (!access_control->isSettingNameAllowed(setting_name)) else if (!access_control->isSettingNameAllowed(setting_name))
return false; return false;

View File

@ -117,6 +117,16 @@ void Settings::checkNoSettingNamesAtTopLevel(const Poco::Util::AbstractConfigura
} }
} }
std::vector<String> Settings::getAllRegisteredNames() const
{
std::vector<String> all_settings;
for (const auto & setting_field : all())
{
all_settings.push_back(setting_field.getName());
}
return all_settings;
}
IMPLEMENT_SETTINGS_TRAITS(FormatFactorySettingsTraits, FORMAT_FACTORY_SETTINGS) IMPLEMENT_SETTINGS_TRAITS(FormatFactorySettingsTraits, FORMAT_FACTORY_SETTINGS)
} }

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <Common/NamePrompter.h>
#include <Core/BaseSettings.h> #include <Core/BaseSettings.h>
#include <Core/SettingsEnums.h> #include <Core/SettingsEnums.h>
#include <Core/Defines.h> #include <Core/Defines.h>
@ -675,7 +676,7 @@ DECLARE_SETTINGS_TRAITS_ALLOW_CUSTOM_SETTINGS(SettingsTraits, LIST_OF_SETTINGS)
/** Settings of query execution. /** Settings of query execution.
* These settings go to users.xml. * These settings go to users.xml.
*/ */
struct Settings : public BaseSettings<SettingsTraits> struct Settings : public BaseSettings<SettingsTraits>, public IHints<2, Settings>
{ {
/// For initialization from empty initializer-list to be "value initialization", not "aggregate initialization" in C++14. /// For initialization from empty initializer-list to be "value initialization", not "aggregate initialization" in C++14.
/// http://en.cppreference.com/w/cpp/language/aggregate_initialization /// http://en.cppreference.com/w/cpp/language/aggregate_initialization
@ -699,6 +700,8 @@ struct Settings : public BaseSettings<SettingsTraits>
/// Check that there is no user-level settings at the top level in config. /// Check that there is no user-level settings at the top level in config.
/// This is a common source of mistake (user don't know where to write user-level setting). /// This is a common source of mistake (user don't know where to write user-level setting).
static void checkNoSettingNamesAtTopLevel(const Poco::Util::AbstractConfiguration & config, const String & config_path); static void checkNoSettingNamesAtTopLevel(const Poco::Util::AbstractConfiguration & config, const String & config_path);
std::vector<String> getAllRegisteredNames() const override;
}; };
/* /*