allow to ignore CREATE INDEX query for better SQL syntax compatibility

This commit is contained in:
Yatsishin Ilya 2023-07-12 09:29:36 +00:00
parent 9aef39a788
commit 3bd9c57a8c
4 changed files with 64 additions and 24 deletions

View File

@ -774,6 +774,7 @@ class IColumn;
M(Bool, keeper_map_strict_mode, false, "Enforce additional checks during operations on KeeperMap. E.g. throw an exception on an insert for already existing key", 0) \ M(Bool, keeper_map_strict_mode, false, "Enforce additional checks during operations on KeeperMap. E.g. throw an exception on an insert for already existing key", 0) \
M(UInt64, extract_kvp_max_pairs_per_row, 1000, "Max number pairs that can be produced by extractKeyValuePairs function. Used to safeguard against consuming too much memory.", 0) \ M(UInt64, extract_kvp_max_pairs_per_row, 1000, "Max number pairs that can be produced by extractKeyValuePairs function. Used to safeguard against consuming too much memory.", 0) \
M(Timezone, session_timezone, "", "The default timezone for current session or query. The server default timezone if empty.", 0) \ M(Timezone, session_timezone, "", "The default timezone for current session or query. The server default timezone if empty.", 0) \
M(Bool, allow_create_index_without_type, false, "Allow CREATE INDEX query without TYPE. Query will be ignored. Made for SQL compatibility tests.", 0)\
// End of COMMON_SETTINGS // End of COMMON_SETTINGS
// Please add settings related to formats into the FORMAT_FACTORY_SETTINGS and move obsolete settings to OBSOLETE_SETTINGS. // Please add settings related to formats into the FORMAT_FACTORY_SETTINGS and move obsolete settings to OBSOLETE_SETTINGS.

View File

@ -15,6 +15,8 @@ namespace DB
namespace ErrorCodes namespace ErrorCodes
{ {
extern const int TABLE_IS_READ_ONLY; extern const int TABLE_IS_READ_ONLY;
extern const int LOGICAL_ERROR;
extern const int INCORRECT_QUERY;
} }
@ -23,6 +25,21 @@ BlockIO InterpreterCreateIndexQuery::execute()
auto current_context = getContext(); auto current_context = getContext();
const auto & create_index = query_ptr->as<ASTCreateIndexQuery &>(); const auto & create_index = query_ptr->as<ASTCreateIndexQuery &>();
// Noop if allow_create_index_without_type = true. throw otherwise
if (!create_index.index_decl->as<ASTIndexDeclaration>()->type)
{
if (!current_context->getSettingsRef().allow_create_index_without_type)
{
throw Exception(ErrorCodes::INCORRECT_QUERY, "CREATE INDEX without TYPE is forbidden."
" SET allow_create_index_without_type=1 to ignore this statements.");
}
else
{
// Nothing to do
return {};
}
}
AccessRightsElements required_access; AccessRightsElements required_access;
required_access.emplace_back(AccessType::ALTER_ADD_INDEX, create_index.getDatabase(), create_index.getTable()); required_access.emplace_back(AccessType::ALTER_ADD_INDEX, create_index.getDatabase(), create_index.getTable());

View File

