diff --git a/sqlglot/dialects/duckdb.py b/sqlglot/dialects/duckdb.py index 7171efa1a3..bd623ae4f8 100644 --- a/sqlglot/dialects/duckdb.py +++ b/sqlglot/dialects/duckdb.py @@ -1346,7 +1346,12 @@ class Generator(generator.Generator): exp.Ceil: _ceil_floor, exp.Floor: _ceil_floor, exp.JSONBExists: rename_func("JSON_EXISTS"), - exp.JSONExtract: _arrow_json_extract_sql, + exp.JSONExtract: lambda self, e: _arrow_json_extract_sql( + self, + exp.JSONExtractScalar(**e.args) + if e.args.get("requires_json") or e.args.get("variant_extract") + else e, + ), exp.JSONExtractArray: _json_extract_value_array_sql, exp.JSONFormat: _json_format_sql, exp.JSONValueArray: _json_extract_value_array_sql, diff --git a/tests/dialects/test_snowflake.py b/tests/dialects/test_snowflake.py index a784ff0752..c3b8dcff3d 100644 --- a/tests/dialects/test_snowflake.py +++ b/tests/dialects/test_snowflake.py @@ -969,7 +969,7 @@ def test_snowflake(self): """WITH vartab(v) AS (select parse_json('[{"attr": [{"name": "banana"}]}]')) SELECT GET_PATH(v, '[0].attr[0].name') FROM vartab""", write={ "bigquery": """WITH vartab AS (SELECT PARSE_JSON('[{"attr": [{"name": "banana"}]}]') AS v) SELECT JSON_EXTRACT(v, '$[0].attr[0].name') FROM vartab""", - "duckdb": """WITH vartab(v) AS (SELECT JSON('[{"attr": [{"name": "banana"}]}]')) SELECT v -> '$[0].attr[0].name' FROM vartab""", + "duckdb": """WITH vartab(v) AS (SELECT JSON('[{"attr": [{"name": "banana"}]}]')) SELECT v ->> '$[0].attr[0].name' FROM vartab""", "mysql": """WITH vartab(v) AS (SELECT '[{"attr": [{"name": "banana"}]}]') SELECT JSON_EXTRACT(v, '$[0].attr[0].name') FROM vartab""", "presto": """WITH vartab(v) AS (SELECT JSON_PARSE('[{"attr": [{"name": "banana"}]}]')) SELECT JSON_EXTRACT(v, '$[0].attr[0].name') FROM vartab""", "snowflake": """WITH vartab(v) AS (SELECT PARSE_JSON('[{"attr": [{"name": "banana"}]}]')) SELECT GET_PATH(v, '[0].attr[0].name') FROM vartab""", @@ -980,7 +980,7 @@ def test_snowflake(self): """WITH vartab(v) AS (select parse_json('{"attr": [{"name": "banana"}]}')) SELECT GET_PATH(v, 'attr[0].name') FROM vartab""", write={ "bigquery": """WITH vartab AS (SELECT PARSE_JSON('{"attr": [{"name": "banana"}]}') AS v) SELECT JSON_EXTRACT(v, '$.attr[0].name') FROM vartab""", - "duckdb": """WITH vartab(v) AS (SELECT JSON('{"attr": [{"name": "banana"}]}')) SELECT v -> '$.attr[0].name' FROM vartab""", + "duckdb": """WITH vartab(v) AS (SELECT JSON('{"attr": [{"name": "banana"}]}')) SELECT v ->> '$.attr[0].name' FROM vartab""", "mysql": """WITH vartab(v) AS (SELECT '{"attr": [{"name": "banana"}]}') SELECT JSON_EXTRACT(v, '$.attr[0].name') FROM vartab""", "presto": """WITH vartab(v) AS (SELECT JSON_PARSE('{"attr": [{"name": "banana"}]}')) SELECT JSON_EXTRACT(v, '$.attr[0].name') FROM vartab""", "snowflake": """WITH vartab(v) AS (SELECT PARSE_JSON('{"attr": [{"name": "banana"}]}')) SELECT GET_PATH(v, 'attr[0].name') FROM vartab""", @@ -992,7 +992,7 @@ def test_snowflake(self): write={ "bigquery": """SELECT JSON_EXTRACT(PARSE_JSON('{"fruit":"banana"}'), '$.fruit')""", "databricks": """SELECT PARSE_JSON('{"fruit":"banana"}'):fruit""", - "duckdb": """SELECT JSON('{"fruit":"banana"}') -> '$.fruit'""", + "duckdb": """SELECT JSON('{"fruit":"banana"}') ->> '$.fruit'""", "mysql": """SELECT JSON_EXTRACT('{"fruit":"banana"}', '$.fruit')""", "presto": """SELECT JSON_EXTRACT(JSON_PARSE('{"fruit":"banana"}'), '$.fruit')""", "snowflake": """SELECT GET_PATH(PARSE_JSON('{"fruit":"banana"}'), 'fruit')""", @@ -1322,7 +1322,7 @@ def test_snowflake(self): self.validate_all( '''SELECT PARSE_JSON('{"a": {"b c": "foo"}}'):a:"b c"''', write={ - "duckdb": """SELECT JSON('{"a": {"b c": "foo"}}') -> '$.a."b c"'""", + "duckdb": """SELECT JSON('{"a": {"b c": "foo"}}') ->> '$.a."b c"'""", "mysql": """SELECT JSON_EXTRACT('{"a": {"b c": "foo"}}', '$.a."b c"')""", "snowflake": """SELECT GET_PATH(PARSE_JSON('{"a": {"b c": "foo"}}'), 'a["b c"]')""", },