Skip to main content

clickhouse 400 error

· 2 min read

背景

线上环境请求clickhouse 400 bad request

问题排查

线上clickhouse导出的是http端口

线上java client抛出400异常:

	ru.yandex.clickhouse.except.ClickHouseException: ClickHouse exception, code: 400, host: internal-LB-clickhouse-write-intranet-429192233.us-west-2.elb.amazonaws.com, port: 8123; HTTP/1.1 400 Bad Request
at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:60)
at ru.yandex.clickhouse.except.ClickHouseExceptionSpecifier.specify(ClickHouseExceptionSpecifier.java:26)
at ru.yandex.clickhouse.ClickHouseStatementImpl.checkForErrorAndThrow(ClickHouseStatementImpl.java:1080)
at ru.yandex.clickhouse.ClickHouseStatementImpl.getInputStream(ClickHouseStatementImpl.java:770)
at ru.yandex.clickhouse.ClickHouseStatementImpl.getLastInputStream(ClickHouseStatementImpl.java:693)
Caused by: java.lang.IllegalStateException: HTTP/1.1 400 Bad Request
at ru.yandex.clickhouse.ClickHouseStatementImpl.checkForErrorAndThrow(ClickHouseStatementImpl.java:1080)
at ru.yandex.clickhouse.ClickHouseStatementImpl.getInputStream(ClickHouseStatementImpl.java:770)
at ru.yandex.clickhouse.ClickHouseStatementImpl.getLastInputStream(ClickHouseStatementImpl.java:693)
at ru.yandex.clickhouse.ClickHouseStatementImpl.executeQuery(ClickHouseStatementImpl.java:341)
at ru.yandex.clickhouse.ClickHouseStatementImpl.executeQuery(ClickHouseStatementImpl.java:326)

打开clickhouse日志,发现有以下报错:

2023.01.12 09:24:26.187479 [ 205027 ] {65179d49-ea6e-4a15-b13b-16d8378cfe29} <Error> executeQuery: Code: 62, e.displayText() = DB::Exception: Syntax error: failed at position 72 ('Client'): Client as DEFAULT_VALUE, Application name as DESCRIPTION union all select CustomHttpHeaders as NAME, toInt32(0) as MAX_LEN,  as DEFAULT_VALUE, Custom HTTP heade. Expected one of: UNION, LIMIT, WHERE, WINDOW, end of query, HAVING, GROUP BY, INTO OUTFILE, OFFSET, PREWHERE, Comma, ORDER BY, SETTINGS, FROM, FORMAT, WITH, token (version 21.3.3.14 (official build)) (from 172.31.42.57:23878) (in query: select ApplicationName as NAME, toInt32(0) as MAX_LEN, ClickHouse Java Client as DEFAULT_VALUE, Application name as DESCRIPTION union all select CustomHttpHeaders as NAME, toInt32(0) as MAX_LEN, as DEFAULT_VALUE, Custom HTTP headers as DESCRIPTION union all select CustomHttpParameters as NAME, toInt32(0) as MAX_LEN, as DEFAULT_VALUE, Customer HTTP query parameters as DESCRIPTION), Stack trace (when copying this message, always include the lines below):

最后在github上找到相关issue: https://github.com/dbeaver/dbeaver/issues/16885 https://github.com/ClickHouse/clickhouse-jdbc/pull/930

发现是clickhouse的jdbc 包的sql错了

ClickHouse Java Client as DEFAULT_VALUE 应该改为 'ClickHouse Java Client' as DEFAULT_VALUE

我们用的jdbc包是0.3.2

            <dependency>
<groupId>ru.yandex.clickhouse</groupId>
<artifactId>clickhouse-jdbc</artifactId>
<version>0.3.2</version>
</dependency>

将clickhouse jdbc 包改成0.3.2-patch-1 即可. 其实可以用更加新的包,自己选择吧.