Skip to content

Failed to parse 'CASE WHEN' condition expression without brackets #723

@chenyele

Description

@chenyele

I had the following SQL statment:

SELECT
    CASE
        WHEN "metrics_all"."METRIC_ID" IS NULL OR "metrics_all"."SUB_METRIC" IS NULL THEN NULL
        WHEN "metrics_all"."METRIC_ID" > "metrics_all"."SUB_METRIC" THEN "metrics_all"."METRIC_ID"
        ELSE "metrics_all"."SUB_METRIC"
    END AS "MET"
FROM
    "mrs"."metrics_all" AS "metrics_all"
GROUP BY
    CASE
        WHEN "metrics_all"."METRIC_ID" IS NULL
        OR "metrics_all"."SUB_METRIC" IS NULL THEN NULL
        WHEN "metrics_all"."METRIC_ID" > "metrics_all"."SUB_METRIC" THEN "metrics_all"."METRIC_ID"
        ELSE "metrics_all"."SUB_METRIC"
    END

This SQL statment could be excuted by Command-line Client and clickhouse-jdbc-0.2.4:
image
But could not be exceuted by clickhouse-jdbc-0.3.1,because the SQL parse is mandatory ,and got the following error:
2021-09-15 19:58:44,058 | WARN | main | Parse error at line 3, column 48. Encountered: OR. If you believe the SQL is valid, please feel free to open an issue on Github with this warning and the following SQL attached.
SELECT
CASE
WHEN "metrics_all"."METRIC_ID" IS NULL OR "metrics_all"."SUB_METRIC" IS NULL THEN NULL
WHEN "metrics_all"."METRIC_ID" > "metrics_all"."SUB_METRIC" THEN "metrics_all"."METRIC_ID"
ELSE "metrics_all"."SUB_METRIC"
END AS "TEMP(Test)(2280873464)(0)"
FROM
"mrs"."metrics_all" AS "metrics_all"
GROUP BY
CASE
WHEN "metrics_all"."METRIC_ID" IS NULL
OR "metrics_all"."SUB_METRIC" IS NULL THEN NULL
WHEN "metrics_all"."METRIC_ID" > "metrics_all"."SUB_METRIC" THEN "metrics_all"."METRIC_ID"
ELSE "metrics_all"."SUB_METRIC"
END | ru.yandex.clickhouse.jdbc.parser.ClickHouseSqlParser.parse(ClickHouseSqlParser.java:71)

It seemed that the parser can not resolve 'OR' between 'When' and 'Then', so I had to add brackets like this to make it work:

SELECT
    CASE
        WHEN ("metrics_all"."METRIC_ID" IS NULL OR "metrics_all"."SUB_METRIC") IS NULL THEN NULL
        WHEN "metrics_all"."METRIC_ID" > "metrics_all"."SUB_METRIC" THEN "metrics_all"."METRIC_ID"
        ELSE "metrics_all"."SUB_METRIC"
    END AS "MET"
FROM
    "mrs"."metrics_all" AS "metrics_all"
GROUP BY
    CASE
        WHEN "metrics_all"."METRIC_ID" IS NULL
        OR "metrics_all"."SUB_METRIC" IS NULL THEN NULL
        WHEN "metrics_all"."METRIC_ID" > "metrics_all"."SUB_METRIC" THEN "metrics_all"."METRIC_ID"
        ELSE "metrics_all"."SUB_METRIC"
    END

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions