From 8bb35ac98703fdc509b5e0a9ff808c3b23426af4 Mon Sep 17 00:00:00 2001 From: chertus Date: Tue, 15 Jan 2019 21:29:54 +0300 Subject: [PATCH] minor changes --- .../Interpreters/AddDefaultDatabaseVisitor.h | 5 ----- .../DatabaseAndTableWithAlias.cpp | 14 +++---------- .../Interpreters/DatabaseAndTableWithAlias.h | 2 +- dbms/src/Interpreters/ExpressionAnalyzer.cpp | 2 +- .../Interpreters/GlobalSubqueriesVisitor.h | 4 ++-- .../Interpreters/InterpreterSelectQuery.cpp | 20 +++++++++++++------ dbms/src/Storages/StorageMaterializedView.cpp | 4 ++-- 7 files changed, 23 insertions(+), 28 deletions(-) diff --git a/dbms/src/Interpreters/AddDefaultDatabaseVisitor.h b/dbms/src/Interpreters/AddDefaultDatabaseVisitor.h index 690fc35ebd..89b4ed3c89 100644 --- a/dbms/src/Interpreters/AddDefaultDatabaseVisitor.h +++ b/dbms/src/Interpreters/AddDefaultDatabaseVisitor.h @@ -90,12 +90,7 @@ private: void visit(ASTTableExpression & table_expression, ASTPtr &) const { if (table_expression.database_and_table_name) - { tryVisit(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(table_expression.subquery); } diff --git a/dbms/src/Interpreters/DatabaseAndTableWithAlias.cpp b/dbms/src/Interpreters/DatabaseAndTableWithAlias.cpp index 154484ab5b..fa298f143a 100644 --- a/dbms/src/Interpreters/DatabaseAndTableWithAlias.cpp +++ b/dbms/src/Interpreters/DatabaseAndTableWithAlias.cpp @@ -209,21 +209,13 @@ std::optional 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; diff --git a/dbms/src/Interpreters/DatabaseAndTableWithAlias.h b/dbms/src/Interpreters/DatabaseAndTableWithAlias.h index 601bde82e2..5655644c95 100644 --- a/dbms/src/Interpreters/DatabaseAndTableWithAlias.h +++ b/dbms/src/Interpreters/DatabaseAndTableWithAlias.h @@ -44,6 +44,6 @@ std::vector getDatabaseAndTables(const ASTSelectQuery std::optional getDatabaseAndTable(const ASTSelectQuery & select, size_t table_number); std::vector getSelectTablesExpression(const ASTSelectQuery & select_query); -ASTPtr getTableFunctionOrSubquery(const ASTSelectQuery & select, size_t table_number); +ASTPtr extractTableExpression(const ASTSelectQuery & select, size_t table_number); } diff --git a/dbms/src/Interpreters/ExpressionAnalyzer.cpp b/dbms/src/Interpreters/ExpressionAnalyzer.cpp index 78b2c2cfff..8c1e13815e 100644 --- a/dbms/src/Interpreters/ExpressionAnalyzer.cpp +++ b/dbms/src/Interpreters/ExpressionAnalyzer.cpp @@ -310,7 +310,7 @@ void ExpressionAnalyzer::makeSetsForIndexImpl(const ASTPtr & node, const Block & if (!prepared_sets.count(arg->range)) /// Not already prepared. { - if (typeid_cast(arg.get()) || typeid_cast(arg.get())) + if (typeid_cast(arg.get()) || isIdentifier(arg)) { if (settings.use_index_for_in_with_subqueries) tryMakeSetForIndexFromSubquery(arg); diff --git a/dbms/src/Interpreters/GlobalSubqueriesVisitor.h b/dbms/src/Interpreters/GlobalSubqueriesVisitor.h index 2e7ddc7150..3e4108464f 100644 --- a/dbms/src/Interpreters/GlobalSubqueriesVisitor.h +++ b/dbms/src/Interpreters/GlobalSubqueriesVisitor.h @@ -55,7 +55,7 @@ public: ASTPtr table_name; ASTPtr subquery_or_table_name; - if (typeid_cast(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(*table_name).name)) + if (external_tables.end() != external_tables.find(*getIdentifierName(table_name))) return; } diff --git a/dbms/src/Interpreters/InterpreterSelectQuery.cpp b/dbms/src/Interpreters/InterpreterSelectQuery.cpp index 38d178dcfd..754922d518 100644 --- a/dbms/src/Interpreters/InterpreterSelectQuery.cpp +++ b/dbms/src/Interpreters/InterpreterSelectQuery.cpp @@ -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(table_expression.get()); + is_subquery = typeid_cast(table_expression.get()); + } if (input) { /// Read from prepared input. source_header = input->getHeader(); } - else if (table_expression && typeid_cast(table_expression.get())) + else if (is_subquery) { /// Read from subquery. interpreter_subquery = std::make_unique( @@ -164,7 +172,7 @@ InterpreterSelectQuery::InterpreterSelectQuery( } else if (!storage) { - if (table_expression && typeid_cast(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(table_expression.get())) + if (is_subquery) interpreter_subquery = std::make_unique( 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(query_table.get())) { diff --git a/dbms/src/Storages/StorageMaterializedView.cpp b/dbms/src/Storages/StorageMaterializedView.cpp index 5df31fbab4..e2444862ca 100644 --- a/dbms/src/Storages/StorageMaterializedView.cpp +++ b/dbms/src/Storages/StorageMaterializedView.cpp @@ -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; -- GitLab