mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-09-29 21:20:49 +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);
|
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;
|
||||||
|
|
||||||
|
@ -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>;
|
||||||
|
@ -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);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -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);
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user