ClickHouse / ClickHouse/clickhouse-java

client-v2 0.10.0: getTableSchema fails on ClickHouse 26.8 with "Failed to parse column `null` defined by type 'null'" (works on 26.7)

オープン
#3,094 コメント 3 件 リアクション 0 件 担当者 0 名 GitHub で見る
bug client-api-v2 jdbc-v2
主要言語
Java
スター
1.6k
フォーク
636
平均マージ
2日 23時間
マージ済み PR(30日)
29

説明

### Describe the bug

`Client.getTableSchema(...)` and `Client.getTableSchemaFromQuery(...)` fail against ClickHouse **26.8** with `Failed to parse column \`null\` defined by type 'null'`. The same code against **26.7** works. It reproduces on a two-column table, so it is not schema-specific.

The server appears to be fine: a raw `DESCRIBE TABLE` issued through the *same client on the same connection* returns every row correctly, and the server's `DESCRIBE ... FORMAT TSKV` bytes are identical between 26.7 and 26.8.

### Steps to reproduce

```java
try (Client client = new Client.Builder()
.addEndpoint(endpoint)
.setUsername("u").setPassword("p").setDefaultDatabase("d")
.compressClientRequest(false).compressServerResponse(true)
.build()) {
client.execute("CREATE TABLE tiny (a UInt8, b String) ENGINE=MergeTree ORDER BY a").get();
client.getTableSchema("tiny"); // OK on 26.7, throws on 26.8
}
```

Result:

```
26.7 tiny OK, columns=2
26.8 tiny FAILED ClientException: Failed to get table schema
root IllegalArgumentException: Non-null columnName and columnType are required
```

### Expected behaviour

`getTableSchema` returns the table's columns, as it does on 26.7.

### Error log

```
com.clickhouse.client.api.ClientException: Failed to get table schema
at com.clickhouse.client.api.Client.getTableSchemaImpl(Client.java:2044)
at com.clickhouse.client.api.Client.getTableSchema(Client.java:2011)
Caused by: com.clickhouse.client.api.ClientException: Failed to parse column `null` defined by type 'null'
at com.clickhouse.client.api.internal.TableSchemaParser.readTSKV(TableSchemaParser.java:33)
at com.clickhouse.client.api.Client.getTableSchemaImpl(Client.java:2036)
Caused by: java.lang.IllegalArgumentException: Non-null columnName and columnType are required
at com.clickhouse.data.ClickHouseColumn.of(ClickHouseColumn.java:676)
```

### Configuration

- **client-v2**: 0.10.0
- **Server**: `clickhouse/clickhouse-server:26.8` (fails) vs `:26.7` (works), official images, default configuration apart from `CLICKHOUSE_DB/USER/PASSWORD`
- **JDK**: 25
- **OS**: Linux container / macOS host

### What I ruled out

Each of these was compared 26.7 against 26.8 directly:

- **The `DESCRIBE` response format.** `DESCRIBE TABLE t FORMAT TSKV` over HTTP is byte-identical on both versions, on a trivial table and on a 56-column one with `Enum8`, `Nullable`, `IPv6`, `LowCardinality` and `DateTime64`. Every line carries a well-formed `name=…\ttype=…`.
- **Response compression.** The LZ4 bodies are identical byte-for-byte, and the failure also occurs with `compressServerResponse(false)`.
- **`describe_include_subcolumns`.** Identical output on both.
- **`default_format` overriding the inline `FORMAT` clause.** Sending `default_format=RowBinaryWithNamesAndTypes` alongside `... FORMAT TSKV` still returns TSKV on both versions.
- **Whether the server or connection is unhealthy.** A raw `DESCRIBE TABLE t` through the same client, on the same connection, immediately before the failing call, returns all rows with correct names and types.

Given `readTSKV` parses each line with `java.util.Properties` and requires `name` and `type` keys, it looks like the response reaching the parser on 26.8 is not the TSKV the server produces for an equivalent request — but I was not able to identify what the client sends differently, and I did not capture the client's own request/response bytes.

I am happy to run further probes against either version if that would help narrow it.

コントリビューションガイド

コントリビューションガイドを開く

調査の方向性

Reproduce the failure against ClickHouse 26.7 and 26.8 using Client.getTableSchema and the two-column example. Read Client.getTableSchemaImpl and internal/TableSchemaParser.java, then inspect the client request and response reaching readTSKV; done means both schema methods return the table's columns on 26.8 without the null-column error.

索引モデルが issue の本文から書いたものです。

評価

技術スタック
java
領域
databases
issue の種類
バグ
難易度
4/5
見積もり時間
3〜5日
活発さ
活発
明瞭さ
おおむね明確
初心者へのやさしさ
52/100

新しい issue をメールで受け取る

初心者向けの GitHub issue を短くまとめたダイジェスト。