mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-20 08:40:50 +00:00
Merge pull request #38519 from qoega/ast-fuzzer-where
This commit is contained in:
commit
7fa7e1d822
@ -236,6 +236,21 @@ ASTPtr QueryFuzzer::getRandomColumnLike()
|
||||
return new_ast;
|
||||
}
|
||||
|
||||
ASTPtr QueryFuzzer::getRandomExpressionList()
|
||||
{
|
||||
if (column_like.empty())
|
||||
{
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
ASTPtr new_ast = std::make_shared<ASTExpressionList>();
|
||||
for (size_t i = 0; i < fuzz_rand() % 5 + 1; ++i)
|
||||
{
|
||||
new_ast->children.push_back(getRandomColumnLike());
|
||||
}
|
||||
return new_ast;
|
||||
}
|
||||
|
||||
void QueryFuzzer::replaceWithColumnLike(ASTPtr & ast)
|
||||
{
|
||||
if (column_like.empty())
|
||||
@ -841,7 +856,52 @@ void QueryFuzzer::fuzz(ASTPtr & ast)
|
||||
else if (auto * select = typeid_cast<ASTSelectQuery *>(ast.get()))
|
||||
{
|
||||
fuzzColumnLikeExpressionList(select->select().get());
|
||||
fuzzColumnLikeExpressionList(select->groupBy().get());
|
||||
|
||||
if (select->groupBy().get())
|
||||
{
|
||||
if (fuzz_rand() % 50 == 0)
|
||||
{
|
||||
select->groupBy()->children.clear();
|
||||
select->setExpression(ASTSelectQuery::Expression::GROUP_BY, {});
|
||||
select->group_by_with_grouping_sets = false;
|
||||
select->group_by_with_rollup = false;
|
||||
select->group_by_with_cube = false;
|
||||
select->group_by_with_totals = true;
|
||||
}
|
||||
else if (fuzz_rand() % 100 == 0)
|
||||
{
|
||||
select->group_by_with_grouping_sets = !select->group_by_with_grouping_sets;
|
||||
}
|
||||
else if (fuzz_rand() % 100 == 0)
|
||||
{
|
||||
select->group_by_with_rollup = !select->group_by_with_rollup;
|
||||
}
|
||||
else if (fuzz_rand() % 100 == 0)
|
||||
{
|
||||
select->group_by_with_cube = !select->group_by_with_cube;
|
||||
}
|
||||
else if (fuzz_rand() % 100 == 0)
|
||||
{
|
||||
select->group_by_with_totals = !select->group_by_with_totals;
|
||||
}
|
||||
}
|
||||
else if (fuzz_rand() % 50 == 0)
|
||||
{
|
||||
select->setExpression(ASTSelectQuery::Expression::GROUP_BY, getRandomExpressionList());
|
||||
}
|
||||
|
||||
if (select->where().get())
|
||||
{
|
||||
if (fuzz_rand() % 50 == 0)
|
||||
{
|
||||
select->where()->children.clear();
|
||||
select->setExpression(ASTSelectQuery::Expression::WHERE, {});
|
||||
}
|
||||
}
|
||||
else if (fuzz_rand() % 50 == 0)
|
||||
{
|
||||
select->setExpression(ASTSelectQuery::Expression::WHERE, getRandomColumnLike());
|
||||
}
|
||||
fuzzOrderByList(select->orderBy().get());
|
||||
|
||||
fuzz(select->children);
|
||||
|
@ -8,6 +8,7 @@
|
||||
#include <pcg-random/pcg_random.hpp>
|
||||
|
||||
#include <Common/randomSeed.h>
|
||||
#include "Parsers/IAST_fwd.h"
|
||||
#include <Core/Field.h>
|
||||
#include <Parsers/IAST.h>
|
||||
|
||||
@ -72,6 +73,7 @@ struct QueryFuzzer
|
||||
Field getRandomField(int type);
|
||||
Field fuzzField(Field field);
|
||||
ASTPtr getRandomColumnLike();
|
||||
ASTPtr getRandomExpressionList();
|
||||
DataTypePtr fuzzDataType(DataTypePtr type);
|
||||
DataTypePtr getRandomType();
|
||||
ASTs getInsertQueriesForFuzzedTables(const String & full_query);
|
||||
|
Loading…
Reference in New Issue
Block a user