mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-23 10:10:50 +00:00
dbms: Server: updated unit test [#METR-14875]
This commit is contained in:
parent
09317ca19c
commit
b22532a35a
@ -5,7 +5,6 @@
|
|||||||
#include <DB/Interpreters/Settings.h>
|
#include <DB/Interpreters/Settings.h>
|
||||||
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <deque>
|
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <utility>
|
#include <utility>
|
||||||
#include <string>
|
#include <string>
|
||||||
@ -25,8 +24,6 @@ using TestResult = std::pair<bool, std::string>;
|
|||||||
|
|
||||||
void reorder(DB::IAST * ast)
|
void reorder(DB::IAST * ast)
|
||||||
{
|
{
|
||||||
using namespace DB;
|
|
||||||
|
|
||||||
auto & children = ast->children;
|
auto & children = ast->children;
|
||||||
if (children.empty())
|
if (children.empty())
|
||||||
return;
|
return;
|
||||||
@ -34,7 +31,7 @@ void reorder(DB::IAST * ast)
|
|||||||
for (auto & child : children)
|
for (auto & child : children)
|
||||||
reorder(&*child);
|
reorder(&*child);
|
||||||
|
|
||||||
std::sort(children.begin(), children.end(), [](const ASTPtr & lhs, const ASTPtr & rhs)
|
std::sort(children.begin(), children.end(), [](const DB::ASTPtr & lhs, const DB::ASTPtr & rhs)
|
||||||
{
|
{
|
||||||
return lhs->getTreeID() < rhs->getTreeID();
|
return lhs->getTreeID() < rhs->getTreeID();
|
||||||
});
|
});
|
||||||
@ -42,82 +39,47 @@ void reorder(DB::IAST * ast)
|
|||||||
|
|
||||||
bool equals(const DB::ASTPtr & lhs, const DB::ASTPtr & rhs)
|
bool equals(const DB::ASTPtr & lhs, const DB::ASTPtr & rhs)
|
||||||
{
|
{
|
||||||
using namespace DB;
|
DB::ASTPtr lhs_reordered = lhs->clone();
|
||||||
|
|
||||||
ASTPtr lhs_reordered = lhs->clone();
|
|
||||||
reorder(&*lhs_reordered);
|
reorder(&*lhs_reordered);
|
||||||
|
|
||||||
ASTPtr rhs_reordered = rhs->clone();
|
DB::ASTPtr rhs_reordered = rhs->clone();
|
||||||
reorder(&*rhs_reordered);
|
reorder(&*rhs_reordered);
|
||||||
|
|
||||||
std::deque<const IAST *> to_visit_left;
|
return lhs_reordered->getTreeID() == rhs_reordered->getTreeID();
|
||||||
std::deque<const IAST *> to_visit_right;
|
|
||||||
|
|
||||||
to_visit_left.push_back(&*lhs_reordered);
|
|
||||||
to_visit_right.push_back(&*rhs_reordered);
|
|
||||||
|
|
||||||
while (!to_visit_left.empty())
|
|
||||||
{
|
|
||||||
auto node_left = to_visit_left.back();
|
|
||||||
to_visit_left.pop_back();
|
|
||||||
|
|
||||||
if (to_visit_right.empty())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
auto node_right = to_visit_right.back();
|
|
||||||
to_visit_right.pop_back();
|
|
||||||
|
|
||||||
if (node_left->getTreeID() != node_right->getTreeID())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
if (node_left->children.size() != node_right->children.size())
|
|
||||||
return false;
|
|
||||||
|
|
||||||
for (auto & child : node_left->children)
|
|
||||||
to_visit_left.push_back(&*child);
|
|
||||||
for (auto & child : node_right->children)
|
|
||||||
to_visit_right.push_back(&*child);
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
bool parse(DB::ASTPtr & ast, const std::string & query)
|
bool parse(DB::ASTPtr & ast, const std::string & query)
|
||||||
{
|
{
|
||||||
using namespace DB;
|
DB::ParserSelectQuery parser;
|
||||||
|
|
||||||
ParserSelectQuery parser;
|
|
||||||
const char * pos = &query[0];
|
const char * pos = &query[0];
|
||||||
const char * end = &query[0] + query.size();
|
const char * end = &query[0] + query.size();
|
||||||
|
|
||||||
Expected expected = "";
|
DB::Expected expected = "";
|
||||||
return parser.parse(pos, end, ast, expected);
|
return parser.parse(pos, end, ast, expected);
|
||||||
}
|
}
|
||||||
|
|
||||||
TestResult check(const TestEntry & entry)
|
TestResult check(const TestEntry & entry)
|
||||||
{
|
{
|
||||||
using namespace DB;
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
ASTPtr ast_input;
|
DB::ASTPtr ast_input;
|
||||||
if (!parse(ast_input, entry.input))
|
if (!parse(ast_input, entry.input))
|
||||||
return TestResult(false, "parse error");
|
return TestResult(false, "parse error");
|
||||||
|
|
||||||
auto select_query = typeid_cast<ASTSelectQuery *>(&*ast_input);
|
auto select_query = typeid_cast<DB::ASTSelectQuery *>(&*ast_input);
|
||||||
|
|
||||||
Settings settings;
|
DB::Settings settings;
|
||||||
settings.optimize_min_equality_disjunction_chain_length = entry.limit;
|
settings.optimize_min_equality_disjunction_chain_length = entry.limit;
|
||||||
|
|
||||||
LogicalExpressionsOptimizer optimizer(select_query, settings);
|
DB::LogicalExpressionsOptimizer optimizer(select_query, settings);
|
||||||
optimizer.optimizeDisjunctiveEqualityChains();
|
optimizer.optimizeDisjunctiveEqualityChains();
|
||||||
|
|
||||||
ASTPtr ast_expected;
|
DB::ASTPtr ast_expected;
|
||||||
if (!parse(ast_expected, entry.expected_output))
|
if (!parse(ast_expected, entry.expected_output))
|
||||||
return TestResult(false, "parse error");
|
return TestResult(false, "parse error");
|
||||||
|
|
||||||
bool res = equals(ast_input, ast_expected);
|
bool res = equals(ast_input, ast_expected);
|
||||||
std::string output = queryToString(ast_input);
|
std::string output = DB::queryToString(ast_input);
|
||||||
|
|
||||||
return TestResult(res, output);
|
return TestResult(res, output);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user