2025-02-13 06:15:54 +01:00
|
|
|
from tests.dialects.test_dialect import Validator
|
|
|
|
|
|
|
|
|
|
|
|
class TestClickhouse(Validator):
|
|
|
|
dialect = "clickhouse"
|
|
|
|
|
|
|
|
def test_clickhouse(self):
|
|
|
|
self.validate_identity("dictGet(x, 'y')")
|
|
|
|
self.validate_identity("SELECT * FROM x FINAL")
|
|
|
|
self.validate_identity("SELECT * FROM x AS y FINAL")
|
2025-02-13 14:45:11 +01:00
|
|
|
self.validate_identity("'a' IN mapKeys(map('a', 1, 'b', 2))")
|
|
|
|
self.validate_identity("CAST((1, 2) AS Tuple(a Int8, b Int16))")
|
2025-02-13 14:56:25 +01:00
|
|
|
self.validate_identity("SELECT * FROM foo LEFT ANY JOIN bla")
|
|
|
|
self.validate_identity("SELECT * FROM foo LEFT ASOF JOIN bla")
|
|
|
|
self.validate_identity("SELECT * FROM foo ASOF JOIN bla")
|
|
|
|
self.validate_identity("SELECT * FROM foo ANY JOIN bla")
|
2025-02-13 15:03:38 +01:00
|
|
|
self.validate_identity("SELECT quantile(0.5)(a)")
|
|
|
|
self.validate_identity("SELECT quantiles(0.5)(a) AS x FROM t")
|
|
|
|
self.validate_identity("SELECT * FROM foo WHERE x GLOBAL IN (SELECT * FROM bar)")
|
2025-02-13 15:07:05 +01:00
|
|
|
self.validate_identity("position(haystack, needle)")
|
|
|
|
self.validate_identity("position(haystack, needle, position)")
|
2025-02-13 06:15:54 +01:00
|
|
|
|
|
|
|
self.validate_all(
|
|
|
|
"SELECT fname, lname, age FROM person ORDER BY age DESC NULLS FIRST, fname ASC NULLS LAST, lname",
|
|
|
|
write={
|
|
|
|
"clickhouse": "SELECT fname, lname, age FROM person ORDER BY age DESC NULLS FIRST, fname, lname",
|
|
|
|
"spark": "SELECT fname, lname, age FROM person ORDER BY age DESC NULLS FIRST, fname NULLS LAST, lname NULLS LAST",
|
|
|
|
},
|
|
|
|
)
|
|
|
|
self.validate_all(
|
|
|
|
"CAST(1 AS NULLABLE(Int64))",
|
|
|
|
write={
|
2025-02-13 14:45:11 +01:00
|
|
|
"clickhouse": "CAST(1 AS Nullable(Int64))",
|
|
|
|
},
|
|
|
|
)
|
|
|
|
self.validate_all(
|
|
|
|
"CAST(1 AS Nullable(DateTime64(6, 'UTC')))",
|
|
|
|
write={
|
|
|
|
"clickhouse": "CAST(1 AS Nullable(DateTime64(6, 'UTC')))",
|
2025-02-13 06:15:54 +01:00
|
|
|
},
|
|
|
|
)
|
2025-02-13 14:53:05 +01:00
|
|
|
self.validate_all(
|
|
|
|
"SELECT x #! comment",
|
|
|
|
write={"": "SELECT x /* comment */"},
|
|
|
|
)
|
2025-02-13 15:03:38 +01:00
|
|
|
self.validate_all(
|
|
|
|
"SELECT quantileIf(0.5)(a, true)",
|
|
|
|
write={
|
|
|
|
"clickhouse": "SELECT quantileIf(0.5)(a, TRUE)",
|
|
|
|
},
|
|
|
|
)
|
2025-02-13 15:07:05 +01:00
|
|
|
self.validate_all(
|
|
|
|
"SELECT position(needle IN haystack)",
|
|
|
|
write={"clickhouse": "SELECT position(haystack, needle)"},
|
|
|
|
)
|
2025-02-13 15:05:06 +01:00
|
|
|
|
|
|
|
def test_cte(self):
|
|
|
|
self.validate_identity("WITH 'x' AS foo SELECT foo")
|
|
|
|
self.validate_identity("WITH SUM(bytes) AS foo SELECT foo FROM system.parts")
|
|
|
|
self.validate_identity("WITH (SELECT foo) AS bar SELECT bar + 5")
|
|
|
|
self.validate_identity("WITH test1 AS (SELECT i + 1, j + 1 FROM test1) SELECT * FROM test1")
|