Fixing incompatibilities [#METR-2944].

This commit is contained in:
Alexey Milovidov 2016-07-23 05:25:09 +03:00
parent 130ec8b58b
commit dc665c67c5
11 changed files with 137 additions and 103 deletions

View File

@ -494,8 +494,6 @@ NamesAndTypesList::iterator ExpressionAnalyzer::findColumn(const String & name,
/// Например, при ignore_levels=1 ast не может быть занесен в словарь, но его дети могут.
void ExpressionAnalyzer::addASTAliases(ASTPtr & ast, int ignore_levels)
{
ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(ast.get());
/// Обход снизу-вверх. Не опускаемся в подзапросы.
for (auto & child : ast->children)
{
@ -503,10 +501,12 @@ void ExpressionAnalyzer::addASTAliases(ASTPtr & ast, int ignore_levels)
/// Алиасы верхнего уровня в секции ARRAY JOIN имеют особый смысл, их добавлять не будем
/// (пропустим сам expression list и его детей).
if (select && child == select->array_join_expression_list())
new_ignore_levels = 2;
if (typeid_cast<ASTArrayJoin *>(ast.get()))
new_ignore_levels = 3;
if (!typeid_cast<ASTSelectQuery *>(child.get()))
/// Don't descent into UNION ALL, table functions and subqueries.
if (!typeid_cast<ASTTableExpression *>(child.get())
&& !typeid_cast<ASTSelectQuery *>(child.get()))
addASTAliases(child, new_ignore_levels);
}
@ -531,7 +531,9 @@ StoragePtr ExpressionAnalyzer::getTable()
auto select_database = select->database();
auto select_table = select->table();
if (select_table && !typeid_cast<const ASTSelectQuery *>(select_table.get()) && !typeid_cast<const ASTFunction *>(select_table.get()))
if (select_table
&& !typeid_cast<const ASTSelectQuery *>(select_table.get())
&& !typeid_cast<const ASTFunction *>(select_table.get()))
{
String database = select_database
? typeid_cast<const ASTIdentifier &>(*select_database).name
@ -661,10 +663,13 @@ void ExpressionAnalyzer::normalizeTreeImpl(
{
if (node->table_expression)
{
if (ASTIdentifier * right = typeid_cast<ASTIdentifier *>(
static_cast<ASTTableExpression &>(*node->table_expression).database_and_table_name.get()))
auto & database_and_table_name = static_cast<ASTTableExpression &>(*node->table_expression).database_and_table_name;
if (database_and_table_name)
{
right->kind = ASTIdentifier::Table;
if (ASTIdentifier * right = typeid_cast<ASTIdentifier *>(database_and_table_name.get()))
{
right->kind = ASTIdentifier::Table;
}
}
}
}
@ -774,7 +779,7 @@ void ExpressionAnalyzer::executeScalarSubqueries()
for (auto & child : ast->children)
{
/// Не опускаемся в FROM, JOIN, UNION.
if (typeid_cast<const ASTTablesInSelectQuery *>(child.get())
if (!typeid_cast<const ASTTablesInSelectQuery *>(child.get())
&& child.get() != select_query->next_union_all.get())
{
executeScalarSubqueriesImpl(child);
@ -879,27 +884,34 @@ void ExpressionAnalyzer::executeScalarSubqueriesImpl(ASTPtr & ast)
}
else
{
/** Не опускаемся в подзапросы в аргументах IN.
* Но если аргумент - не подзапрос, то глубже внутри него могут быть подзапросы, и в них надо опускаться.
/** Don't descend into subqueries in FROM section.
*/
ASTFunction * func = typeid_cast<ASTFunction *>(ast.get());
ASTTablesInSelectQuery * tables = typeid_cast<ASTTablesInSelectQuery *>(ast.get());
if (func && func->kind == ASTFunction::FUNCTION
&& functionIsInOrGlobalInOperator(func->name))
if (!tables)
{
for (auto & child : ast->children)
/** Don't descend into subqueries in arguments of IN operator.
* But if an argument is not subquery, than deeper may be scalar subqueries and we need to descend in them.
*/
ASTFunction * func = typeid_cast<ASTFunction *>(ast.get());
if (func && func->kind == ASTFunction::FUNCTION
&& functionIsInOrGlobalInOperator(func->name))
{
if (child != func->arguments)
executeScalarSubqueriesImpl(child);
else
for (size_t i = 0, size = func->arguments->children.size(); i < size; ++i)
if (i != 1 || !typeid_cast<ASTSubquery *>(func->arguments->children[i].get()))
executeScalarSubqueriesImpl(func->arguments->children[i]);
for (auto & child : ast->children)
{
if (child != func->arguments)
executeScalarSubqueriesImpl(child);
else
for (size_t i = 0, size = func->arguments->children.size(); i < size; ++i)
if (i != 1 || !typeid_cast<ASTSubquery *>(func->arguments->children[i].get()))
executeScalarSubqueriesImpl(func->arguments->children[i]);
}
}
else
for (auto & child : ast->children)
executeScalarSubqueriesImpl(child);
}
else
for (auto & child : ast->children)
executeScalarSubqueriesImpl(child);
}
}
@ -1507,22 +1519,13 @@ void ExpressionAnalyzer::getArrayJoinedColumns()
throw Exception("No alias for non-trivial value in ARRAY JOIN: " + nested_table_name, ErrorCodes::ALIAS_REQUIRED);
if (array_join_alias_to_name.count(nested_table_alias) || aliases.count(nested_table_alias))
throw Exception("Duplicate alias " + nested_table_alias, ErrorCodes::MULTIPLE_EXPRESSIONS_FOR_ALIAS);
throw Exception("Duplicate alias in ARRAY JOIN: " + nested_table_alias, ErrorCodes::MULTIPLE_EXPRESSIONS_FOR_ALIAS);
array_join_alias_to_name[nested_table_alias] = nested_table_name;
array_join_name_to_alias[nested_table_name] = nested_table_alias;
}
ASTs & query_asts = select_query->children;
for (const auto & ast : query_asts)
{
/// Не опускаемся в подзапросы и UNION.
if (typeid_cast<const ASTSelectQuery *>(ast.get()))
continue;
if (ast != select_query->array_join_expression_list())
getArrayJoinedColumnsImpl(ast);
}
getArrayJoinedColumnsImpl(ast);
/// Если результат ARRAY JOIN не используется, придется все равно по-ARRAY-JOIN-ить какой-нибудь столбец,
/// чтобы получить правильное количество строк.
@ -1562,6 +1565,9 @@ void ExpressionAnalyzer::getArrayJoinedColumns()
/// Заполняет array_join_result_to_source: по каким столбцам-массивам размножить, и как их после этого назвать.
void ExpressionAnalyzer::getArrayJoinedColumnsImpl(ASTPtr ast)
{
if (typeid_cast<ASTTablesInSelectQuery *>(ast.get()))
return;
if (ASTIdentifier * node = typeid_cast<ASTIdentifier *>(ast.get()))
{
if (node->kind == ASTIdentifier::Column)
@ -1595,7 +1601,7 @@ void ExpressionAnalyzer::getArrayJoinedColumnsImpl(ASTPtr ast)
else
{
for (auto & child : ast->children)
if (!typeid_cast<const ASTSelectQuery *>(child.get()))
if (!typeid_cast<const ASTSubquery *>(child.get()))
getArrayJoinedColumnsImpl(child);
}
}
@ -1930,7 +1936,7 @@ void ExpressionAnalyzer::getAggregates(const ASTPtr & ast, ExpressionActionsPtr
else
{
for (const auto & child : ast->children)
if (!typeid_cast<const ASTSubquery *>(child.get()) && !typeid_cast<const ASTSelectQuery *>(child.get()))
if (!typeid_cast<const ASTSubquery *>(child.get()))
getAggregates(child, actions);
}
}
@ -1945,7 +1951,7 @@ void ExpressionAnalyzer::assertNoAggregates(const ASTPtr & ast, const char * des
+ " is found " + String(description) + " in query", ErrorCodes::ILLEGAL_AGGREGATION);
for (const auto & child : ast->children)
if (!typeid_cast<const ASTSubquery *>(child.get()) && !typeid_cast<const ASTSelectQuery *>(child.get()))
if (!typeid_cast<const ASTSubquery *>(child.get()))
assertNoAggregates(child, description);
}
@ -1971,13 +1977,13 @@ void ExpressionAnalyzer::initChain(ExpressionActionsChain & chain, const NamesAn
}
}
/// "Большой" ARRAY JOIN.
/// "Big" ARRAY JOIN.
void ExpressionAnalyzer::addMultipleArrayJoinAction(ExpressionActionsPtr & actions) const
{
NameSet result_columns;
for (const auto & result_source : array_join_result_to_source)
{
/// Дать столбцам новые имена, если надо.
/// Assign new names to columns, if needed.
if (result_source.first != result_source.second)
actions->add(ExpressionAction::copyColumn(result_source.second, result_source.first));
@ -2033,7 +2039,7 @@ bool ExpressionAnalyzer::appendJoin(ExpressionActionsChain & chain, bool only_ty
getRootActions(join_params.using_expression_list, only_types, false, step.actions);
/// Не поддерживается два JOIN-а с одинаковым подзапросом, но разными USING-ами.
String join_id = join_element.getColumnName();
String join_id = join_element.getTreeID();
SubqueryForSet & subquery_for_set = subqueries_for_sets[join_id];
@ -2487,6 +2493,7 @@ void ExpressionAnalyzer::collectJoinedColumns(NameSet & joined_columns, NamesAnd
std::cerr << std::endl;*/
}
Names ExpressionAnalyzer::getRequiredColumns()
{
if (!unknown_required_columns.empty())
@ -2499,6 +2506,7 @@ Names ExpressionAnalyzer::getRequiredColumns()
return res;
}
void ExpressionAnalyzer::getRequiredColumnsImpl(ASTPtr ast,
NameSet & required_columns, NameSet & ignored_names,
const NameSet & available_joined_columns, NameSet & required_joined_columns)
@ -2571,16 +2579,14 @@ void ExpressionAnalyzer::getRequiredColumnsImpl(ASTPtr ast,
return;
}
ASTSelectQuery * select = typeid_cast<ASTSelectQuery *>(ast.get());
/// Рекурсивный обход выражения.
for (auto & child : ast->children)
{
/** Не пойдем в секцию ARRAY JOIN, потому что там нужно смотреть на имена не-ARRAY-JOIN-енных столбцов.
* Туда collectUsedColumns отправит нас отдельно.
*/
if (!typeid_cast<ASTSubquery *>(child.get()) && !typeid_cast<ASTSelectQuery *>(child.get()) &&
!(select && child == select->array_join_expression_list()))
if (!typeid_cast<ASTSelectQuery *>(child.get())
&& !typeid_cast<ASTArrayJoin *>(child.get()))
getRequiredColumnsImpl(child, required_columns, ignored_names, available_joined_columns, required_joined_columns);
}
}

View File

@ -417,7 +417,7 @@ static const ASTTablesInSelectQueryElement * getFirstTableJoin(const ASTSelectQu
ASTPtr ASTSelectQuery::database() const
{
const ASTTableExpression * table_expression = getFirstTableExpression(*this);
if (!table_expression || !table_expression->database_and_table_name)
if (!table_expression || !table_expression->database_and_table_name || table_expression->database_and_table_name->children.empty())
return {};
if (table_expression->database_and_table_name->children.size() != 2)
@ -532,26 +532,41 @@ void ASTSelectQuery::setDatabaseIfNeeded(const String & database_name)
{
throw Exception("Logical error: more than two components in table expression", ErrorCodes::LOGICAL_ERROR);
}
else
{
table_expression->database_and_table_name->children[0] = std::make_shared<ASTIdentifier>(
StringRange(), database_name, ASTIdentifier::Database);
}
}
void ASTSelectQuery::replaceDatabaseAndTable(const String & database_name, const String & table_name)
{
ASTTableExpression * table_expression = getFirstTableExpression(*this);
if (!table_expression)
return;
ASTPtr database = std::make_shared<ASTIdentifier>(StringRange(), database_name, ASTIdentifier::Database);
if (!table_expression)
{
auto tables_list = std::make_shared<ASTTablesInSelectQuery>();
auto element = std::make_shared<ASTTablesInSelectQueryElement>();
auto table_expr = std::make_shared<ASTTableExpression>();
element->table_expression = table_expr;
element->children.emplace_back(table_expr);
tables_list->children.emplace_back(element);
tables = tables_list;
children.emplace_back(tables_list);
table_expression = table_expr.get();
}
ASTPtr table = std::make_shared<ASTIdentifier>(StringRange(), table_name, ASTIdentifier::Table);
table_expression->database_and_table_name = std::make_shared<ASTIdentifier>(
StringRange(), database_name + "." + table_name, ASTIdentifier::Table);
table_expression->database_and_table_name->children = {database, table};
if (!database_name.empty())
{
ASTPtr database = std::make_shared<ASTIdentifier>(StringRange(), database_name, ASTIdentifier::Database);
table_expression->database_and_table_name = std::make_shared<ASTIdentifier>(
StringRange(), database_name + "." + table_name, ASTIdentifier::Table);
table_expression->database_and_table_name->children = {database, table};
}
else
{
table_expression->database_and_table_name = std::make_shared<ASTIdentifier>(
StringRange(), table_name, ASTIdentifier::Table);
}
}
};

View File

@ -25,10 +25,12 @@ bool ParserTableExpression::parseImpl(Pos & pos, Pos end, ASTPtr & node, Pos & m
ws.ignore(pos, end);
if (ParserSubquery().parse(pos, end, res->subquery, max_parsed_pos, expected))
if (ParserWithOptionalAlias(std::make_unique<ParserSubquery>(), true)
.parse(pos, end, res->subquery, max_parsed_pos, expected))
{
}
else if (ParserFunction().parse(pos, end, res->table_function, max_parsed_pos, expected))
else if (ParserWithOptionalAlias(std::make_unique<ParserFunction>(), true)
.parse(pos, end, res->table_function, max_parsed_pos, expected))
{
static_cast<ASTFunction &>(*res->table_function).kind = ASTFunction::TABLE_FUNCTION;
}
@ -205,6 +207,15 @@ bool ParserTablesInSelectQueryElement::parseImpl(Pos & pos, Pos end, ASTPtr & no
ws.ignore(pos, end);
/// Optional OUTER keyword for outer joins.
if (table_join->kind == ASTTableJoin::Kind::Left
|| table_join->kind == ASTTableJoin::Kind::Right
|| table_join->kind == ASTTableJoin::Kind::Full)
{
ParserString("OUTER", true, true).ignore(pos, end)
&& ws.ignore(pos, end);
}
if (!ParserString("JOIN", true, true).ignore(pos, end, max_parsed_pos, expected))
return false;

View File

@ -6,25 +6,25 @@ select abs(1.0) = 1.0;
select abs(-1.0) = 1.0;
select abs(-128) = 128;
select abs(127) = 127;
select sum(abs(number - 10 as x) = (x < 0 ? -x : x)) / count() array join range(1000000) as number;
select sum(abs(number - 10 as x) = (x < 0 ? -x : x)) / count() from array join range(1000000) as number;
select sqrt(0) = 0;
select sqrt(1) = 1;
select sqrt(4) = 2;
select sum(sqrt(x * x) = x) / count() array join range(1000000) as x;
select sum(sqrt(x * x) = x) / count() from array join range(1000000) as x;
select cbrt(0) = 0;
select cbrt(1) = 1;
select cbrt(8) = 2;
select sum(abs(cbrt(x * x * x) - x) < 1.0e-9) / count() array join range(1000000) as x;
select sum(abs(cbrt(x * x * x) - x) < 1.0e-9) / count() from array join range(1000000) as x;
select pow(1, 0) = 1;
select pow(2, 0) = 1;
select sum(pow(x, 0) = 1) / count() array join range(1000000) as x;
select sum(pow(x, 0) = 1) / count() from array join range(1000000) as x;
select pow(1, 1) = 1;
select pow(2, 1) = 2;
select sum(abs(pow(x, 1) - x) < 1.0e-9) / count() array join range(1000000) as x;
select sum(pow(x, 2) = x * x) / count() array join range(10000) as x;
select sum(abs(pow(x, 1) - x) < 1.0e-9) / count() from array join range(1000000) as x;
select sum(pow(x, 2) = x * x) / count() from array join range(10000) as x;
select tgamma(0) = inf;
select tgamma(1) = 1;
@ -32,7 +32,7 @@ select tgamma(2) = 1;
select tgamma(3) = 2;
select tgamma(4) = 6;
select sum(abs(lgamma(x + 1) - log(tgamma(x + 1))) < 1.0e-9) / count() array join range(10) as x;
select sum(abs(lgamma(x + 1) - log(tgamma(x + 1))) < 1.0e-9) / count() from array join range(10) as x;
select abs(e() - arraySum(arrayMap(x -> 1 / tgamma(x + 1), range(13)))) < 1.0e-9;
@ -41,35 +41,35 @@ select log(1) = 0;
select log(e()) = 1;
select log(exp(1)) = 1;
select log(exp(2)) = 2;
select sum(abs(log(exp(x)) - x) < 1.0e-9) / count() array join range(100) as x;
select sum(abs(log(exp(x)) - x) < 1.0e-9) / count() from array join range(100) as x;
select exp2(-1) = 1/2;
select exp2(0) = 1;
select exp2(1) = 2;
select exp2(2) = 4;
select exp2(3) = 8;
select sum(exp2(x) = pow(2, x)) / count() array join range(1000) as x;
select sum(exp2(x) = pow(2, x)) / count() from array join range(1000) as x;
select log2(0) = -inf;
select log2(1) = 0;
select log2(2) = 1;
select log2(4) = 2;
select sum(abs(log2(exp2(x)) - x) < 1.0e-9) / count() array join range(1000) as x;
select sum(abs(log2(exp2(x)) - x) < 1.0e-9) / count() from array join range(1000) as x;
select sin(0) = 0;
select sin(pi() / 4) = 1 / sqrt(2);
select sin(pi() / 2) = 1;
select sin(3 * pi() / 2) = -1;
select sum(sin(pi() / 2 + 2 * pi() * x) = 1) / count() array join range(1000000) as x;
select sum(sin(pi() / 2 + 2 * pi() * x) = 1) / count() from array join range(1000000) as x;
select cos(0) = 1;
select abs(cos(pi() / 4) - 1 / sqrt(2)) < 1.0e-9;
select cos(pi() / 2) < 1.0e-9;
select sum(abs(cos(2 * pi() * x)) - 1 < 1.0e-9) / count() array join range(1000000) as x;
select sum(abs(cos(2 * pi() * x)) - 1 < 1.0e-9) / count() from array join range(1000000) as x;
select tan(0) = 0;
select abs(tan(pi() / 4) - 1) < 1.0e-9;
select sum(abs(tan(pi() / 4 + 2 * pi() * x) - 1) < 1.0e-8) / count() array join range(1000000) as x;
select sum(abs(tan(pi() / 4 + 2 * pi() * x) - 1) < 1.0e-8) / count() from array join range(1000000) as x;
select asin(0) = 0;
select asin(1) = pi() / 2;

View File

@ -1,12 +1,14 @@
SELECT
SELECT
1 AS DomainID,
Domain ANY LEFT JOIN
Domain
FROM system.one
ANY LEFT JOIN
(
SELECT
SELECT
1 AS DomainID,
'abc' AS Domain
UNION ALL
SELECT
UNION ALL
SELECT
2 AS DomainID,
'def' AS Domain
) USING DomainID;

View File

@ -1,4 +1,4 @@
select IPv4NumToStringClassC(toUInt32(0)) = '0.0.0.xxx';
select IPv4NumToStringClassC(0x7f000001) = '127.0.0.xxx';
select sum(IPv4NumToStringClassC(materialize(toUInt32(0))) = '0.0.0.xxx') = count() array join range(1024) as n;
select sum(IPv4NumToStringClassC(materialize(0x7f000001)) = '127.0.0.xxx') = count() array join range(1024) as n;
select sum(IPv4NumToStringClassC(materialize(toUInt32(0))) = '0.0.0.xxx') = count() from array join range(1024) as n;
select sum(IPv4NumToStringClassC(materialize(0x7f000001)) = '127.0.0.xxx') = count() from array join range(1024) as n;

View File

@ -1,2 +1,2 @@
SELECT value ANY LEFT JOIN (SELECT dummy, dummy AS value) USING dummy GROUP BY value;
SELECT value FROM system.one ANY LEFT JOIN (SELECT dummy, dummy AS value) USING dummy GROUP BY value;
SELECT value1, value2, sum(number) FROM (SELECT number, intHash64(number) AS value1 FROM system.numbers LIMIT 10) ANY LEFT JOIN (SELECT number, intHash32(number) AS value2 FROM system.numbers LIMIT 10) USING number GROUP BY value1, value2;

View File

@ -1 +1 @@
SELECT 1 AS k ANY LEFT JOIN (SELECT k FROM (SELECT 1 AS k, 2 AS x)) USING k;
SELECT 1 AS k FROM system.one ANY LEFT JOIN (SELECT k FROM (SELECT 1 AS k, 2 AS x)) USING k;

View File

@ -10,8 +10,8 @@ select URLHash('' as url, 1000) = URLHash(url);
select URLHash('http://ya.ru/a' as url, 0 as level) = URLHash(URLHierarchy(url)[level + 1]);
select URLHash('http://ya.ru/a' as url, 1 as level) = URLHash(URLHierarchy(url)[level + 1]);
select URLHash(url, 0 as level) = URLHash(URLHierarchy(url)[level + 1]) array join ['', 'http://ya.ru', 'http://ya.ru/', 'http://ya.ru/a', 'http://ya.ru/a/', 'http://ya.ru/a/b', 'http://ya.ru/a/b?'] as url;
select URLHash(url, 1 as level) = URLHash(URLHierarchy(url)[level + 1]) array join ['', 'http://ya.ru', 'http://ya.ru/', 'http://ya.ru/a', 'http://ya.ru/a/', 'http://ya.ru/a/b', 'http://ya.ru/a/b?'] as url;
select URLHash(url, 2 as level) = URLHash(URLHierarchy(url)[level + 1]) array join ['', 'http://ya.ru', 'http://ya.ru/', 'http://ya.ru/a', 'http://ya.ru/a/', 'http://ya.ru/a/b', 'http://ya.ru/a/b?'] as url;
select URLHash(url, 3 as level) = URLHash(URLHierarchy(url)[level + 1]) array join ['', 'http://ya.ru', 'http://ya.ru/', 'http://ya.ru/a', 'http://ya.ru/a/', 'http://ya.ru/a/b', 'http://ya.ru/a/b?'] as url;
select URLHash(url, 4 as level) = URLHash(URLHierarchy(url)[level + 1]) array join ['', 'http://ya.ru', 'http://ya.ru/', 'http://ya.ru/a', 'http://ya.ru/a/', 'http://ya.ru/a/b', 'http://ya.ru/a/b?'] as url;
select URLHash(url, 0 as level) = URLHash(URLHierarchy(url)[level + 1]) from array join ['', 'http://ya.ru', 'http://ya.ru/', 'http://ya.ru/a', 'http://ya.ru/a/', 'http://ya.ru/a/b', 'http://ya.ru/a/b?'] as url;
select URLHash(url, 1 as level) = URLHash(URLHierarchy(url)[level + 1]) from array join ['', 'http://ya.ru', 'http://ya.ru/', 'http://ya.ru/a', 'http://ya.ru/a/', 'http://ya.ru/a/b', 'http://ya.ru/a/b?'] as url;
select URLHash(url, 2 as level) = URLHash(URLHierarchy(url)[level + 1]) from array join ['', 'http://ya.ru', 'http://ya.ru/', 'http://ya.ru/a', 'http://ya.ru/a/', 'http://ya.ru/a/b', 'http://ya.ru/a/b?'] as url;
select URLHash(url, 3 as level) = URLHash(URLHierarchy(url)[level + 1]) from array join ['', 'http://ya.ru', 'http://ya.ru/', 'http://ya.ru/a', 'http://ya.ru/a/', 'http://ya.ru/a/b', 'http://ya.ru/a/b?'] as url;
select URLHash(url, 4 as level) = URLHash(URLHierarchy(url)[level + 1]) from array join ['', 'http://ya.ru', 'http://ya.ru/', 'http://ya.ru/a', 'http://ya.ru/a/', 'http://ya.ru/a/b', 'http://ya.ru/a/b?'] as url;

View File

@ -8,22 +8,22 @@ select upperUTF8('AAAAAAAAAAAAAAA012345789,.!AAAA' as str) = str;
select upper('AaAaAaAaAaAaAaA012345789,.!aAaA') = 'AAAAAAAAAAAAAAA012345789,.!AAAA';
select upperUTF8('AaAaAaAaAaAaAaA012345789,.!aAaA') = 'AAAAAAAAAAAAAAA012345789,.!AAAA';
select sum(lower(materialize('aaaaaaaaaaaaaaa012345789,.!aaaa') as str) = str) = count() array join range(16384) as n;
select sum(lowerUTF8(materialize('aaaaaaaaaaaaaaa012345789,.!aaaa') as str) = str) = count() array join range(16384) as n;
select sum(lower(materialize('AaAaAaAaAaAaAaA012345789,.!aAaA')) = materialize('aaaaaaaaaaaaaaa012345789,.!aaaa')) = count() array join range(16384) as n;
select sum(lowerUTF8(materialize('AaAaAaAaAaAaAaA012345789,.!aAaA')) = materialize('aaaaaaaaaaaaaaa012345789,.!aaaa')) = count() array join range(16384) as n;
select sum(lower(materialize('aaaaaaaaaaaaaaa012345789,.!aaaa') as str) = str) = count() from array join range(16384) as n;
select sum(lowerUTF8(materialize('aaaaaaaaaaaaaaa012345789,.!aaaa') as str) = str) = count() from array join range(16384) as n;
select sum(lower(materialize('AaAaAaAaAaAaAaA012345789,.!aAaA')) = materialize('aaaaaaaaaaaaaaa012345789,.!aaaa')) = count() from array join range(16384) as n;
select sum(lowerUTF8(materialize('AaAaAaAaAaAaAaA012345789,.!aAaA')) = materialize('aaaaaaaaaaaaaaa012345789,.!aaaa')) = count() from array join range(16384) as n;
select sum(upper(materialize('AAAAAAAAAAAAAAA012345789,.!AAAA') as str) = str) = count() array join range(16384) as n;
select sum(upperUTF8(materialize('AAAAAAAAAAAAAAA012345789,.!AAAA') as str) = str) = count() array join range(16384) as n;
select sum(upper(materialize('AaAaAaAaAaAaAaA012345789,.!aAaA')) = materialize('AAAAAAAAAAAAAAA012345789,.!AAAA')) = count() array join range(16384) as n;
select sum(upperUTF8(materialize('AaAaAaAaAaAaAaA012345789,.!aAaA')) = materialize('AAAAAAAAAAAAAAA012345789,.!AAAA')) = count() array join range(16384) as n;
select sum(upper(materialize('AAAAAAAAAAAAAAA012345789,.!AAAA') as str) = str) = count() from array join range(16384) as n;
select sum(upperUTF8(materialize('AAAAAAAAAAAAAAA012345789,.!AAAA') as str) = str) = count() from array join range(16384) as n;
select sum(upper(materialize('AaAaAaAaAaAaAaA012345789,.!aAaA')) = materialize('AAAAAAAAAAAAAAA012345789,.!AAAA')) = count() from array join range(16384) as n;
select sum(upperUTF8(materialize('AaAaAaAaAaAaAaA012345789,.!aAaA')) = materialize('AAAAAAAAAAAAAAA012345789,.!AAAA')) = count() from array join range(16384) as n;
select lower('aaaaАБВГAAAAaaAA') = 'aaaaАБВГaaaaaaaa';
select upper('aaaaАБВГAAAAaaAA') = 'AAAAАБВГAAAAAAAA';
select lowerUTF8('aaaaАБВГAAAAaaAA') = 'aaaaабвгaaaaaaaa';
select upperUTF8('aaaaАБВГAAAAaaAA') = 'AAAAАБВГAAAAAAAA';
select sum(lower(materialize('aaaaАБВГAAAAaaAA')) = materialize('aaaaАБВГaaaaaaaa')) = count() array join range(16384) as n;
select sum(upper(materialize('aaaaАБВГAAAAaaAA')) = materialize('AAAAАБВГAAAAAAAA')) = count() array join range(16384) as n;
select sum(lowerUTF8(materialize('aaaaАБВГAAAAaaAA')) = materialize('aaaaабвгaaaaaaaa')) = count() array join range(16384) as n;
select sum(upperUTF8(materialize('aaaaАБВГAAAAaaAA')) = materialize('AAAAАБВГAAAAAAAA')) = count() array join range(16384) as n;
select sum(lower(materialize('aaaaАБВГAAAAaaAA')) = materialize('aaaaАБВГaaaaaaaa')) = count() from array join range(16384) as n;
select sum(upper(materialize('aaaaАБВГAAAAaaAA')) = materialize('AAAAАБВГAAAAAAAA')) = count() from array join range(16384) as n;
select sum(lowerUTF8(materialize('aaaaАБВГAAAAaaAA')) = materialize('aaaaабвгaaaaaaaa')) = count() from array join range(16384) as n;
select sum(upperUTF8(materialize('aaaaАБВГAAAAaaAA')) = materialize('AAAAАБВГAAAAAAAA')) = count() from array join range(16384) as n;

View File

@ -1,11 +1,11 @@
SELECT arrayFilter(x -> notEmpty(concat(x, 'hello')), ['']) ARRAY JOIN [0] AS elem, arrayMap(x -> concat(x, 'hello'), ['']) AS unused WHERE NOT ignore(elem);
SELECT arrayFilter(x -> notEmpty(concat(x, 'hello')), ['']) FROM ARRAY JOIN [0] AS elem, arrayMap(x -> concat(x, 'hello'), ['']) AS unused WHERE NOT ignore(elem);
SELECT '---';
SELECT arrayFilter(x -> x = 'hello', ['']) ARRAY JOIN [0] AS elem WHERE NOT ignore(elem) AND arrayExists(x -> x = 'hello', ['']);
SELECT arrayFilter(x -> x = 'hello', ['']) FROM ARRAY JOIN [0] AS elem WHERE NOT ignore(elem) AND arrayExists(x -> x = 'hello', ['']);
SELECT '---';
SELECT arrayJoin([0]), replicate('hello', [1]) WHERE NOT ignore(replicate('hello', [1]));
SELECT '---';
SELECT arrayJoin([0]), replicate('hello', emptyArrayString()) ARRAY JOIN emptyArrayString() AS unused WHERE NOT ignore(replicate('hello', emptyArrayString()));
SELECT arrayJoin([0]), replicate('hello', emptyArrayString()) FROM ARRAY JOIN emptyArrayString() AS unused WHERE NOT ignore(replicate('hello', emptyArrayString()));
SELECT '---';
SELECT arrayJoin([0]), replicate('hello', emptyArrayString()) WHERE NOT ignore(replicate('hello', emptyArrayString()));
SELECT '---';
SELECT replicate('hello', emptyArrayString()) ARRAY JOIN emptyArrayString() AS unused WHERE NOT ignore(replicate('hello', emptyArrayString()));
SELECT replicate('hello', emptyArrayString()) FROM ARRAY JOIN emptyArrayString() AS unused WHERE NOT ignore(replicate('hello', emptyArrayString()));