tekumara / fakesnow

Fake Snowflake Connector for Python. Run, mock and test Snowflake DB locally.
Apache License 2.0
83 stars 7 forks source link

Lateral Flatten Conversion Error: Malformed JSON at byte 0 of input: unexpected character #91

Closed rogalski closed 1 week ago

rogalski commented 1 month ago

MCVE in Snowflake:

CREATE OR REPLACE TEMPORARY TABLE TEST (ID BIGINT, COL VARCHAR);
INSERT INTO TEST (ID, COL) VALUES (1, 's1,s2,s3'), (2, 's1,s2');

SELECT
    ID
    , F.VALUE::varchar as V
FROM TEST AS T
, LATERAL FLATTEN(input => SPLIT(T.COL, ',')) AS F;
ID V
1 s1
1 s2
1 s3
2 s1
2 s2

MCVE in Fakesnow:

import fakesnow
import snowflake.connector

def main():
    with fakesnow.patch():
        conn = snowflake.connector.connect(database="X", schema="Y")
        conn.execute_string("CREATE OR REPLACE TEMPORARY TABLE TEST (ID BIGINT, COL VARCHAR)")
        conn.execute_string("INSERT INTO TEST (ID, COL) VALUES (1, 's1,s2,s3'), (2, 's1,s2')")
        conn.cursor().execute("""
        SELECT
            ID
            , F.VALUE::varchar as V
        FROM TEST AS T
        , LATERAL FLATTEN(input => SPLIT(T.COL, ',')) AS F
        """).fetchall()

if __name__ == "__main__":
    main()

Error:

duckdb.duckdb.ConversionException: Conversion Error: Malformed JSON at byte 0 of input: unexpected character.  Input: s1

Version:

$ pip freeze | grep snow
fakesnow==0.9.12
snowflake-connector-python==3.2.1
snowflake-sqlalchemy==1.5.0

FAKESNOW_DEBUG=1:

CREATE OR REPLACE TEMPORARY TABLE TEST (ID BIGINT, COL TEXT);
INSERT INTO TEST (ID, COL) VALUES (1, 's1,s2,s3'), (2, 's1,s2');
SELECT ID, CAST(F.VALUE AS TEXT) AS V FROM TEST AS T, LATERAL UNNEST(CAST(STR_SPLIT(T.COL, ',') AS JSON[])) AS F(VALUE);