mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-29 13:10:48 +00:00
clearer evaluateMissingDefaults [CLICKHOUSE-3578]
This commit is contained in:
parent
13646eb4c4
commit
c642e16ee1
@ -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;
|
||||
|
||||
|
@ -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>;
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user