diff options
Diffstat (limited to 'sqlglot/dialects/duckdb.py')
-rw-r--r-- | sqlglot/dialects/duckdb.py | 11 |
1 files changed, 10 insertions, 1 deletions
diff --git a/sqlglot/dialects/duckdb.py b/sqlglot/dialects/duckdb.py index f0c1820..093a01c 100644 --- a/sqlglot/dialects/duckdb.py +++ b/sqlglot/dialects/duckdb.py @@ -85,9 +85,17 @@ def _regexp_extract_sql(self: generator.Generator, expression: exp.RegexpExtract ) +def _json_format_sql(self: generator.Generator, expression: exp.JSONFormat) -> str: + sql = self.func("TO_JSON", expression.this, expression.args.get("options")) + return f"CAST({sql} AS TEXT)" + + class DuckDB(Dialect): NULL_ORDERING = "nulls_are_last" + # https://duckdb.org/docs/sql/introduction.html#creating-a-new-table + RESOLVES_IDENTIFIERS_AS_UPPERCASE = None + class Tokenizer(tokens.Tokenizer): KEYWORDS = { **tokens.Tokenizer.KEYWORDS, @@ -167,7 +175,7 @@ class DuckDB(Dialect): **generator.Generator.TRANSFORMS, exp.ApproxDistinct: approx_count_distinct_sql, exp.Array: lambda self, e: self.func("ARRAY", e.expressions[0]) - if isinstance(seq_get(e.expressions, 0), exp.Select) + if e.expressions and e.expressions[0].find(exp.Select) else rename_func("LIST_VALUE")(self, e), exp.ArraySize: rename_func("ARRAY_LENGTH"), exp.ArraySort: _array_sort_sql, @@ -192,6 +200,7 @@ class DuckDB(Dialect): exp.IntDiv: lambda self, e: self.binary(e, "//"), exp.JSONExtract: arrow_json_extract_sql, exp.JSONExtractScalar: arrow_json_extract_scalar_sql, + exp.JSONFormat: _json_format_sql, exp.JSONBExtract: arrow_json_extract_sql, exp.JSONBExtractScalar: arrow_json_extract_scalar_sql, exp.LogicalOr: rename_func("BOOL_OR"), |