ClickHouse / ClickHouse/ClickHouse

Apply `optimize_functions_to_subcolumns` to subcolumns

Open
#66,246 1 comment 0 reactions 0 assignees View on GitHub
comp-query-analyzer feature performance
Dominant language
C++
Stars
49.9k
Forks
9k
Avg merge
20h 33m
Merged PRs (30d)
501

Description

**Use case**

Some cases are not optimized now but they are suitable for optimization:

```sql
CREATE TABLE test1
(
`t` Tuple(a Nullable(String), arr Array(UInt32)),
`m` Map(String, String)
)
ENGINE = Memory;

INSERT INTO test1 VALUES (('a', [1, 2]), map('a', 'b', 'c', 'd'));

EXPLAIN QUERY TREE dump_ast = 1, dump_tree = 0 SELECT isNull(t.a) FROM test1;

┌─explain────────────────────────────────────────┐
1. │ SELECT __table1.`t.a` IS NULL AS `isNull(t.a)` │
2. │ FROM default.test1 AS __table1 │
└────────────────────────────────────────────────┘

EXPLAIN QUERY TREE dump_ast = 1, dump_tree = 0 SELECT length(t.arr) FROM test1;

┌─explain────────────────────────────────────────────┐
1. │ SELECT length(__table1.`t.arr`) AS `length(t.arr)` │
2. │ FROM default.test1 AS __table1 │
└────────────────────────────────────────────────────┘

EXPLAIN QUERY TREE dump_ast = 1, dump_tree = 0 SELECT length(m.keys) FROM test1;

┌─explain──────────────────────────────────────────────┐
1. │ SELECT length(__table1.`m.keys`) AS `length(m.keys)` │
2. │ FROM default.test1 AS __table1 │
└──────────────────────────────────────────────────────┘

EXPLAIN QUERY TREE dump_ast = 1, dump_tree = 0 SELECT length(mapKeys(m)) FROM test1;

┌─explain──────────────────────────────────────────────────┐
1. │ SELECT length(__table1.`m.keys`) AS `length(mapKeys(m))` │
2. │ FROM default.test1 AS __table1 │
└──────────────────────────────────────────────────────────┘
```

**Describe the solution you'd like**

Optimize these (and similar) cases to the following queries:
```sql
SELECT t.a.null FROM test1; -- SELECT isNull(t.a) FROM test1;

┌─t.a.null─┐
1. │ 0 │
└──────────┘

SELECT t.arr.size0 FROM test1; -- SELECT length(t.arr) FROM test1;

┌─t.arr.size0─┐
1. │ 2 │
└─────────────┘

SELECT m.size0 FROM test1; -- SELECT length(m.keys) FROM test1 or SELECT length(mapKeys(m)) FROM test1

┌─m.size0─┐
1. │ 2 │
└─────────┘
```

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.