@ -13,8 +13,8 @@ ASTPtr ASTIndexDeclaration::clone() const
auto res = std::make_shared<ASTIndexDeclaration>(); auto res = std::make_shared<ASTIndexDeclaration>();
res->name = name; res->name = name;
res->granularity = granularity; if (granularity)
res->granularity = granularity;
if (expr) if (expr)
res->set(res->expr, expr->clone()); res->set(res->expr, expr->clone());
if (type) if (type)
@ -25,23 +25,32 @@ ASTPtr ASTIndexDeclaration::clone() const
void ASTIndexDeclaration::formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const void ASTIndexDeclaration::formatImpl(const FormatSettings & s, FormatState & state, FormatStateStacked frame) const
{ {
if (part_of_create_index_query) if (expr)
{ {
s.ostr << "("; if (part_of_create_index_query)
expr->formatImpl(s, state, frame); {
s.ostr << ")"; s.ostr << "(";
} expr->formatImpl(s, state, frame);
else s.ostr << ")";
{ }
s.ostr << backQuoteIfNeed(name); else
s.ostr << " "; {
expr->formatImpl(s, state, frame); s.ostr << backQuoteIfNeed(name);
s.ostr << " ";
expr->formatImpl(s, state, frame);
}
} }
s.ostr << (s.hilite ? hilite_keyword : "") << " TYPE " << (s.hilite ? hilite_none : ""); if (type)
type->formatImpl(s, state, frame); {
s.ostr << (s.hilite ? hilite_keyword : "") << " GRANULARITY " << (s.hilite ? hilite_none : ""); s.ostr << (s.hilite ? hilite_keyword : "") << " TYPE " << (s.hilite ? hilite_none : "");
s.ostr << granularity; type->formatImpl(s, state, frame);
}
if (granularity)
{
s.ostr << (s.hilite ? hilite_keyword : "") << " GRANULARITY " << (s.hilite ? hilite_none : "");
s.ostr << granularity;
}
} }
} }

View File

@ -17,24 +17,36 @@ bool ParserCreateIndexDeclaration::parseImpl(Pos & pos, ASTPtr & node, Expected
{ {
ParserKeyword s_type("TYPE"); ParserKeyword s_type("TYPE");
ParserKeyword s_granularity("GRANULARITY"); ParserKeyword s_granularity("GRANULARITY");
ParserToken open(TokenType::OpeningRoundBracket);
ParserToken close(TokenType::ClosingRoundBracket);
ParserOrderByExpressionList order_list;
ParserDataType data_type_p; ParserDataType data_type_p;
ParserExpression expression_p; ParserExpression expression_p;
ParserUnsignedInteger granularity_p; ParserUnsignedInteger granularity_p;
ASTPtr expr; ASTPtr expr;
ASTPtr order;
ASTPtr type; ASTPtr type;
ASTPtr granularity; ASTPtr granularity;
if (open.ignore(pos, expected))
{
if (!order_list.parse(pos, order, expected))
return false;
if (!close.ignore(pos, expected))
return false;
}
/// Skip name parser for SQL-standard CREATE INDEX /// Skip name parser for SQL-standard CREATE INDEX
if (!expression_p.parse(pos, expr, expected)) else if (!expression_p.parse(pos, expr, expected))
return false; return false;
if (!s_type.ignore(pos, expected))
return false;
if (!data_type_p.parse(pos, type, expected)) if (s_type.ignore(pos, expected))
return false; {
if (!data_type_p.parse(pos, type, expected))
return false;
}
if (s_granularity.ignore(pos, expected)) if (s_granularity.ignore(pos, expected))
{ {
@ -45,13 +57,14 @@ bool ParserCreateIndexDeclaration::parseImpl(Pos & pos, ASTPtr & node, Expected
auto index = std::make_shared<ASTIndexDeclaration>(); auto index = std::make_shared<ASTIndexDeclaration>();
index->part_of_create_index_query = true; index->part_of_create_index_query = true;
index->set(index->expr, expr); index->set(index->expr, expr);
index->set(index->type, type); if (type)
index->set(index->type, type);
if (granularity) if (granularity)
index->granularity = granularity->as<ASTLiteral &>().value.safeGet<UInt64>(); index->granularity = granularity->as<ASTLiteral &>().value.safeGet<UInt64>();
else else
{ {
if (index->type->name == "annoy") if (index->type && index->type->name == "annoy")
index->granularity = ASTIndexDeclaration::DEFAULT_ANNOY_INDEX_GRANULARITY; index->granularity = ASTIndexDeclaration::DEFAULT_ANNOY_INDEX_GRANULARITY;
else else
index->granularity = ASTIndexDeclaration::DEFAULT_INDEX_GRANULARITY; index->granularity = ASTIndexDeclaration::DEFAULT_INDEX_GRANULARITY;