Updated tests

This commit is contained in:
Maksim Kita 2022-09-05 11:46:18 +02:00
parent fed146e198
commit 1844673aa8
4 changed files with 375 additions and 16 deletions

View File

@ -1222,10 +1222,14 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromExpressionArguments(cons
return {};
}
if (identifier_lookup.isExpressionLookup() && it->second->getNodeType() != QueryTreeNodeType::COLUMN && it->second->getNodeType() != QueryTreeNodeType::CONSTANT
&& it->second->getNodeType() != QueryTreeNodeType::FUNCTION && it->second->getNodeType() != QueryTreeNodeType::QUERY)
auto node_type = it->second->getNodeType();
if (identifier_lookup.isExpressionLookup() && node_type != QueryTreeNodeType::COLUMN && node_type != QueryTreeNodeType::CONSTANT
&& node_type != QueryTreeNodeType::FUNCTION && node_type != QueryTreeNodeType::QUERY && node_type != QueryTreeNodeType::UNION)
return {};
else if (identifier_lookup.isTableLookup() && it->second->getNodeType() != QueryTreeNodeType::TABLE && it->second->getNodeType() != QueryTreeNodeType::QUERY)
else if (identifier_lookup.isTableLookup() && node_type != QueryTreeNodeType::TABLE && node_type != QueryTreeNodeType::TABLE_FUNCTION &&
node_type != QueryTreeNodeType::QUERY && node_type != QueryTreeNodeType::UNION)
return {};
else if (identifier_lookup.isFunctionLookup() && node_type != QueryTreeNodeType::LAMBDA)
return {};
if (!resolve_full_identifier && identifier_lookup.identifier.isCompound() && identifier_lookup.isExpressionLookup())
@ -1613,6 +1617,7 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromTableExpression(const Id
IdentifierLookup column_identifier_lookup {qualified_identifier_with_removed_part, IdentifierLookupContext::EXPRESSION};
bool can_bind_identifier_to_table_expression = tryBindIdentifierToTableExpression(column_identifier_lookup, table_expression_to_check, scope);
if (can_bind_identifier_to_table_expression)
{
can_remove_qualificator = false;
@ -1665,6 +1670,21 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromTableExpression(const Id
QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromJoin(const IdentifierLookup & identifier_lookup, const QueryTreeNodePtr & table_expression_node, IdentifierResolveScope & scope)
{
const auto & from_join_node = table_expression_node->as<const JoinNode &>();
auto left_resolved_identifier = tryResolveIdentifierFromJoinTreeNode(identifier_lookup, from_join_node.getLeftTableExpression(), scope);
auto right_resolved_identifier = tryResolveIdentifierFromJoinTreeNode(identifier_lookup, from_join_node.getRightTableExpression(), scope);
if (!identifier_lookup.isExpressionLookup())
{
if (left_resolved_identifier && right_resolved_identifier)
throw Exception(ErrorCodes::AMBIGUOUS_IDENTIFIER,
"JOIN {} ambigious identifier {}. In scope {}",
table_expression_node->formatASTForErrorMessage(),
identifier_lookup.dump(),
scope.scope_node->formatASTForErrorMessage());
return left_resolved_identifier ? left_resolved_identifier : right_resolved_identifier;
}
bool join_node_in_resolve_process = scope.table_expressions_in_resolve_process.contains(table_expression_node.get());
std::unordered_map<std::string, ColumnNodePtr> join_using_column_name_to_column_node;
@ -1680,9 +1700,6 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromJoin(const IdentifierLoo
}
}
auto left_resolved_identifier = tryResolveIdentifierFromJoinTreeNode(identifier_lookup, from_join_node.getLeftTableExpression(), scope);
auto right_resolved_identifier = tryResolveIdentifierFromJoinTreeNode(identifier_lookup, from_join_node.getRightTableExpression(), scope);
std::optional<JoinTableSide> resolved_side;
QueryTreeNodePtr resolved_identifier;
@ -1720,7 +1737,7 @@ QueryTreeNodePtr QueryAnalyzer::tryResolveIdentifierFromJoin(const IdentifierLoo
throw Exception(ErrorCodes::AMBIGUOUS_IDENTIFIER,
"JOIN {} ambigious identifier {}. In scope {}",
table_expression_node->formatASTForErrorMessage(),
identifier_lookup.identifier.getFullName(),
identifier_lookup.dump(),
scope.scope_node->formatASTForErrorMessage());
}
}
@ -3559,10 +3576,11 @@ String QueryAnalyzer::calculateProjectionNodeDisplayName(QueryTreeNodePtr & node
if (resolved_identifier_result.resolved_identifier && resolved_identifier_result.isResolvedFromJoinTree())
{
projection_name_from_scope = try_to_get_projection_name_from_scope(node);
projection_name_from_scope = try_to_get_projection_name_from_scope(resolved_identifier_result.resolved_identifier);
if (!projection_name_from_scope.empty())
return projection_name_from_scope;
if (auto * column_node = resolved_identifier_result.resolved_identifier->as<ColumnNode>())
return column_node->getColumnName();
}
@ -3822,7 +3840,7 @@ void QueryAnalyzer::initializeQueryJoinTreeNode(QueryTreeNodePtr & join_tree_nod
if (table_expression_modifiers.has_value())
resolved_identifier_table_node->setTableExpressionModifiers(*table_expression_modifiers);
}
else if (auto * resolved_identifier_table_function_node = resolved_identifier->as<TableFunctionNode>();)
else if (auto * resolved_identifier_table_function_node = resolved_identifier->as<TableFunctionNode>())
{
if (table_expression_modifiers.has_value())
resolved_identifier_table_function_node->setTableExpressionModifiers(*table_expression_modifiers);

View File

@ -201,14 +201,14 @@ QueryTreeNodes extractTableExpressions(const QueryTreeNodePtr & join_tree_node)
case QueryTreeNodeType::ARRAY_JOIN:
{
auto & array_join_node = node_to_process->as<ArrayJoinNode &>();
nodes_to_process.push_back(array_join_node.getTableExpression());
nodes_to_process.push_front(array_join_node.getTableExpression());
break;
}
case QueryTreeNodeType::JOIN:
{
auto & join_node = node_to_process->as<JoinNode &>();
nodes_to_process.push_back(join_node.getLeftTableExpression());
nodes_to_process.push_back(join_node.getRightTableExpression());
nodes_to_process.push_front(join_node.getRightTableExpression());
nodes_to_process.push_front(join_node.getLeftTableExpression());
break;
}
default:

View File

@ -253,5 +253,226 @@ arrayMap(a, [1, 2, 3]) Array(Nullable(UInt8))
arrayMap(lambda(tuple(x), _subquery_3), [1, 2, 3]) Array(Nullable(UInt8))
SELECT '--';
--
SELECT (SELECT 1 AS a, 2 AS b) AS c, c.a, c.b;
(1,2) 1 2
DESCRIBE (SELECT (SELECT 1 AS a, 2 AS b) AS c, c.a, c.b);
c Tuple(a UInt8, b UInt8)
c.a UInt8
c.b UInt8
SELECT 'Joins';
Joins
DESCRIBE (SELECT * FROM test_table_join_1, test_table_join_2);
test_table_join_1.id UInt64
test_table_join_1.value String
value_join_1 String
test_table_join_2.id UInt64
test_table_join_2.value String
value_join_2 String
SELECT '--';
--
DESCRIBE (SELECT * FROM test_table_join_1 AS t1, test_table_join_2 AS t2);
t1.id UInt64
t1.value String
value_join_1 String
t2.id UInt64
t2.value String
value_join_2 String
SELECT '--';
--
DESCRIBE (SELECT * APPLY toString FROM test_table_join_1 AS t1, test_table_join_2 AS t2);
toString(t1.id) String
toString(t1.value) String
toString(value_join_1) String
toString(t2.id) String
toString(t2.value) String
toString(value_join_2) String
SELECT '--';
--
DESCRIBE (SELECT * APPLY x -> toString(x) FROM test_table_join_1 AS t1, test_table_join_2 AS t2);
toString(t1.id) String
toString(t1.value) String
toString(value_join_1) String
toString(t2.id) String
toString(t2.value) String
toString(value_join_2) String
SELECT '--';
--
DESCRIBE (SELECT test_table_join_1.*, test_table_join_2.* FROM test_table_join_1 INNER JOIN test_table_join_2 ON test_table_join_1.id = test_table_join_2.id);
test_table_join_1.id UInt64
test_table_join_1.value String
value_join_1 String
test_table_join_2.id UInt64
test_table_join_2.value String
value_join_2 String
SELECT '--';
--
DESCRIBE (SELECT t1.*, t2.* FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id);
t1.id UInt64
t1.value String
value_join_1 String
t2.id UInt64
t2.value String
value_join_2 String
SELECT '--';
--
DESCRIBE (SELECT test_table_join_1.* APPLY toString, test_table_join_2.* APPLY toString FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id);
toString(t1.id) String
toString(t1.value) String
toString(value_join_1) String
toString(t2.id) String
toString(t2.value) String
toString(value_join_2) String
SELECT '--';
--
DESCRIBE (SELECT test_table_join_1.* APPLY x -> toString(x), test_table_join_2.* APPLY x -> toString(x) FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id);
toString(t1.id) String
toString(t1.value) String
toString(value_join_1) String
toString(t2.id) String
toString(t2.value) String
toString(value_join_2) String
SELECT '--';
--
DESCRIBE (SELECT test_table_join_1.id, test_table_join_1.value, test_table_join_1.value_join_1, test_table_join_2.id, test_table_join_2.value, test_table_join_2.value_join_2
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id);
test_table_join_1.id UInt64
test_table_join_1.value String
value_join_1 String
test_table_join_2.id UInt64
test_table_join_2.value String
value_join_2 String
SELECT '--';
--
DESCRIBE (SELECT t1.id, t1.value, t1.value_join_1, t2.id, t2.value, t2.value_join_2 FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id);
t1.id UInt64
t1.value String
value_join_1 String
t2.id UInt64
t2.value String
value_join_2 String
SELECT 'Multiple JOINS';
Multiple JOINS
DESCRIBE (SELECT * FROM test_table_join_1, test_table_join_2, test_table_join_3);
test_table_join_1.id UInt64
test_table_join_1.value String
value_join_1 String
test_table_join_2.id UInt64
test_table_join_2.value String
value_join_2 String
test_table_join_3.id UInt64
test_table_join_3.value String
value_join_3 String
SELECT '--';
--
DESCRIBE (SELECT * FROM test_table_join_1 AS t1, test_table_join_2 AS t2, test_table_join_3 AS t3);
t1.id UInt64
t1.value String
value_join_1 String
t2.id UInt64
t2.value String
value_join_2 String
t3.id UInt64
t3.value String
value_join_3 String
SELECT '--';
--
DESCRIBE (SELECT * APPLY toString FROM test_table_join_1 AS t1, test_table_join_2 AS t2, test_table_join_3 AS t3);
toString(t1.id) String
toString(t1.value) String
toString(value_join_1) String
toString(t2.id) String
toString(t2.value) String
toString(value_join_2) String
toString(t3.id) String
toString(t3.value) String
toString(value_join_3) String
SELECT '--';
--
DESCRIBE (SELECT * APPLY x -> toString(x) FROM test_table_join_1 AS t1, test_table_join_2 AS t2, test_table_join_3 AS t3);
toString(t1.id) String
toString(t1.value) String
toString(value_join_1) String
toString(t2.id) String
toString(t2.value) String
toString(value_join_2) String
toString(t3.id) String
toString(t3.value) String
toString(value_join_3) String
SELECT '--';
--
DESCRIBE (SELECT test_table_join_1.*, test_table_join_2.*, test_table_join_3.*
FROM test_table_join_1 INNER JOIN test_table_join_2 ON test_table_join_1.id = test_table_join_2.id
INNER JOIN test_table_join_3 ON test_table_join_2.id = test_table_join_3.id);
test_table_join_1.id UInt64
test_table_join_1.value String
value_join_1 String
test_table_join_2.id UInt64
test_table_join_2.value String
value_join_2 String
test_table_join_3.id UInt64
test_table_join_3.value String
value_join_3 String
SELECT '--';
--
DESCRIBE (SELECT t1.*, t2.*, t3.*
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id INNER JOIN test_table_join_3 AS t3 ON t2.id = t3.id);
t1.id UInt64
t1.value String
value_join_1 String
t2.id UInt64
t2.value String
value_join_2 String
t3.id UInt64
t3.value String
value_join_3 String
SELECT '--';
--
DESCRIBE (SELECT test_table_join_1.* APPLY toString, test_table_join_2.* APPLY toString, test_table_join_3.* APPLY toString
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id INNER JOIN test_table_join_3 AS t3 ON t2.id = t3.id);
toString(t1.id) String
toString(t1.value) String
toString(value_join_1) String
toString(t2.id) String
toString(t2.value) String
toString(value_join_2) String
toString(t3.id) String
toString(t3.value) String
toString(value_join_3) String
SELECT '--';
--
DESCRIBE (SELECT test_table_join_1.* APPLY x -> toString(x), test_table_join_2.* APPLY x -> toString(x), test_table_join_3.* APPLY x -> toString(x)
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id INNER JOIN test_table_join_3 AS t3 ON t2.id = t3.id);
toString(t1.id) String
toString(t1.value) String
toString(value_join_1) String
toString(t2.id) String
toString(t2.value) String
toString(value_join_2) String
toString(t3.id) String
toString(t3.value) String
toString(value_join_3) String
SELECT '--';
--
DESCRIBE (SELECT test_table_join_1.id, test_table_join_1.value, test_table_join_1.value_join_1, test_table_join_2.id, test_table_join_2.value, test_table_join_2.value_join_2,
test_table_join_3.id, test_table_join_3.value, test_table_join_3.value_join_3
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id INNER JOIN test_table_join_3 AS t3 ON t2.id = t3.id);
test_table_join_1.id UInt64
test_table_join_1.value String
value_join_1 String
test_table_join_2.id UInt64
test_table_join_2.value String
value_join_2 String
test_table_join_3.id UInt64
test_table_join_3.value String
value_join_3 String
SELECT '--';
--
DESCRIBE (SELECT t1.id, t1.value, t1.value_join_1, t2.id, t2.value, t2.value_join_2, t3.id, t3.value, t3.value_join_3
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id INNER JOIN test_table_join_3 AS t3 ON t2.id = t3.id);
t1.id UInt64
t1.value String
value_join_1 String
t2.id UInt64
t2.value String
value_join_2 String
t3.id UInt64
t3.value String
value_join_3 String

View File

@ -18,6 +18,36 @@ CREATE TABLE test_table_compound
INSERT INTO test_table_compound VALUES (0, tuple(0, 'Value'));
DROP TABLE IF EXISTS test_table_join_1;
CREATE TABLE test_table_join_1
(
id UInt64,
value String,
value_join_1 String
) ENGINE=TinyLog;
INSERT INTO test_table_join_1 VALUES (0, 'Join_1_Value', 'Join_1_Value');
DROP TABLE IF EXISTS test_table_join_2;
CREATE TABLE test_table_join_2
(
id UInt64,
value String,
value_join_2 String
) ENGINE=TinyLog;
INSERT INTO test_table_join_2 VALUES (0, 'Join_2_Value', 'Join_2_Value');
DROP TABLE IF EXISTS test_table_join_3;
CREATE TABLE test_table_join_3
(
id UInt64,
value String,
value_join_3 String
) ENGINE=TinyLog;
INSERT INTO test_table_join_3 VALUES (0, 'Join_3_Value', 'Join_3_Value');
-- { echoOn }
SELECT 'Constants';
@ -56,7 +86,6 @@ SELECT '--';
DESCRIBE (SELECT tuple_value.* APPLY x -> x FROM test_table_compound);
SELECT '--';
DESCRIBE (SELECT tuple_value.* APPLY toString FROM test_table_compound);
@ -211,9 +240,100 @@ DESCRIBE (SELECT arrayMap(x -> (SELECT 1), [1,2,3]), arrayMap(x -> (SELECT 2) AS
SELECT '--';
SELECT (SELECT 1 AS a, 2 AS b) AS c, c.a, c.b;
DESCRIBE (SELECT (SELECT 1 AS a, 2 AS b) AS c, c.a, c.b);
SELECT 'Joins';
DESCRIBE (SELECT * FROM test_table_join_1, test_table_join_2);
SELECT '--';
DESCRIBE (SELECT * FROM test_table_join_1 AS t1, test_table_join_2 AS t2);
SELECT '--';
DESCRIBE (SELECT * APPLY toString FROM test_table_join_1 AS t1, test_table_join_2 AS t2);
SELECT '--';
DESCRIBE (SELECT * APPLY x -> toString(x) FROM test_table_join_1 AS t1, test_table_join_2 AS t2);
SELECT '--';
DESCRIBE (SELECT test_table_join_1.*, test_table_join_2.* FROM test_table_join_1 INNER JOIN test_table_join_2 ON test_table_join_1.id = test_table_join_2.id);
SELECT '--';
DESCRIBE (SELECT t1.*, t2.* FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id);
SELECT '--';
DESCRIBE (SELECT test_table_join_1.* APPLY toString, test_table_join_2.* APPLY toString FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id);
SELECT '--';
DESCRIBE (SELECT test_table_join_1.* APPLY x -> toString(x), test_table_join_2.* APPLY x -> toString(x) FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id);
SELECT '--';
DESCRIBE (SELECT test_table_join_1.id, test_table_join_1.value, test_table_join_1.value_join_1, test_table_join_2.id, test_table_join_2.value, test_table_join_2.value_join_2
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id);
SELECT '--';
DESCRIBE (SELECT t1.id, t1.value, t1.value_join_1, t2.id, t2.value, t2.value_join_2 FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id);
SELECT 'Multiple JOINS';
DESCRIBE (SELECT * FROM test_table_join_1, test_table_join_2, test_table_join_3);
SELECT '--';
DESCRIBE (SELECT * FROM test_table_join_1 AS t1, test_table_join_2 AS t2, test_table_join_3 AS t3);
SELECT '--';
DESCRIBE (SELECT * APPLY toString FROM test_table_join_1 AS t1, test_table_join_2 AS t2, test_table_join_3 AS t3);
SELECT '--';
DESCRIBE (SELECT * APPLY x -> toString(x) FROM test_table_join_1 AS t1, test_table_join_2 AS t2, test_table_join_3 AS t3);
SELECT '--';
DESCRIBE (SELECT test_table_join_1.*, test_table_join_2.*, test_table_join_3.*
FROM test_table_join_1 INNER JOIN test_table_join_2 ON test_table_join_1.id = test_table_join_2.id
INNER JOIN test_table_join_3 ON test_table_join_2.id = test_table_join_3.id);
SELECT '--';
DESCRIBE (SELECT t1.*, t2.*, t3.*
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id INNER JOIN test_table_join_3 AS t3 ON t2.id = t3.id);
SELECT '--';
DESCRIBE (SELECT test_table_join_1.* APPLY toString, test_table_join_2.* APPLY toString, test_table_join_3.* APPLY toString
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id INNER JOIN test_table_join_3 AS t3 ON t2.id = t3.id);
SELECT '--';
DESCRIBE (SELECT test_table_join_1.* APPLY x -> toString(x), test_table_join_2.* APPLY x -> toString(x), test_table_join_3.* APPLY x -> toString(x)
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id INNER JOIN test_table_join_3 AS t3 ON t2.id = t3.id);
SELECT '--';
DESCRIBE (SELECT test_table_join_1.id, test_table_join_1.value, test_table_join_1.value_join_1, test_table_join_2.id, test_table_join_2.value, test_table_join_2.value_join_2,
test_table_join_3.id, test_table_join_3.value, test_table_join_3.value_join_3
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id INNER JOIN test_table_join_3 AS t3 ON t2.id = t3.id);
SELECT '--';
DESCRIBE (SELECT t1.id, t1.value, t1.value_join_1, t2.id, t2.value, t2.value_join_2, t3.id, t3.value, t3.value_join_3
FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 ON t1.id = t2.id INNER JOIN test_table_join_3 AS t3 ON t2.id = t3.id);
-- { echoOff }
DROP TABLE test_table_join_1;
DROP TABLE test_table_join_2;
DROP TABLE test_table;
DROP TABLE test_table_compound;