tekumara / fakesnow

Fake Snowflake Connector for Python. Run, mock and test Snowflake DB locally.

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Binder Error: No function matches the given name and argument types 'json_extract(JSON, BOOLEAN)'.

rogalski opened this issue · comments

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;

Thanks for the very clear repro! I've raised duckdb/duckdb#10786 and will look into a work-around in the meantime.