mirror of
https://github.com/ClickHouse/ClickHouse.git
synced 2024-11-25 09:02:00 +00:00
fix a problem in ArithmeticOperationsInAgrFuncOptimize
This commit is contained in:
parent
6a5a539e98
commit
5e0095c70b
@ -7,6 +7,8 @@
|
|||||||
#include <Parsers/ASTTablesInSelectQuery.h>
|
#include <Parsers/ASTTablesInSelectQuery.h>
|
||||||
#include <Interpreters/ArithmeticOperationsInAgrFuncOptimize.h>
|
#include <Interpreters/ArithmeticOperationsInAgrFuncOptimize.h>
|
||||||
|
|
||||||
|
#include <Poco/String.h>
|
||||||
|
|
||||||
namespace DB
|
namespace DB
|
||||||
{
|
{
|
||||||
|
|
||||||
@ -95,9 +97,12 @@ ASTPtr tryExchangeFunctions(const ASTFunction & func)
|
|||||||
{"max", {"multiply", "divide", "plus", "minus"}},
|
{"max", {"multiply", "divide", "plus", "minus"}},
|
||||||
{"avg", {"multiply", "divide", "plus", "minus"}}};
|
{"avg", {"multiply", "divide", "plus", "minus"}}};
|
||||||
|
|
||||||
|
/// Aggregate functions[sum|min|max|avg] is case-insensitive, so we use lower cases name
|
||||||
|
auto lower_name = Poco::toLower(func.name);
|
||||||
|
|
||||||
const ASTFunction * child_func = getInternalFunction(func);
|
const ASTFunction * child_func = getInternalFunction(func);
|
||||||
if (!child_func || !child_func->arguments || child_func->arguments->children.size() != 2 ||
|
if (!child_func || !child_func->arguments || child_func->arguments->children.size() != 2 || !supported.count(lower_name)
|
||||||
!supported.count(func.name) || !supported.find(func.name)->second.count(child_func->name))
|
|| !supported.find(lower_name)->second.count(child_func->name))
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
/// Cannot rewrite function with alias cause alias could become undefined
|
/// Cannot rewrite function with alias cause alias could become undefined
|
||||||
@ -116,12 +121,12 @@ ASTPtr tryExchangeFunctions(const ASTFunction & func)
|
|||||||
if (child_func->name == "divide")
|
if (child_func->name == "divide")
|
||||||
return {};
|
return {};
|
||||||
|
|
||||||
const String & new_name = changeNameIfNeeded(func.name, child_func->name, *first_literal);
|
const String & new_name = changeNameIfNeeded(lower_name, child_func->name, *first_literal);
|
||||||
optimized_ast = exchangeExtractFirstArgument(new_name, *child_func);
|
optimized_ast = exchangeExtractFirstArgument(new_name, *child_func);
|
||||||
}
|
}
|
||||||
else if (second_literal) /// second or both are consts
|
else if (second_literal) /// second or both are consts
|
||||||
{
|
{
|
||||||
const String & new_name = changeNameIfNeeded(func.name, child_func->name, *second_literal);
|
const String & new_name = changeNameIfNeeded(lower_name, child_func->name, *second_literal);
|
||||||
optimized_ast = exchangeExtractSecondArgument(new_name, *child_func);
|
optimized_ast = exchangeExtractSecondArgument(new_name, *child_func);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,6 @@
|
|||||||
|
22.5
|
||||||
|
SELECT sum(number) / 2
|
||||||
|
FROM numbers(10)
|
||||||
|
22.5
|
||||||
|
SELECT sum(number) / 2
|
||||||
|
FROM numbers(10)
|
@ -0,0 +1,6 @@
|
|||||||
|
SELECT sum(number / 2) FROM numbers(10);
|
||||||
|
EXPLAIN SYNTAX SELECT sum(number / 2) FROM numbers(10);
|
||||||
|
|
||||||
|
|
||||||
|
SELECT Sum(number / 2) FROM numbers(10);
|
||||||
|
EXPLAIN SYNTAX SELECT Sum(number / 2) FROM numbers(10);
|
Loading…
Reference in New Issue
Block a user