clearer evaluateMissingDefaults [CLICKHOUSE-3578]

This commit is contained in:
chertus 2018-11-15 19:57:20 +03:00
parent 13646eb4c4
commit c642e16ee1
4 changed files with 14 additions and 38 deletions

View File

@ -49,7 +49,7 @@ Block AddingDefaultsBlockInputStream::readImpl()
evaluate_block.erase(column.first); 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<size_t, MutableColumnPtr> mixed_columns; std::unordered_map<size_t, MutableColumnPtr> mixed_columns;

View File

@ -19,7 +19,6 @@ class IBlockInputStream;
using BlockInputStreamPtr = std::shared_ptr<IBlockInputStream>; using BlockInputStreamPtr = std::shared_ptr<IBlockInputStream>;
using BlockInputStreams = std::vector<BlockInputStreamPtr>; using BlockInputStreams = std::vector<BlockInputStreamPtr>;
class BlockMissingValues;
class TableStructureReadLock; class TableStructureReadLock;
using TableStructureReadLockPtr = std::shared_ptr<TableStructureReadLock>; using TableStructureReadLockPtr = std::shared_ptr<TableStructureReadLock>;

View File

@ -29,33 +29,36 @@ static ASTPtr requiredExpressions(Block & block, const NamesAndTypesList & requi
setAlias(it->second.expression->clone(), it->first)); setAlias(it->second.expression->clone(), it->first));
} }
if (default_expr_list->children.empty())
return nullptr;
return default_expr_list; return default_expr_list;
} }
void evaluateMissingDefaults(Block & block, void evaluateMissingDefaults(Block & block,
const NamesAndTypesList & required_columns, const NamesAndTypesList & required_columns,
const ColumnDefaults & column_defaults, const ColumnDefaults & column_defaults,
const Context & context) const Context & context, bool with_block_copy)
{ {
if (column_defaults.empty()) if (column_defaults.empty())
return; return;
ASTPtr default_expr_list = requiredExpressions(block, required_columns, column_defaults); ASTPtr default_expr_list = requiredExpressions(block, required_columns, column_defaults);
/// nothing to evaluate if (!default_expr_list)
if (default_expr_list->children.empty())
return; 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 /** ExpressionAnalyzer eliminates "unused" columns, in order to ensure their safety
* we are going to operate on a copy instead of the original block */ * we are going to operate on a copy instead of the original block */
Block copy_block{block}; Block copy_block{block};
/// evaluate default values for defaulted columns /// evaluate default values for defaulted columns
NamesAndTypesList available_columns; auto syntax_result = SyntaxAnalyzer(context, {}).analyze(default_expr_list, block.getNamesAndTypesList());
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(copy_block); 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 /// 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<std::string, ColumnDefault> & 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);
}
} }

View File

@ -15,11 +15,6 @@ struct ColumnDefault;
void evaluateMissingDefaults(Block & block, void evaluateMissingDefaults(Block & block,
const NamesAndTypesList & required_columns, const NamesAndTypesList & required_columns,
const std::unordered_map<std::string, ColumnDefault> & column_defaults, const std::unordered_map<std::string, ColumnDefault> & column_defaults,
const Context & context); const Context & context, bool with_block_copy = true);
void evaluateMissingDefaultsUnsafe(Block & block,
const NamesAndTypesList & required_columns,
const std::unordered_map<std::string, ColumnDefault> & column_defaults,
const Context & context);
} }