mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-24 16:42:05 +00:00
fix Set index check useless (#6651)
* fixed useless detection * fixed useless detection * fix * fix * fix
This commit is contained in:
parent
11effc8576
commit
2dbfabd08c
@ -405,25 +405,6 @@ bool MergeTreeIndexConditionSet::operatorFromAST(ASTPtr & node) const
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
static bool checkAtomName(const String & name)
|
|
||||||
{
|
|
||||||
static std::set<String> atoms = {
|
|
||||||
"notEquals",
|
|
||||||
"equals",
|
|
||||||
"less",
|
|
||||||
"greater",
|
|
||||||
"lessOrEquals",
|
|
||||||
"greaterOrEquals",
|
|
||||||
"in",
|
|
||||||
"notIn",
|
|
||||||
"like",
|
|
||||||
"startsWith",
|
|
||||||
"endsWith",
|
|
||||||
"multiSearchAny"
|
|
||||||
};
|
|
||||||
return atoms.find(name) != atoms.end();
|
|
||||||
}
|
|
||||||
|
|
||||||
bool MergeTreeIndexConditionSet::checkASTUseless(const ASTPtr &node, bool atomic) const
|
bool MergeTreeIndexConditionSet::checkASTUseless(const ASTPtr &node, bool atomic) const
|
||||||
{
|
{
|
||||||
if (const auto * func = node->as<ASTFunction>())
|
if (const auto * func = node->as<ASTFunction>())
|
||||||
@ -439,16 +420,14 @@ bool MergeTreeIndexConditionSet::checkASTUseless(const ASTPtr &node, bool atomic
|
|||||||
return checkASTUseless(args[0], atomic) || checkASTUseless(args[1], atomic);
|
return checkASTUseless(args[0], atomic) || checkASTUseless(args[1], atomic);
|
||||||
else if (func->name == "not")
|
else if (func->name == "not")
|
||||||
return checkASTUseless(args[0], atomic);
|
return checkASTUseless(args[0], atomic);
|
||||||
else if (!atomic && checkAtomName(func->name))
|
|
||||||
return checkASTUseless(node, true);
|
|
||||||
else
|
else
|
||||||
return std::any_of(args.begin(), args.end(),
|
return std::any_of(args.begin(), args.end(),
|
||||||
[this, &atomic](const auto & arg) { return checkASTUseless(arg, atomic); });
|
[this](const auto & arg) { return checkASTUseless(arg, true); });
|
||||||
}
|
}
|
||||||
else if (const auto * literal = node->as<ASTLiteral>())
|
else if (const auto * literal = node->as<ASTLiteral>())
|
||||||
return !atomic && literal->value.get<bool>();
|
return !atomic && literal->value.get<bool>();
|
||||||
else if (const auto * identifier = node->as<ASTIdentifier>())
|
else if (const auto * identifier = node->as<ASTIdentifier>())
|
||||||
return key_columns.find(identifier->getColumnName()) == key_columns.end();
|
return key_columns.find(identifier->getColumnName()) == std::end(key_columns);
|
||||||
else
|
else
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -0,0 +1 @@
|
|||||||
|
1
|
24
dbms/tests/queries/0_stateless/00997_set_index_array.sql
Normal file
24
dbms/tests/queries/0_stateless/00997_set_index_array.sql
Normal file
@ -0,0 +1,24 @@
|
|||||||
|
SET allow_experimental_data_skipping_indices = 1;
|
||||||
|
|
||||||
|
DROP TABLE IF EXISTS test.set_array;
|
||||||
|
|
||||||
|
CREATE TABLE test.set_array
|
||||||
|
(
|
||||||
|
primary_key String,
|
||||||
|
index_array Array(UInt64),
|
||||||
|
INDEX additional_index_array (index_array) TYPE set(10000) GRANULARITY 1
|
||||||
|
) ENGINE = MergeTree()
|
||||||
|
ORDER BY (primary_key);
|
||||||
|
|
||||||
|
INSERT INTO test.set_array
|
||||||
|
select
|
||||||
|
toString(intDiv(number, 1000000)) as primary_key,
|
||||||
|
array(number) as index_array
|
||||||
|
from system.numbers
|
||||||
|
limit 10000000;
|
||||||
|
|
||||||
|
SET max_rows_to_read = 8192;
|
||||||
|
|
||||||
|
select count() from test.set_array where has(index_array, 333);
|
||||||
|
|
||||||
|
DROP TABLE test.set_array;
|
Loading…
Reference in New Issue
Block a user