Check where and prewhere identifiers exist.

This commit is contained in:
Nikolai Kochetov 2021-01-28 12:40:08 +03:00
parent 3296ad29e2
commit e2ade3c574

View File

@ -844,7 +844,12 @@ ActionsDAGPtr SelectQueryExpressionAnalyzer::appendPrewhere(
step.required_output.push_back(prewhere_column_name); step.required_output.push_back(prewhere_column_name);
step.can_remove_required_output.push_back(true); step.can_remove_required_output.push_back(true);
auto filter_type = (*step.actions()->getIndex().find(prewhere_column_name))->result_type; const auto & index = step.actions()->getIndex();
auto it = index.find(prewhere_column_name);
if (it == index.end())
throw Exception(ErrorCodes::UNKNOWN_IDENTIFIER, "Unknown identifier: '{}'", prewhere_column_name);
auto filter_type = (*it)->result_type;
if (!filter_type->canBeUsedInBooleanContext()) if (!filter_type->canBeUsedInBooleanContext())
throw Exception("Invalid type for filter in PREWHERE: " + filter_type->getName(), throw Exception("Invalid type for filter in PREWHERE: " + filter_type->getName(),
ErrorCodes::ILLEGAL_TYPE_OF_COLUMN_FOR_FILTER); ErrorCodes::ILLEGAL_TYPE_OF_COLUMN_FOR_FILTER);
@ -944,7 +949,12 @@ bool SelectQueryExpressionAnalyzer::appendWhere(ExpressionActionsChain & chain,
step.required_output.push_back(where_column_name); step.required_output.push_back(where_column_name);
step.can_remove_required_output = {true}; step.can_remove_required_output = {true};
auto filter_type = (*step.actions()->getIndex().find(where_column_name))->result_type; const auto & index = step.actions()->getIndex();
auto it = index.find(where_column_name);
if (it == index.end())
throw Exception(ErrorCodes::UNKNOWN_IDENTIFIER, "Unknown identifier: '{}'", where_column_name);
auto filter_type = (*it)->result_type;
if (!filter_type->canBeUsedInBooleanContext()) if (!filter_type->canBeUsedInBooleanContext())
throw Exception("Invalid type for filter in WHERE: " + filter_type->getName(), throw Exception("Invalid type for filter in WHERE: " + filter_type->getName(),
ErrorCodes::ILLEGAL_TYPE_OF_COLUMN_FOR_FILTER); ErrorCodes::ILLEGAL_TYPE_OF_COLUMN_FOR_FILTER);