未验证 提交 08cc351d 编写于 作者: A Alexander Kuzmenkov 提交者: GitHub

Merge pull request #19716 from ClickHouse/backport/20.12/18446

Backport #18446 to 20.12: Fix constant folding when the result is unknown
......@@ -1363,7 +1363,7 @@ Code: 395. DB::Exception: Received from localhost:9000. DB::Exception: Too many.
## identity {#identity}
Returns the same value that was used as its argument. Used for debugging and testing, allows to cancel using index, and get the query performance of a full scan. When query is analyzed for possible use of index, the analyzer doesn’t look inside `identity` functions.
Returns the same value that was used as its argument. Used for debugging and testing, allows to cancel using index, and get the query performance of a full scan. When query is analyzed for possible use of index, the analyzer doesn’t look inside `identity` functions. Also constant folding is not applied too.
**Syntax**
......
......@@ -16,15 +16,9 @@ public:
return std::make_shared<FunctionIdentity>();
}
String getName() const override
{
return name;
}
size_t getNumberOfArguments() const override
{
return 1;
}
String getName() const override { return name; }
size_t getNumberOfArguments() const override { return 1; }
bool isSuitableForConstantFolding() const override { return false; }
DataTypePtr getReturnTypeImpl(const DataTypes & arguments) const override
{
......
......@@ -167,6 +167,16 @@ void ExecuteScalarSubqueriesMatcher::visit(const ASTSubquery & subquery, ASTPtr
lit->alias = subquery.alias;
lit->prefer_alias_to_column_name = subquery.prefer_alias_to_column_name;
ast = addTypeConversionToAST(std::move(lit), scalar.safeGetByPosition(0).type->getName());
/// If only analyze was requested the expression is not suitable for constant folding, disable it.
if (data.only_analyze)
{
ast->as<ASTFunction>()->alias.clear();
auto func = makeASTFunction("identity", std::move(ast));
func->alias = subquery.alias;
func->prefer_alias_to_column_name = subquery.prefer_alias_to_column_name;
ast = std::move(func);
}
}
else
{
......
......@@ -114,8 +114,9 @@ FROM
(
SELECT
1 AS id,
CAST(1, \'UInt8\') AS subquery
identity(CAST(1, \'UInt8\')) AS subquery
)
WHERE subquery = 1
1 1
SELECT
a,
......
DROP TABLE IF EXISTS dest_table_mv;
DROP TABLE IF EXISTS left_table;
DROP TABLE IF EXISTS right_table;
DROP TABLE IF EXISTS dest_table;
DROP TABLE IF EXISTS src_table;
DROP VIEW IF EXISTS dst_mv;
create table src_table Engine=Memory as system.numbers;
CREATE MATERIALIZED VIEW dst_mv Engine=Memory as select *, (SELECT count() FROM src_table) AS cnt FROM src_table;
......
1,10
1,10
SELECT
identity(CAST(0, \'UInt64\')) AS n,
toUInt64(10 / n)
-- { echo }
SELECT * FROM (SELECT (SELECT * FROM system.numbers LIMIT 1 OFFSET 1) AS n, toUInt64(10 / n)) FORMAT CSV;
SELECT (SELECT * FROM system.numbers LIMIT 1 OFFSET 1) AS n, toUInt64(10 / n) FORMAT CSV;
EXPLAIN SYNTAX SELECT (SELECT * FROM system.numbers LIMIT 1 OFFSET 1) AS n, toUInt64(10 / n);
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册