From c642e16ee1ac3a5c9986c898e5d8c58c4e705bb7 Mon Sep 17 00:00:00 2001 From: chertus Date: Thu, 15 Nov 2018 19:57:20 +0300 Subject: [PATCH] clearer evaluateMissingDefaults [CLICKHOUSE-3578] --- .../AddingDefaultsBlockInputStream.cpp | 2 +- dbms/src/DataStreams/IBlockInputStream.h | 1 - .../Interpreters/evaluateMissingDefaults.cpp | 42 ++++++------------- .../Interpreters/evaluateMissingDefaults.h | 7 +--- 4 files changed, 14 insertions(+), 38 deletions(-) diff --git a/dbms/src/DataStreams/AddingDefaultsBlockInputStream.cpp b/dbms/src/DataStreams/AddingDefaultsBlockInputStream.cpp index 900a923b23a..3d02b0c6415 100644 --- a/dbms/src/DataStreams/AddingDefaultsBlockInputStream.cpp +++ b/dbms/src/DataStreams/AddingDefaultsBlockInputStream.cpp @@ -49,7 +49,7 @@ Block AddingDefaultsBlockInputStream::readImpl() evaluate_block.erase(column.first); } - evaluateMissingDefaultsUnsafe(evaluate_block, header.getNamesAndTypesList(), column_defaults, context); + evaluateMissingDefaults(evaluate_block, header.getNamesAndTypesList(), column_defaults, context, false); std::unordered_map mixed_columns; diff --git a/dbms/src/DataStreams/IBlockInputStream.h b/dbms/src/DataStreams/IBlockInputStream.h index 2e305b4b451..eb5f75ef46c 100644 --- a/dbms/src/DataStreams/IBlockInputStream.h +++ b/dbms/src/DataStreams/IBlockInputStream.h @@ -19,7 +19,6 @@ class IBlockInputStream; using BlockInputStreamPtr = std::shared_ptr; using BlockInputStreams = std::vector; -class BlockMissingValues; class TableStructureReadLock; using TableStructureReadLockPtr = std::shared_ptr; diff --git a/dbms/src/Interpreters/evaluateMissingDefaults.cpp b/dbms/src/Interpreters/evaluateMissingDefaults.cpp index 8d84c8f6576..40b75c0b673 100644 --- a/dbms/src/Interpreters/evaluateMissingDefaults.cpp +++ b/dbms/src/Interpreters/evaluateMissingDefaults.cpp @@ -29,33 +29,36 @@ static ASTPtr requiredExpressions(Block & block, const NamesAndTypesList & requi setAlias(it->second.expression->clone(), it->first)); } + if (default_expr_list->children.empty()) + return nullptr; return default_expr_list; } - void evaluateMissingDefaults(Block & block, const NamesAndTypesList & required_columns, const ColumnDefaults & column_defaults, - const Context & context) + const Context & context, bool with_block_copy) { if (column_defaults.empty()) return; ASTPtr default_expr_list = requiredExpressions(block, required_columns, column_defaults); - /// nothing to evaluate - if (default_expr_list->children.empty()) + if (!default_expr_list) return; + if (!with_block_copy) + { + auto syntax_result = SyntaxAnalyzer(context, {}).analyze(default_expr_list, block.getNamesAndTypesList()); + ExpressionAnalyzer{default_expr_list, syntax_result, context}.getActions(true)->execute(block); + return; + } + /** ExpressionAnalyzer eliminates "unused" columns, in order to ensure their safety * we are going to operate on a copy instead of the original block */ Block copy_block{block}; /// evaluate default values for defaulted columns - NamesAndTypesList available_columns; - for (size_t i = 0, size = block.columns(); i < size; ++i) - available_columns.emplace_back(block.getByPosition(i).name, block.getByPosition(i).type); - - auto syntax_result = SyntaxAnalyzer(context, {}).analyze(default_expr_list, available_columns); + auto syntax_result = SyntaxAnalyzer(context, {}).analyze(default_expr_list, block.getNamesAndTypesList()); ExpressionAnalyzer{default_expr_list, syntax_result, context}.getActions(true)->execute(copy_block); /// move evaluated columns to the original block, materializing them at the same time @@ -73,25 +76,4 @@ void evaluateMissingDefaults(Block & block, } } - -void evaluateMissingDefaultsUnsafe(Block & block, - const NamesAndTypesList & required_columns, - const std::unordered_map & column_defaults, - const Context & context) -{ - if (column_defaults.empty()) - return; - - ASTPtr default_expr_list = requiredExpressions(block, required_columns, column_defaults); - if (default_expr_list->children.empty()) - return; - - NamesAndTypesList available_columns; - for (size_t i = 0, size = block.columns(); i < size; ++i) - available_columns.emplace_back(block.getByPosition(i).name, block.getByPosition(i).type); - - auto syntax_result = SyntaxAnalyzer(context, {}).analyze(default_expr_list, available_columns); - ExpressionAnalyzer{default_expr_list, syntax_result, context}.getActions(true)->execute(block); -} - } diff --git a/dbms/src/Interpreters/evaluateMissingDefaults.h b/dbms/src/Interpreters/evaluateMissingDefaults.h index ce0c649f3d0..71f6fab9753 100644 --- a/dbms/src/Interpreters/evaluateMissingDefaults.h +++ b/dbms/src/Interpreters/evaluateMissingDefaults.h @@ -15,11 +15,6 @@ struct ColumnDefault; void evaluateMissingDefaults(Block & block, const NamesAndTypesList & required_columns, const std::unordered_map & column_defaults, - const Context & context); - -void evaluateMissingDefaultsUnsafe(Block & block, - const NamesAndTypesList & required_columns, - const std::unordered_map & column_defaults, - const Context & context); + const Context & context, bool with_block_copy = true); }