ClickHouse / ClickHouse/clickhouse-java

jdbc-v2: Issue with parameter data type

Open
#2,674 1 comment 0 reactions 0 assignees View on GitHub
area:data-type bug jdbc-v2
Dominant language
Java
Stars
1.6k
Forks
637
Avg merge
2d 23h
Merged PRs (30d)
29

Description

## Description

When running a prepared statement with `COALESCE` and a date, the execution fails due to type.

Am not entirely sure whether it's an issue with the JDBC driver (which serializes the date as a String in `PreparedStatementImpl#encodeObject` - nothing wrong with that) or the server (which should deserialize it with the proper type, or `COALESCE` which should handle types better - see https://github.com/ClickHouse/ClickHouse/issues/57292 , although most other databases handle this use case).

### Steps to reproduce

See the code below.

### Error Log or Exception StackTrace

```
Caused by: com.clickhouse.client.api.ServerException: Code: 386. DB::Exception: There is no supertype for types Date32, String because some of them are String/FixedString/Enum and some of them are not: In scope SELECT COALESCE(date, '2025-12-31') FROM test_local_date. (NO_COMMON_TYPE) (version 25.8.7.3 (official build))
at com.clickhouse.client.api.internal.HttpAPIClientHelper.readError(HttpAPIClientHelper.java:403)

```

### Expected Behaviour

The query should return without error.

### Code Example

```java
@Test
void required_testJdbcWithLocalDate() throws Exception {
final String url = "jdbc:ch://localhost:" + SERVER.getFirstMappedPort();

final Properties info = new Properties();
info.put("user", SERVER.getClickhouseUser());
info.put("password", SERVER.getClickhousePassword());

try (final Connection conn = DriverManager.getConnection(url, info)) {
conn.prepareStatement("CREATE TABLE test_local_date"
+ " (id Int64, date Nullable(Date32)) ENGINE = MergeTree() ORDER BY id").execute();
conn.prepareStatement("INSERT INTO test_local_date VALUES (1, null)").execute();
try (final PreparedStatement preparedStatement = conn.prepareStatement("SELECT COALESCE(date, ?) FROM test_local_date")) {
preparedStatement.setObject(1, LocalDate.of(2025, 12, 31));
preparedStatement.executeQuery();
}
}
}

```

### Configuration

#### Client Configuration

#### Environment
* [ ] Cloud
* Client version: clickhouse-jdbc 0.9.4
* Language version:
* OS:

#### ClickHouse Server
* ClickHouse Server version: 25.8.7.3

Contributor guide

Open the contributing guide

Research direction

Start with the provided JDBC reproduction and inspect PreparedStatementImpl#encodeObject, which the report identifies as the date serialization point. Run the query against the stated ClickHouse Server version and determine whether the failure belongs to parameter encoding, server deserialization, or COALESCE type handling; done means the query returns without error.

Written by the indexing model from the issue text.

Assessment

Tech stack
java
Domain
databases
Issue type
Bug
Difficulty
4/5
Estimated time
3-5 days
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
38/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.