mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 16:42:05 +00:00
do not allow const and non-deterministic secondary indexes
This commit is contained in:
parent
ca1c793cac
commit
3a947ecddc
@ -94,15 +94,7 @@ IndexDescription IndexDescription::getIndexFromAST(const ASTPtr & definition_ast
|
||||
|
||||
auto syntax = TreeRewriter(context).analyze(expr_list, columns.getAllPhysical());
|
||||
result.expression = ExpressionAnalyzer(expr_list, syntax, context).getActions(true);
|
||||
Block block_without_columns = result.expression->getSampleBlock();
|
||||
|
||||
for (size_t i = 0; i < block_without_columns.columns(); ++i)
|
||||
{
|
||||
const auto & column = block_without_columns.getByPosition(i);
|
||||
result.column_names.emplace_back(column.name);
|
||||
result.data_types.emplace_back(column.type);
|
||||
result.sample_block.insert(ColumnWithTypeAndName(column.type->createColumn(), column.type, column.name));
|
||||
}
|
||||
result.sample_block = result.expression->getSampleBlock();
|
||||
|
||||
const auto & definition_arguments = index_definition->type->arguments;
|
||||
if (definition_arguments)
|
||||
|
@ -524,7 +524,6 @@ void MergeTreeData::checkProperties(
|
||||
|
||||
for (const auto & index : new_metadata.secondary_indices)
|
||||
{
|
||||
|
||||
MergeTreeIndexFactory::instance().validate(index, attach);
|
||||
|
||||
if (indices_names.find(index.name) != indices_names.end())
|
||||
|
@ -35,6 +35,7 @@ MergeTreeIndexPtr MergeTreeIndexFactory::get(
|
||||
{
|
||||
auto it = creators.find(index.type);
|
||||
if (it == creators.end())
|
||||
{
|
||||
throw Exception(ErrorCodes::INCORRECT_QUERY,
|
||||
"Unknown Index type '{}'. Available index types: {}", index.type,
|
||||
std::accumulate(creators.cbegin(), creators.cend(), std::string{},
|
||||
@ -46,6 +47,7 @@ MergeTreeIndexPtr MergeTreeIndexFactory::get(
|
||||
return left + ", " + right.first;
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
return it->second(index);
|
||||
}
|
||||
@ -61,8 +63,31 @@ MergeTreeIndices MergeTreeIndexFactory::getMany(const std::vector<IndexDescripti
|
||||
|
||||
void MergeTreeIndexFactory::validate(const IndexDescription & index, bool attach) const
|
||||
{
|
||||
/// Do not allow constant and non-deterministic expressions.
|
||||
/// Do not throw on attach for compatibility.
|
||||
if (!attach)
|
||||
{
|
||||
if (index.expression->hasArrayJoin())
|
||||
throw Exception(ErrorCodes::INCORRECT_QUERY, "Secondary index '{}' cannot contain array joins", index.name);
|
||||
|
||||
try
|
||||
{
|
||||
index.expression->assertDeterministic();
|
||||
}
|
||||
catch (Exception & e)
|
||||
{
|
||||
e.addMessage(fmt::format("for secondary index '{}'", index.name));
|
||||
throw;
|
||||
}
|
||||
|
||||
for (const auto & elem : index.sample_block)
|
||||
if (elem.column && (isColumnConst(*elem.column) || elem.column->isDummy()))
|
||||
throw Exception(ErrorCodes::INCORRECT_QUERY, "Secondary index '{}' cannot contain constants", index.name);
|
||||
}
|
||||
|
||||
auto it = validators.find(index.type);
|
||||
if (it == validators.end())
|
||||
{
|
||||
throw Exception(ErrorCodes::INCORRECT_QUERY,
|
||||
"Unknown Index type '{}'. Available index types: {}", index.type,
|
||||
std::accumulate(
|
||||
@ -77,6 +102,7 @@ void MergeTreeIndexFactory::validate(const IndexDescription & index, bool attach
|
||||
return left + ", " + right.first;
|
||||
})
|
||||
);
|
||||
}
|
||||
|
||||
it->second(index, attach);
|
||||
}
|
||||
|
25
tests/queries/0_stateless/02670_constant_skip_index.sql
Normal file
25
tests/queries/0_stateless/02670_constant_skip_index.sql
Normal file
@ -0,0 +1,25 @@
|
||||
|
||||
DROP TABLE IF EXISTS t_constant_index;
|
||||
|
||||
CREATE TABLE t_constant_index
|
||||
(
|
||||
id UInt64,
|
||||
INDEX t_constant_index 'foo' TYPE set(2) GRANULARITY 1
|
||||
) ENGINE = MergeTree
|
||||
ORDER BY id; -- { serverError INCORRECT_QUERY }
|
||||
|
||||
CREATE TABLE t_constant_index
|
||||
(
|
||||
id UInt64,
|
||||
INDEX t_constant_index id + rand() TYPE set(2) GRANULARITY 1
|
||||
) ENGINE = MergeTree
|
||||
ORDER BY id; -- { serverError BAD_ARGUMENTS }
|
||||
|
||||
CREATE TABLE t_constant_index
|
||||
(
|
||||
id UInt64,
|
||||
INDEX t_constant_index id * 2 TYPE set(2) GRANULARITY 1
|
||||
) ENGINE = MergeTree
|
||||
ORDER BY id;
|
||||
|
||||
DROP TABLE t_constant_index;
|
Loading…
Reference in New Issue
Block a user