dbms: passing proper Context to subqueries analyzer in PREWHERE [#METR-17231].

This commit is contained in:
Alexey Milovidov 2015-07-15 07:50:48 +03:00
parent 6815bd7c00
commit 1f03f17a49
2 changed files with 12 additions and 9 deletions

View File

@ -69,10 +69,11 @@ private:
ExpressionActionsPtr prewhere_actions, ExpressionActionsPtr prewhere_actions,
const String & prewhere_column, const String & prewhere_column,
const Names & virt_columns, const Names & virt_columns,
const Settings & settings); const Settings & settings,
const Context & context);
/// Создать выражение "Sign == 1". /// Создать выражение "Sign == 1".
void createPositiveSignCondition(ExpressionActionsPtr & out_expression, String & out_column); void createPositiveSignCondition(ExpressionActionsPtr & out_expression, String & out_column, const Context & context);
MarkRanges markRangesFromPkRange(const MergeTreeData::DataPart::Index & index, PKCondition & key_condition, const Settings & settings); MarkRanges markRangesFromPkRange(const MergeTreeData::DataPart::Index & index, PKCondition & key_condition, const Settings & settings);
}; };

View File

@ -230,7 +230,7 @@ BlockInputStreams MergeTreeDataSelectExecutor::read(
filter_function = upper_filter_function; filter_function = upper_filter_function;
} }
filter_expression = ExpressionAnalyzer(filter_function, data.context, nullptr, data.getColumnsList()).getActions(false); filter_expression = ExpressionAnalyzer(filter_function, context, nullptr, data.getColumnsList()).getActions(false);
/// Добавим столбцы, нужные для sampling_expression. /// Добавим столбцы, нужные для sampling_expression.
std::vector<String> add_columns = filter_expression->getRequiredColumns(); std::vector<String> add_columns = filter_expression->getRequiredColumns();
@ -247,7 +247,7 @@ BlockInputStreams MergeTreeDataSelectExecutor::read(
String prewhere_column; String prewhere_column;
if (select.prewhere_expression) if (select.prewhere_expression)
{ {
ExpressionAnalyzer analyzer(select.prewhere_expression, data.context, nullptr, data.getColumnsList()); ExpressionAnalyzer analyzer(select.prewhere_expression, context, nullptr, data.getColumnsList());
prewhere_actions = analyzer.getActions(false); prewhere_actions = analyzer.getActions(false);
prewhere_column = select.prewhere_expression->getColumnName(); prewhere_column = select.prewhere_expression->getColumnName();
SubqueriesForSets prewhere_subqueries = analyzer.getSubqueriesForSets(); SubqueriesForSets prewhere_subqueries = analyzer.getSubqueriesForSets();
@ -310,7 +310,8 @@ BlockInputStreams MergeTreeDataSelectExecutor::read(
prewhere_actions, prewhere_actions,
prewhere_column, prewhere_column,
virt_column_names, virt_column_names,
settings); settings,
context);
} }
else else
{ {
@ -467,7 +468,8 @@ BlockInputStreams MergeTreeDataSelectExecutor::spreadMarkRangesAmongThreadsFinal
ExpressionActionsPtr prewhere_actions, ExpressionActionsPtr prewhere_actions,
const String & prewhere_column, const String & prewhere_column,
const Names & virt_columns, const Names & virt_columns,
const Settings & settings) const Settings & settings,
const Context & context)
{ {
size_t max_marks_to_use_cache = (settings.merge_tree_max_rows_to_use_cache + data.index_granularity - 1) / data.index_granularity; size_t max_marks_to_use_cache = (settings.merge_tree_max_rows_to_use_cache + data.index_granularity - 1) / data.index_granularity;
@ -511,7 +513,7 @@ BlockInputStreams MergeTreeDataSelectExecutor::spreadMarkRangesAmongThreadsFinal
ExpressionActionsPtr sign_filter_expression; ExpressionActionsPtr sign_filter_expression;
String sign_filter_column; String sign_filter_column;
createPositiveSignCondition(sign_filter_expression, sign_filter_column); createPositiveSignCondition(sign_filter_expression, sign_filter_column, context);
res.push_back(new FilterBlockInputStream(new ExpressionBlockInputStream(to_merge[0], sign_filter_expression), sign_filter_column)); res.push_back(new FilterBlockInputStream(new ExpressionBlockInputStream(to_merge[0], sign_filter_expression), sign_filter_column));
} }
@ -549,7 +551,7 @@ BlockInputStreams MergeTreeDataSelectExecutor::spreadMarkRangesAmongThreadsFinal
return res; return res;
} }
void MergeTreeDataSelectExecutor::createPositiveSignCondition(ExpressionActionsPtr & out_expression, String & out_column) void MergeTreeDataSelectExecutor::createPositiveSignCondition(ExpressionActionsPtr & out_expression, String & out_column, const Context & context)
{ {
ASTFunction * function = new ASTFunction; ASTFunction * function = new ASTFunction;
ASTPtr function_ptr = function; ASTPtr function_ptr = function;
@ -576,7 +578,7 @@ void MergeTreeDataSelectExecutor::createPositiveSignCondition(ExpressionActionsP
one->type = new DataTypeInt8; one->type = new DataTypeInt8;
one->value = Field(static_cast<Int64>(1)); one->value = Field(static_cast<Int64>(1));
out_expression = ExpressionAnalyzer(function_ptr, data.context, {}, data.getColumnsList()).getActions(false); out_expression = ExpressionAnalyzer(function_ptr, context, {}, data.getColumnsList()).getActions(false);
out_column = function->getColumnName(); out_column = function->getColumnName();
} }