Fixed tests

This commit is contained in:
Maksim Kita 2022-10-11 18:54:23 +02:00
parent eba9607696
commit 7851dfc324
6 changed files with 102 additions and 33 deletions

View File

@ -181,7 +181,7 @@ namespace ErrorCodes
* TODO: SELECT (compound_expression).*, (compound_expression).COLUMNS are not supported on parser level.
* TODO: SELECT a.b.c.*, a.b.c.COLUMNS. Qualified matcher where identifier size is greater than 2 are not supported on parser level.
* TODO: Support function identifier resolve from parent query scope, if lambda in parent scope does not capture any columns.
* TODO: Support group_by_use_nulls
* TODO: Support group_by_use_nulls.
* TODO: Scalar subqueries cache.
*/
@ -5022,6 +5022,8 @@ void QueryAnalyzer::resolveQueryJoinTreeNode(QueryTreeNodePtr & join_tree_node,
if (join_node.isUsingJoinExpression())
{
auto & join_using_list = join_node.getJoinExpression()->as<ListNode &>();
std::unordered_set<std::string> join_using_identifiers;
for (auto & join_using_node : join_using_list.getNodes())
{
auto * identifier_node = join_using_node->as<IdentifierNode>();
@ -5030,6 +5032,14 @@ void QueryAnalyzer::resolveQueryJoinTreeNode(QueryTreeNodePtr & join_tree_node,
const auto & identifier_full_name = identifier_node->getIdentifier().getFullName();
if (join_using_identifiers.contains(identifier_full_name))
throw Exception(ErrorCodes::BAD_ARGUMENTS,
"JOIN {} identifier '{}' appears more than once in USING clause",
join_node.formatASTForErrorMessage(),
identifier_full_name);
join_using_identifiers.insert(identifier_full_name);
IdentifierLookup identifier_lookup {identifier_node->getIdentifier(), IdentifierLookupContext::EXPRESSION};
auto result_left_table_expression = tryResolveIdentifierFromJoinTreeNode(identifier_lookup, join_node.getLeftTableExpression(), scope);
if (!result_left_table_expression)
@ -5060,16 +5070,6 @@ void QueryAnalyzer::resolveQueryJoinTreeNode(QueryTreeNodePtr & join_tree_node,
join_using_node = std::move(join_using_column);
}
for (auto & join_using_node : join_using_list.getNodes())
{
if (!join_using_node->as<ColumnNode>())
throw Exception(ErrorCodes::UNSUPPORTED_METHOD,
"JOIN {} USING identifier node must be resolved into column node. Actual {}. In scope {}",
join_node.formatASTForErrorMessage(),
join_tree_node->formatASTForErrorMessage(),
scope.scope_node->formatASTForErrorMessage());
}
}
else if (join_node.getJoinExpression())
{
@ -5098,10 +5098,7 @@ void QueryAnalyzer::resolveQueryJoinTreeNode(QueryTreeNodePtr & join_tree_node,
}
auto join_tree_node_type = join_tree_node->getNodeType();
if (join_tree_node_type == QueryTreeNodeType::QUERY ||
join_tree_node_type == QueryTreeNodeType::UNION ||
join_tree_node_type == QueryTreeNodeType::TABLE ||
join_tree_node_type == QueryTreeNodeType::TABLE_FUNCTION)
if (isTableExpressionNodeType(join_tree_node_type))
{
validateTableExpressionModifiers(join_tree_node, scope);
initializeTableExpressionColumns(join_tree_node, scope);
@ -5206,7 +5203,6 @@ private:
const IdentifierResolveScope & scope;
};
/** Resolve query.
* This function modifies query node during resolve. It is caller responsibility to clone query node before resolve
* if it is needed for later use.

View File

@ -1,11 +1,11 @@
QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, is_group_by_with_totals: 0, group_by_type: ordinary
QUERY id: 0
PROJECTION
LIST id: 1, nodes: 1
CONSTANT id: 2, constant_value: UInt64_1, constant_value_type: UInt8
JOIN TREE
IDENTIFIER id: 3, identifier: system.one
--
QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, is_group_by_with_totals: 0, group_by_type: ordinary
QUERY id: 0
PROJECTION
LIST id: 1, nodes: 2
IDENTIFIER id: 2, identifier: id
@ -13,7 +13,7 @@ QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, i
JOIN TREE
IDENTIFIER id: 4, identifier: test_table
--
QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, is_group_by_with_totals: 0, group_by_type: ordinary
QUERY id: 0
PROJECTION COLUMNS
id UInt64
value String
@ -24,7 +24,7 @@ QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, i
JOIN TREE
TABLE id: 3, table_name: default.test_table
--
QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, is_group_by_with_totals: 0, group_by_type: ordinary
QUERY id: 0
PROJECTION
LIST id: 1, nodes: 1
FUNCTION id: 2, function_name: arrayMap, function_type: ordinary
@ -44,7 +44,7 @@ QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, i
JOIN TREE
IDENTIFIER id: 12, identifier: test_table
--
QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, is_group_by_with_totals: 0, group_by_type: ordinary
QUERY id: 0
PROJECTION COLUMNS
arrayMap(lambda(tuple(x), plus(x, 1)), [1, 2, 3]) Array(UInt16)
PROJECTION
@ -66,7 +66,7 @@ QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, i
JOIN TREE
TABLE id: 11, table_name: default.test_table
--
QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, is_group_by_with_totals: 0, group_by_type: ordinary
QUERY id: 0
WITH
LIST id: 1, nodes: 1
LAMBDA id: 2, alias: lambda
@ -88,7 +88,7 @@ QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, i
JOIN TREE
IDENTIFIER id: 13, identifier: test_table
--
QUERY id: 0, is_subquery: 0, is_cte: 0, is_distinct: 0, is_limit_with_ties: 0, is_group_by_with_totals: 0, group_by_type: ordinary
QUERY id: 0
PROJECTION COLUMNS
lambda(id) UInt64
PROJECTION

View File

@ -288,6 +288,52 @@ 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 '--';
--
DESCRIBE (SELECT (SELECT 1 AS a, 2 AS b) AS c, c.*);
c Tuple(a UInt8, b UInt8)
c.a UInt8
c.b UInt8
SELECT '--';
--
DESCRIBE (SELECT (SELECT 1 UNION DISTINCT SELECT 1), (SELECT 2 UNION DISTINCT SELECT 2), (SELECT 3 UNION DISTINCT SELECT 3) AS a, (SELECT 4 UNION DISTINCT SELECT 4));
_subquery_1 Nullable(UInt8)
_subquery_2 Nullable(UInt8)
a Nullable(UInt8)
_subquery_4 Nullable(UInt8)
SELECT '--';
--
DESCRIBE (SELECT arrayMap(x -> (SELECT 1 UNION DISTINCT SELECT 1), [1,2,3]), arrayMap(x -> (SELECT 2 UNION DISTINCT SELECT 2) AS a, [1, 2, 3]),
arrayMap(x -> (SELECT 3 UNION DISTINCT SELECT 3), [1,2,3]));
arrayMap(lambda(tuple(x), _subquery_1), [1, 2, 3]) Array(Nullable(UInt8))
arrayMap(a, [1, 2, 3]) Array(Nullable(UInt8))
arrayMap(lambda(tuple(x), _subquery_3), [1, 2, 3]) Array(Nullable(UInt8))
SELECT '--';
--
DESCRIBE (SELECT (SELECT 1 AS a, 2 AS b UNION DISTINCT SELECT 1, 2) AS c, c.a, c.b);
c Tuple(a UInt8, b UInt8)
c.a UInt8
c.b UInt8
SELECT '--';
--
DESCRIBE (SELECT (SELECT 1 AS a, 2 AS b UNION DISTINCT SELECT 1, 2) AS c, c.*);
c Tuple(a UInt8, b UInt8)
c.a UInt8
c.b UInt8
SELECT '--';
--
DESCRIBE (SELECT (SELECT 1), (SELECT 2 UNION DISTINCT SELECT 2), (SELECT 3) AS a, (SELECT 4 UNION DISTINCT SELECT 4));
_subquery_1 Nullable(UInt8)
_subquery_2 Nullable(UInt8)
a Nullable(UInt8)
_subquery_4 Nullable(UInt8)
SELECT '--';
--
DESCRIBE (SELECT arrayMap(x -> (SELECT 1 UNION DISTINCT SELECT 1), [1,2,3]), arrayMap(x -> (SELECT 2) AS a, [1, 2, 3]),
arrayMap(x -> (SELECT 3 UNION DISTINCT SELECT 3), [1,2,3]));
arrayMap(lambda(tuple(x), _subquery_1), [1, 2, 3]) Array(Nullable(UInt8))
arrayMap(a, [1, 2, 3]) Array(Nullable(UInt8))
arrayMap(lambda(tuple(x), _subquery_3), [1, 2, 3]) Array(Nullable(UInt8))
SELECT 'Window functions';
Window functions
DESCRIBE (SELECT count() OVER ());
@ -342,7 +388,8 @@ DESCRIBE (SELECT count() OVER (PARTITION BY id, value ORDER BY id ASC, value DES
count() OVER (PARTITION BY id, value ORDER BY id ASC, value DESC ROWS BETWEEN plus(1, 1) PRECEDING AND plus(2, 2) FOLLOWING) UInt64
SELECT '--';
--
DESCRIBE (SELECT count() OVER (PARTITION BY id, value ORDER BY id ASC, value DESC ROWS BETWEEN ((1 + 1) AS frame_offset_begin) PRECEDING AND ((2 + 2) AS frame_offset_end) FOLLOWING) FROM test_table);
DESCRIBE (SELECT count() OVER (PARTITION BY id, value ORDER BY id ASC, value DESC ROWS BETWEEN ((1 + 1) AS frame_offset_begin) PRECEDING AND ((2 + 2) AS frame_offset_end) FOLLOWING)
FROM test_table);
count() OVER (PARTITION BY id, value ORDER BY id ASC, value DESC ROWS BETWEEN frame_offset_begin PRECEDING AND frame_offset_end FOLLOWING) UInt64
SELECT '--';
--
@ -354,10 +401,6 @@ DESCRIBE (SELECT count() OVER (ORDER BY toNullable(id) NULLS LAST) FROM test_tab
count() OVER (ORDER BY toNullable(id) ASC NULLS LAST) UInt64
SELECT '--';
--
DESCRIBE (SELECT count() OVER (ORDER BY value COLLATE 'EN') FROM test_table);
count() OVER (ORDER BY value ASC COLLATE en) UInt64
SELECT '--';
--
DESCRIBE (SELECT count() OVER (ORDER BY id WITH FILL FROM 1 TO 5 STEP 1) FROM test_table);
count() OVER (ORDER BY id ASC WITH FILL FROM 1 TO 5 STEP 1) UInt64
SELECT '--';

View File

@ -268,6 +268,36 @@ SELECT '--';
DESCRIBE (SELECT (SELECT 1 AS a, 2 AS b) AS c, c.a, c.b);
SELECT '--';
DESCRIBE (SELECT (SELECT 1 AS a, 2 AS b) AS c, c.*);
SELECT '--';
DESCRIBE (SELECT (SELECT 1 UNION DISTINCT SELECT 1), (SELECT 2 UNION DISTINCT SELECT 2), (SELECT 3 UNION DISTINCT SELECT 3) AS a, (SELECT 4 UNION DISTINCT SELECT 4));
SELECT '--';
DESCRIBE (SELECT arrayMap(x -> (SELECT 1 UNION DISTINCT SELECT 1), [1,2,3]), arrayMap(x -> (SELECT 2 UNION DISTINCT SELECT 2) AS a, [1, 2, 3]),
arrayMap(x -> (SELECT 3 UNION DISTINCT SELECT 3), [1,2,3]));
SELECT '--';
DESCRIBE (SELECT (SELECT 1 AS a, 2 AS b UNION DISTINCT SELECT 1, 2) AS c, c.a, c.b);
SELECT '--';
DESCRIBE (SELECT (SELECT 1 AS a, 2 AS b UNION DISTINCT SELECT 1, 2) AS c, c.*);
SELECT '--';
DESCRIBE (SELECT (SELECT 1), (SELECT 2 UNION DISTINCT SELECT 2), (SELECT 3) AS a, (SELECT 4 UNION DISTINCT SELECT 4));
SELECT '--';
DESCRIBE (SELECT arrayMap(x -> (SELECT 1 UNION DISTINCT SELECT 1), [1,2,3]), arrayMap(x -> (SELECT 2) AS a, [1, 2, 3]),
arrayMap(x -> (SELECT 3 UNION DISTINCT SELECT 3), [1,2,3]));
SELECT 'Window functions';
DESCRIBE (SELECT count() OVER ());
@ -322,7 +352,8 @@ DESCRIBE (SELECT count() OVER (PARTITION BY id, value ORDER BY id ASC, value DES
SELECT '--';
DESCRIBE (SELECT count() OVER (PARTITION BY id, value ORDER BY id ASC, value DESC ROWS BETWEEN ((1 + 1) AS frame_offset_begin) PRECEDING AND ((2 + 2) AS frame_offset_end) FOLLOWING) FROM test_table);
DESCRIBE (SELECT count() OVER (PARTITION BY id, value ORDER BY id ASC, value DESC ROWS BETWEEN ((1 + 1) AS frame_offset_begin) PRECEDING AND ((2 + 2) AS frame_offset_end) FOLLOWING)
FROM test_table);
SELECT '--';
@ -334,10 +365,6 @@ DESCRIBE (SELECT count() OVER (ORDER BY toNullable(id) NULLS LAST) FROM test_tab
SELECT '--';
DESCRIBE (SELECT count() OVER (ORDER BY value COLLATE 'EN') FROM test_table);
SELECT '--';
DESCRIBE (SELECT count() OVER (ORDER BY id WITH FILL FROM 1 TO 5 STEP 1) FROM test_table);
SELECT '--';

View File

@ -3,6 +3,7 @@
SELECT * FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 USING (id) ORDER BY id, t1.value;
0 Join_1_Value_0 Join_2_Value_0
1 Join_1_Value_1 Join_2_Value_1
SELECT * FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 USING (id, id, id) ORDER BY id, t1.value; -- { serverError 36 }
SELECT '--';
--
SELECT * FROM test_table_join_1 AS t1 LEFT JOIN test_table_join_2 AS t2 USING (id) ORDER BY id, t1.value;

View File

@ -37,6 +37,8 @@ INSERT INTO test_table_join_3 VALUES (4, 'Join_3_Value_4');
SELECT * FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 USING (id) ORDER BY id, t1.value;
SELECT * FROM test_table_join_1 AS t1 INNER JOIN test_table_join_2 AS t2 USING (id, id, id) ORDER BY id, t1.value; -- { serverError 36 }
SELECT '--';
SELECT * FROM test_table_join_1 AS t1 LEFT JOIN test_table_join_2 AS t2 USING (id) ORDER BY id, t1.value;