提交 2f13fcb4 编写于 作者: V Vitaly Baranov

Fix ambiguity in parsing of settings profiles.

上级 6a58bb5c
......@@ -6,6 +6,7 @@
#include <Parsers/ASTLiteral.h>
#include <Parsers/ASTIdentifier.h>
#include <Parsers/parseIdentifierOrStringLiteral.h>
#include <boost/algorithm/string/predicate.hpp>
namespace DB
......@@ -14,8 +15,16 @@ namespace
{
bool parseProfileKeyword(IParserBase::Pos & pos, Expected & expected, bool use_inherit_keyword)
{
return ParserKeyword{"PROFILE"}.ignore(pos, expected) ||
(use_inherit_keyword && ParserKeyword{"INHERIT"}.ignore(pos, expected));
if (ParserKeyword{"PROFILE"}.ignore(pos, expected))
return true;
if (use_inherit_keyword && ParserKeyword{"INHERIT"}.ignore(pos, expected))
{
ParserKeyword{"PROFILE"}.ignore(pos, expected);
return true;
}
return false;
}
......@@ -137,6 +146,15 @@ namespace
if (!has_value_or_constraint)
return false;
if (boost::iequals(res_setting_name, "PROFILE") && res_value.isNull() && res_min_value.isNull() && res_max_value.isNull()
&& res_readonly)
{
/// Ambiguity: "profile readonly" can be treated either as a profile named "readonly" or
/// as a setting named 'profile' with the readonly constraint.
/// So we've decided to treat it as a profile named "readonly".
return false;
}
setting_name = std::move(res_setting_name);
value = std::move(res_value);
min_value = std::move(res_min_value);
......@@ -163,15 +181,12 @@ namespace
Field max_value;
std::optional<bool> readonly;
if (parseSettingNameWithValueOrConstraints(pos, expected, setting_name, value, min_value, max_value, readonly))
{
}
else if (parseProfileKeyword(pos, expected, use_inherit_keyword) || previous_element_was_parent_profile)
{
if (!parseProfileNameOrID(pos, expected, id_mode, parent_profile))
return false;
}
else
bool ok = parseSettingNameWithValueOrConstraints(pos, expected, setting_name, value, min_value, max_value, readonly);
if (!ok && (parseProfileKeyword(pos, expected, use_inherit_keyword) || previous_element_was_parent_profile))
ok = parseProfileNameOrID(pos, expected, id_mode, parent_profile);
if (!ok)
return false;
result = std::make_shared<ASTSettingsProfileElement>();
......
......@@ -41,6 +41,13 @@ CREATE SETTINGS PROFILE s1_01294 SETTINGS max_memory_usage = 6000000
CREATE SETTINGS PROFILE s2_01294 SETTINGS max_memory_usage = 6000000 TO r1_01294
CREATE SETTINGS PROFILE s3_01294 SETTINGS max_memory_usage = 6000000 TO r1_01294
CREATE SETTINGS PROFILE s4_01294 TO r1_01294
-- readonly ambiguity
CREATE SETTINGS PROFILE s1_01294 SETTINGS readonly = 1
CREATE SETTINGS PROFILE s2_01294 SETTINGS readonly READONLY
CREATE SETTINGS PROFILE s3_01294 SETTINGS INHERIT readonly
CREATE SETTINGS PROFILE s4_01294 SETTINGS INHERIT readonly, INHERIT readonly
CREATE SETTINGS PROFILE s5_01294 SETTINGS INHERIT readonly, readonly = 1
CREATE SETTINGS PROFILE s6_01294 SETTINGS INHERIT readonly, readonly READONLY
-- system.settings_profiles
s1_01294 local directory 0 0 [] []
s2_01294 local directory 1 0 ['r1_01294'] []
......
......@@ -87,6 +87,21 @@ ALTER PROFILE s2_01294, s3_01294, s4_01294 TO r1_01294;
SHOW CREATE PROFILE s1_01294, s2_01294, s3_01294, s4_01294;
DROP PROFILE s1_01294, s2_01294, s3_01294, s4_01294;
SELECT '-- readonly ambiguity';
CREATE PROFILE s1_01294 SETTINGS readonly=1;
CREATE PROFILE s2_01294 SETTINGS readonly readonly;
CREATE PROFILE s3_01294 SETTINGS profile readonly;
CREATE PROFILE s4_01294 SETTINGS profile readonly, readonly;
CREATE PROFILE s5_01294 SETTINGS profile readonly, readonly=1;
CREATE PROFILE s6_01294 SETTINGS profile readonly, readonly readonly;
SHOW CREATE PROFILE s1_01294;
SHOW CREATE PROFILE s2_01294;
SHOW CREATE PROFILE s3_01294;
SHOW CREATE PROFILE s4_01294;
SHOW CREATE PROFILE s5_01294;
SHOW CREATE PROFILE s6_01294;
DROP PROFILE s1_01294, s2_01294, s3_01294, s4_01294, s5_01294, s6_01294;
SELECT '-- system.settings_profiles';
CREATE PROFILE s1_01294;
CREATE PROFILE s2_01294 SETTINGS readonly=0 TO r1_01294;;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册