Skip to content

Commit 8e6ec83

Browse files
Merge pull request ClickHouse#78618 from ClickHouse/fix-analyzer-join-using-alias
Fix analyzer: add proper exception when JOIN ... USING involves ALIAS column
2 parents b84dcef + 95de355 commit 8e6ec83

File tree

4 files changed

+39
-6
lines changed

4 files changed

+39
-6
lines changed

src/Planner/PlannerJoinTree.cpp

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1837,19 +1837,27 @@ JoinTreeQueryPlan buildQueryPlanForJoinNodeLegacy(
18371837
auto & inner_columns_list = join_node_using_column_node.getExpressionOrThrow()->as<ListNode &>();
18381838

18391839
auto & left_inner_column_node = inner_columns_list.getNodes().at(0);
1840-
auto & left_inner_column = left_inner_column_node->as<ColumnNode &>();
1840+
auto * left_inner_column = left_inner_column_node->as<ColumnNode>();
1841+
if (!left_inner_column)
1842+
throw Exception(ErrorCodes::BAD_ARGUMENTS,
1843+
"JOIN USING clause expected column identifier. Actual {}",
1844+
left_inner_column_node->formatASTForErrorMessage());
18411845

18421846
auto & right_inner_column_node = inner_columns_list.getNodes().at(1);
1843-
auto & right_inner_column = right_inner_column_node->as<ColumnNode &>();
1847+
auto * right_inner_column = right_inner_column_node->as<ColumnNode>();
1848+
if (!right_inner_column)
1849+
throw Exception(ErrorCodes::BAD_ARGUMENTS,
1850+
"JOIN USING clause expected column identifier. Actual {}",
1851+
right_inner_column_node->formatASTForErrorMessage());
18441852

18451853
const auto & join_node_using_column_node_type = join_node_using_column_node.getColumnType();
1846-
if (!left_inner_column.getColumnType()->equals(*join_node_using_column_node_type))
1854+
if (!left_inner_column->getColumnType()->equals(*join_node_using_column_node_type))
18471855
{
18481856
const auto & left_inner_column_identifier = planner_context->getColumnNodeIdentifierOrThrow(left_inner_column_node);
18491857
left_plan_column_name_to_cast_type.emplace(left_inner_column_identifier, join_node_using_column_node_type);
18501858
}
18511859

1852-
if (!right_inner_column.getColumnType()->equals(*join_node_using_column_node_type))
1860+
if (!right_inner_column->getColumnType()->equals(*join_node_using_column_node_type))
18531861
{
18541862
const auto & right_inner_column_identifier = planner_context->getColumnNodeIdentifierOrThrow(right_inner_column_node);
18551863
right_plan_column_name_to_cast_type.emplace(right_inner_column_identifier, join_node_using_column_node_type);

src/Planner/PlannerJoinsLogical.cpp

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ namespace ErrorCodes
5959
extern const int LOGICAL_ERROR;
6060
extern const int NOT_IMPLEMENTED;
6161
extern const int INVALID_JOIN_ON_EXPRESSION;
62+
extern const int BAD_ARGUMENTS;
6263
}
6364

6465
namespace Setting
@@ -104,11 +105,25 @@ struct JoinInfoBuildContext
104105
{
105106
auto & column_node = join_using_node->as<ColumnNode &>();
106107
auto & column_node_sources = column_node.getExpressionOrThrow()->as<ListNode &>();
108+
109+
const auto column_left = column_node_sources.getNodes().at(0);
110+
if (!column_left->as<ColumnNode>())
111+
throw Exception(ErrorCodes::BAD_ARGUMENTS,
112+
"JOIN USING clause expected column identifier. Actual {}",
113+
column_left->formatASTForErrorMessage());
114+
107115
changed_types.emplace(
108-
planner_context_->getColumnNodeIdentifierOrThrow(column_node_sources.getNodes().at(0)),
116+
planner_context_->getColumnNodeIdentifierOrThrow(column_left),
109117
column_node.getColumnType());
118+
119+
const auto column_right = column_node_sources.getNodes().at(1);
120+
if (!column_right->as<ColumnNode>())
121+
throw Exception(ErrorCodes::BAD_ARGUMENTS,
122+
"JOIN USING clause expected column identifier. Actual {}",
123+
column_right->formatASTForErrorMessage());
124+
110125
changed_types.emplace(
111-
planner_context_->getColumnNodeIdentifierOrThrow(column_node_sources.getNodes().at(1)),
126+
planner_context_->getColumnNodeIdentifierOrThrow(column_right),
112127
column_node.getColumnType());
113128
}
114129
}

tests/queries/0_stateless/03402_join_using_alias.reference

Whitespace-only changes.
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
set enable_analyzer=1;
2+
3+
DROP TABLE IF EXISTS t0;
4+
5+
CREATE TABLE t0 (c0 Int, c1 Int ALIAS 1) ENGINE = Memory;
6+
SELECT c0 FROM remote('localhost', currentDatabase(), 't0') tx JOIN t0 USING (c1); -- { serverError BAD_ARGUMENTS }
7+
8+
SELECT c0 FROM remote('localhost', currentDatabase(), 't0') tx JOIN t0 USING (c1) SETTINGS query_plan_use_new_logical_join_step=0; -- { serverError BAD_ARGUMENTS }
9+
10+
DROP TABLE IF EXISTS t0;

0 commit comments

Comments
 (0)