mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-18 13:42:02 +00:00
allow to ignore CREATE INDEX query for better SQL syntax compatibility
This commit is contained in:
parent
9aef39a788
commit
3bd9c57a8c
@ -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.
|
||||||
|
|
||||||
|
@ -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());
|
||||||
|
|
||||||
|
@ -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;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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;
|
||||||
|
Loading…
Reference in New Issue
Block a user