Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix ambiguity in parsing of settings profiles. #15982

Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
37 changes: 26 additions & 11 deletions src/Parsers/ParserSettingsProfileElement.cpp
Expand Up @@ -6,6 +6,7 @@
#include <Parsers/ASTLiteral.h>
#include <Parsers/ASTIdentifier.h>
#include <Parsers/parseIdentifierOrStringLiteral.h>
#include <boost/algorithm/string/predicate.hpp>


namespace DB
Expand All @@ -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;
}


Expand Down Expand Up @@ -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);
Expand All @@ -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>();
Expand Down
Expand Up @@ -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'] []
Expand Down
15 changes: 15 additions & 0 deletions tests/queries/0_stateless/01294_create_settings_profile.sql
Expand Up @@ -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;;
Expand Down