mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-22 23:52:03 +00:00
minor changes
This commit is contained in:
parent
6433d5efa7
commit
8bb35ac987
@ -90,12 +90,7 @@ private:
|
||||
void visit(ASTTableExpression & table_expression, ASTPtr &) const
|
||||
{
|
||||
if (table_expression.database_and_table_name)
|
||||
{
|
||||
tryVisit<ASTIdentifier>(table_expression.database_and_table_name);
|
||||
|
||||
if (table_expression.database_and_table_name->children.size() != 2)
|
||||
throw Exception("Logical error: more than two components in table expression", ErrorCodes::LOGICAL_ERROR);
|
||||
}
|
||||
else if (table_expression.subquery)
|
||||
tryVisit<ASTSubquery>(table_expression.subquery);
|
||||
}
|
||||
|
@ -209,21 +209,13 @@ std::optional<DatabaseAndTableWithAlias> getDatabaseAndTable(const ASTSelectQuer
|
||||
return DatabaseAndTableWithAlias(database_and_table_name);
|
||||
}
|
||||
|
||||
ASTPtr getTableFunctionOrSubquery(const ASTSelectQuery & select, size_t table_number)
|
||||
ASTPtr extractTableExpression(const ASTSelectQuery & select, size_t table_number)
|
||||
{
|
||||
const ASTTableExpression * table_expression = getTableExpression(select, table_number);
|
||||
if (table_expression)
|
||||
if (const ASTTableExpression * table_expression = getTableExpression(select, table_number))
|
||||
{
|
||||
#if 1 /// TODO: It hides some logical error in InterpreterSelectQuery & distributed tables
|
||||
if (table_expression->database_and_table_name)
|
||||
{
|
||||
if (table_expression->database_and_table_name->children.empty())
|
||||
return table_expression->database_and_table_name;
|
||||
return table_expression->database_and_table_name;
|
||||
|
||||
if (table_expression->database_and_table_name->children.size() == 2)
|
||||
return table_expression->database_and_table_name->children[1];
|
||||
}
|
||||
#endif
|
||||
if (table_expression->table_function)
|
||||
return table_expression->table_function;
|
||||
|
||||
|
@ -44,6 +44,6 @@ std::vector<DatabaseAndTableWithAlias> getDatabaseAndTables(const ASTSelectQuery
|
||||
std::optional<DatabaseAndTableWithAlias> getDatabaseAndTable(const ASTSelectQuery & select, size_t table_number);
|
||||
|
||||
std::vector<const ASTTableExpression *> getSelectTablesExpression(const ASTSelectQuery & select_query);
|
||||
ASTPtr getTableFunctionOrSubquery(const ASTSelectQuery & select, size_t table_number);
|
||||
ASTPtr extractTableExpression(const ASTSelectQuery & select, size_t table_number);
|
||||
|
||||
}
|
||||
|
@ -310,7 +310,7 @@ void ExpressionAnalyzer::makeSetsForIndexImpl(const ASTPtr & node, const Block &
|
||||
|
||||
if (!prepared_sets.count(arg->range)) /// Not already prepared.
|
||||
{
|
||||
if (typeid_cast<ASTSubquery *>(arg.get()) || typeid_cast<ASTIdentifier *>(arg.get()))
|
||||
if (typeid_cast<ASTSubquery *>(arg.get()) || isIdentifier(arg))
|
||||
{
|
||||
if (settings.use_index_for_in_with_subqueries)
|
||||
tryMakeSetForIndexFromSubquery(arg);
|
||||
|
@ -55,7 +55,7 @@ public:
|
||||
ASTPtr table_name;
|
||||
ASTPtr subquery_or_table_name;
|
||||
|
||||
if (typeid_cast<const ASTIdentifier *>(subquery_or_table_name_or_table_expression.get()))
|
||||
if (isIdentifier(subquery_or_table_name_or_table_expression))
|
||||
{
|
||||
table_name = subquery_or_table_name_or_table_expression;
|
||||
subquery_or_table_name = table_name;
|
||||
@ -86,7 +86,7 @@ public:
|
||||
if (table_name)
|
||||
{
|
||||
/// If this is already an external table, you do not need to add anything. Just remember its presence.
|
||||
if (external_tables.end() != external_tables.find(static_cast<const ASTIdentifier &>(*table_name).name))
|
||||
if (external_tables.end() != external_tables.find(*getIdentifierName(table_name)))
|
||||
return;
|
||||
}
|
||||
|
||||
|
@ -147,14 +147,22 @@ InterpreterSelectQuery::InterpreterSelectQuery(
|
||||
|
||||
max_streams = settings.max_threads;
|
||||
|
||||
ASTPtr table_expression = getTableFunctionOrSubquery(query, 0);
|
||||
ASTPtr table_expression = extractTableExpression(query, 0);
|
||||
|
||||
bool is_table_func = false;
|
||||
bool is_subquery = false;
|
||||
if (table_expression)
|
||||
{
|
||||
is_table_func = typeid_cast<const ASTFunction *>(table_expression.get());
|
||||
is_subquery = typeid_cast<const ASTSelectWithUnionQuery *>(table_expression.get());
|
||||
}
|
||||
|
||||
if (input)
|
||||
{
|
||||
/// Read from prepared input.
|
||||
source_header = input->getHeader();
|
||||
}
|
||||
else if (table_expression && typeid_cast<const ASTSelectWithUnionQuery *>(table_expression.get()))
|
||||
else if (is_subquery)
|
||||
{
|
||||
/// Read from subquery.
|
||||
interpreter_subquery = std::make_unique<InterpreterSelectWithUnionQuery>(
|
||||
@ -164,7 +172,7 @@ InterpreterSelectQuery::InterpreterSelectQuery(
|
||||
}
|
||||
else if (!storage)
|
||||
{
|
||||
if (table_expression && typeid_cast<const ASTFunction *>(table_expression.get()))
|
||||
if (is_table_func)
|
||||
{
|
||||
/// Read from table function.
|
||||
storage = context.getQueryContext().executeTableFunction(table_expression);
|
||||
@ -208,7 +216,7 @@ InterpreterSelectQuery::InterpreterSelectQuery(
|
||||
if (query_analyzer->isRewriteSubqueriesPredicate())
|
||||
{
|
||||
/// remake interpreter_subquery when PredicateOptimizer is rewrite subqueries and main table is subquery
|
||||
if (table_expression && typeid_cast<ASTSelectWithUnionQuery *>(table_expression.get()))
|
||||
if (is_subquery)
|
||||
interpreter_subquery = std::make_unique<InterpreterSelectWithUnionQuery>(
|
||||
table_expression, getSubqueryContext(context), required_columns, QueryProcessingStage::Complete, subquery_depth + 1,
|
||||
only_analyze);
|
||||
@ -921,7 +929,7 @@ void InterpreterSelectQuery::executeFetchColumns(
|
||||
/// If we need less number of columns that subquery have - update the interpreter.
|
||||
if (required_columns.size() < source_header.columns())
|
||||
{
|
||||
ASTPtr subquery = getTableFunctionOrSubquery(query, 0);
|
||||
ASTPtr subquery = extractTableExpression(query, 0);
|
||||
if (!subquery)
|
||||
throw Exception("Subquery expected", ErrorCodes::LOGICAL_ERROR);
|
||||
|
||||
@ -1396,7 +1404,7 @@ bool hasWithTotalsInAnySubqueryInFromClause(const ASTSelectQuery & query)
|
||||
* In other cases, totals will be computed on the initiating server of the query, and it is not necessary to read the data to the end.
|
||||
*/
|
||||
|
||||
if (auto query_table = getTableFunctionOrSubquery(query, 0))
|
||||
if (auto query_table = extractTableExpression(query, 0))
|
||||
{
|
||||
if (auto ast_union = typeid_cast<const ASTSelectWithUnionQuery *>(query_table.get()))
|
||||
{
|
||||
|
@ -30,7 +30,7 @@ namespace ErrorCodes
|
||||
static void extractDependentTable(ASTSelectQuery & query, String & select_database_name, String & select_table_name)
|
||||
{
|
||||
auto db_and_table = getDatabaseAndTable(query, 0);
|
||||
ASTPtr subquery = getTableFunctionOrSubquery(query, 0);
|
||||
ASTPtr subquery = extractTableExpression(query, 0);
|
||||
|
||||
if (!db_and_table && !subquery)
|
||||
return;
|
||||
@ -69,7 +69,7 @@ static void checkAllowedQueries(const ASTSelectQuery & query)
|
||||
if (query.prewhere_expression || query.final() || query.sample_size())
|
||||
throw Exception("MATERIALIZED VIEW cannot have PREWHERE, SAMPLE or FINAL.", DB::ErrorCodes::QUERY_IS_NOT_SUPPORTED_IN_MATERIALIZED_VIEW);
|
||||
|
||||
ASTPtr subquery = getTableFunctionOrSubquery(query, 0);
|
||||
ASTPtr subquery = extractTableExpression(query, 0);
|
||||
if (!subquery)
|
||||
return;
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user