summaryrefslogtreecommitdiffstats
path: root/tests/dialects/test_duckdb.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/dialects/test_duckdb.py')
-rw-r--r--tests/dialects/test_duckdb.py72
1 files changed, 61 insertions, 11 deletions
diff --git a/tests/dialects/test_duckdb.py b/tests/dialects/test_duckdb.py
index 8c1b748..ce6b122 100644
--- a/tests/dialects/test_duckdb.py
+++ b/tests/dialects/test_duckdb.py
@@ -1,4 +1,4 @@
-from sqlglot import ErrorLevel, UnsupportedError, transpile
+from sqlglot import ErrorLevel, UnsupportedError, exp, parse_one, transpile
from tests.dialects.test_dialect import Validator
@@ -124,6 +124,20 @@ class TestDuckDB(Validator):
)
def test_duckdb(self):
+ # https://github.com/duckdb/duckdb/releases/tag/v0.8.0
+ self.assertEqual(
+ parse_one("a / b", read="duckdb").assert_is(exp.Div).sql(dialect="duckdb"), "a / b"
+ )
+ self.assertEqual(
+ parse_one("a // b", read="duckdb").assert_is(exp.IntDiv).sql(dialect="duckdb"), "a // b"
+ )
+
+ self.validate_identity("PIVOT Cities ON Year USING SUM(Population)")
+ self.validate_identity("PIVOT Cities ON Year USING FIRST(Population)")
+ self.validate_identity("PIVOT Cities ON Year USING SUM(Population) GROUP BY Country")
+ self.validate_identity("PIVOT Cities ON Country, Name USING SUM(Population)")
+ self.validate_identity("PIVOT Cities ON Country || '_' || Name USING SUM(Population)")
+ self.validate_identity("PIVOT Cities ON Year USING SUM(Population) GROUP BY Country, Name")
self.validate_identity("SELECT {'a': 1} AS x")
self.validate_identity("SELECT {'a': {'b': {'c': 1}}, 'd': {'e': 2}} AS x")
self.validate_identity("SELECT {'x': 1, 'y': 2, 'z': 3}")
@@ -138,9 +152,36 @@ class TestDuckDB(Validator):
self.validate_identity(
"SELECT a['x space'] FROM (SELECT {'x space': 1, 'y': 2, 'z': 3} AS a)"
)
+ self.validate_identity(
+ "PIVOT Cities ON Year IN (2000, 2010) USING SUM(Population) GROUP BY Country"
+ )
+ self.validate_identity(
+ "PIVOT Cities ON Year USING SUM(Population) AS total, MAX(Population) AS max GROUP BY Country"
+ )
+ self.validate_identity(
+ "WITH pivot_alias AS (PIVOT Cities ON Year USING SUM(Population) GROUP BY Country) SELECT * FROM pivot_alias"
+ )
+ self.validate_identity(
+ "SELECT * FROM (PIVOT Cities ON Year USING SUM(Population) GROUP BY Country) AS pivot_alias"
+ )
+ self.validate_all("FROM (FROM tbl)", write={"duckdb": "SELECT * FROM (SELECT * FROM tbl)"})
+ self.validate_all("FROM tbl", write={"duckdb": "SELECT * FROM tbl"})
self.validate_all("0b1010", write={"": "0 AS b1010"})
self.validate_all("0x1010", write={"": "0 AS x1010"})
+ self.validate_all("x ~ y", write={"duckdb": "REGEXP_MATCHES(x, y)"})
+ self.validate_all("SELECT * FROM 'x.y'", write={"duckdb": 'SELECT * FROM "x.y"'})
+ self.validate_all(
+ "PIVOT_WIDER Cities ON Year USING SUM(Population)",
+ write={"duckdb": "PIVOT Cities ON Year USING SUM(Population)"},
+ )
+ self.validate_all(
+ "WITH t AS (SELECT 1) FROM t", write={"duckdb": "WITH t AS (SELECT 1) SELECT * FROM t"}
+ )
+ self.validate_all(
+ "WITH t AS (SELECT 1) SELECT * FROM (FROM t)",
+ write={"duckdb": "WITH t AS (SELECT 1) SELECT * FROM (SELECT * FROM t)"},
+ )
self.validate_all(
"""SELECT DATEDIFF('day', t1."A", t1."B") FROM "table" AS t1""",
write={
@@ -155,8 +196,6 @@ class TestDuckDB(Validator):
"trino": "SELECT DATE_DIFF('day', CAST('2020-01-01' AS DATE), CAST('2020-01-05' AS DATE))",
},
)
- self.validate_all("x ~ y", write={"duckdb": "REGEXP_MATCHES(x, y)"})
- self.validate_all("SELECT * FROM 'x.y'", write={"duckdb": 'SELECT * FROM "x.y"'})
self.validate_all(
"WITH 'x' AS (SELECT 1) SELECT * FROM x",
write={"duckdb": 'WITH "x" AS (SELECT 1) SELECT * FROM x'},
@@ -341,7 +380,8 @@ class TestDuckDB(Validator):
self.validate_all(
"SELECT fname, lname, age FROM person ORDER BY age DESC NULLS FIRST, fname ASC NULLS LAST, lname",
write={
- "duckdb": "SELECT fname, lname, age FROM person ORDER BY age DESC NULLS FIRST, fname NULLS LAST, lname",
+ "": "SELECT fname, lname, age FROM person ORDER BY age DESC NULLS FIRST, fname NULLS LAST, lname NULLS LAST",
+ "duckdb": "SELECT fname, lname, age FROM person ORDER BY age DESC NULLS FIRST, fname, lname",
},
)
self.validate_all(
@@ -370,13 +410,14 @@ class TestDuckDB(Validator):
"hive": "SELECT DATE_ADD(TO_DATE(x), 1)",
},
)
-
- with self.assertRaises(UnsupportedError):
- transpile(
- "SELECT a FROM b PIVOT(SUM(x) FOR y IN ('z', 'q'))",
- read="duckdb",
- unsupported_level=ErrorLevel.IMMEDIATE,
- )
+ self.validate_all(
+ "SELECT CAST('2020-05-06' AS DATE) - INTERVAL 5 DAY",
+ read={"bigquery": "SELECT DATE_SUB(CAST('2020-05-06' AS DATE), INTERVAL 5 DAY)"},
+ )
+ self.validate_all(
+ "SELECT CAST('2020-05-06' AS DATE) + INTERVAL 5 DAY",
+ read={"bigquery": "SELECT DATE_ADD(CAST('2020-05-06' AS DATE), INTERVAL 5 DAY)"},
+ )
with self.assertRaises(UnsupportedError):
transpile(
@@ -481,3 +522,12 @@ class TestDuckDB(Validator):
"SELECT a, LOGICAL_OR(b) FROM table GROUP BY a",
write={"duckdb": "SELECT a, BOOL_OR(b) FROM table GROUP BY a"},
)
+
+ def test_rename_table(self):
+ self.validate_all(
+ "ALTER TABLE db.t1 RENAME TO db.t2",
+ write={
+ "snowflake": "ALTER TABLE db.t1 RENAME TO db.t2",
+ "duckdb": "ALTER TABLE db.t1 RENAME TO t2",
+ },
+ )