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);
}
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;

View File

@ -19,7 +19,6 @@ class IBlockInputStream;
using BlockInputStreamPtr = std::shared_ptr<IBlockInputStream>;
using BlockInputStreams = std::vector<BlockInputStreamPtr>;
class BlockMissingValues;
class 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));
}
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<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,
const NamesAndTypesList & required_columns,
const std::unordered_map<std::string, ColumnDefault> & column_defaults,
const Context & context);
void evaluateMissingDefaultsUnsafe(Block & block,
const NamesAndTypesList & required_columns,
const std::unordered_map<std::string, ColumnDefault> & column_defaults,
const Context & context);
const Context & context, bool with_block_copy = true);
}