Binder Error: No function matches the given name and argument types 'json_extract(JSON, BOOLEAN)'.
rogalski opened this issue · comments
Łukasz Rogalski commented
MCVE in Snowflake:
CREATE OR REPLACE TEMPORARY TABLE TBL (COL OBJECT);
INSERT INTO TBL (COL) SELECT ({'K1': {'K2': 1}});
-- 1 row
SELECT * FROM TBL;
-- 1 row
SELECT COL
FROM TBL
WHERE COL:K1:K2 > 0;
MCVE failing wih fakesnow:
import fakesnow
import snowflake.connector
def main():
with fakesnow.patch():
conn = snowflake.connector.connect(database="X", schema="Y")
conn.execute_string("CREATE TEMPORARY TABLE TBL (COL OBJECT)")
conn.execute_string("INSERT INTO TBL (COL) SELECT ({'K1': {'K2': 1}})")
row = conn.cursor().execute("SELECT * FROM TBL").fetchone()
assert row[0] == '{"K1":{"K2":1}}'
sql = """
SELECT COL
FROM TBL
WHERE COL:K1:K2 > 0
"""
conn.execute_string(sql)
if __name__ == "__main__":
main()
Error:
snowflake.connector.errors.ProgrammingError: 002043 (02000): Binder Error: No function matches the given name and argument types 'json_extract(JSON, BOOLEAN)'. You might need to add explicit type casts.
Candidate functions:
json_extract(VARCHAR, BIGINT) -> JSON
json_extract(VARCHAR, VARCHAR) -> JSON
json_extract(VARCHAR, VARCHAR[]) -> JSON[]
json_extract(JSON, BIGINT) -> JSON
json_extract(JSON, VARCHAR) -> JSON
json_extract(JSON, VARCHAR[]) -> JSON[]
Version:
$ pip freeze | grep snow
fakesnow==0.9.4
snowflake-connector-python==3.2.1
FAKESNOW_DEBUG=1:
FAKESNOW_DEBUG=1 python3 repro.py
CREATE TEMPORARY TABLE TBL (COL JSON);
INSERT INTO TBL (COL) SELECT (TO_JSON({'K1': {'K2': 1}}));
SELECT * FROM TBL;
SELECT COL FROM TBL WHERE COL -> '$.K1' -> '$.K2' > 0;
Oliver Mannion commented
Thanks for the very clear repro! I've raised duckdb/duckdb#10786 and will look into a work-around in the meantime.