JavaScript UDF 在 Airflow 中失败但在 Snowflake 中有效

JavaScript UDF fails in Airflow but works in Snowflake

我有以下功能,当我在雪花中 运行 时可以使用:

CREATE OR REPLACE FUNCTION dfp.extract_vcode(NAME VARCHAR)
    RETURNS string
    LANGUAGE javascript
    STRICT
    AS '
    const regex = /[[]v=([0-9]+)/ig;
    let s = NAME.match(regex);
    if (s != null) {
        return s[0].split('=')[1];
    } else {
        return null;
    }
    ';

但是当我在 Airflow 中测试时:

common.snowflake.exceptions.SQLCompilationSnowflakeException:

001003 (42000): 019eb4f7-0603-05d7-0000-01b529072596: SQL compilation error: parse error line 6 at position 35 near ''. syntax error line 6 at position 4 unexpected 'const'.

Error occured while processing query(019eb4f7-0603-05d7-0000-01b529072596):

CREATE OR REPLACE FUNCTION dfp.extract_vcode(NAME VARCHAR) RETURNS string LANGUAGE javascript STRICT AS ' const regex = /[[]v=([0-9]+)/ig

----- 我有另一个可以正常工作的 UDF:

CREATE OR REPLACE FUNCTION dfp.parse_metadata(DATA varchar)
    RETURNS OBJECT
    LANGUAGE javascript
    STRICT
    AS '
    if (!DATA) {
        return {}
    }

    let dict = {}
    const parts = DATA.split("|")

    parts.forEach((p) => {
        const split = p.split("=")
        dict[split[0]] = split[1]
    })

    return dict
    ';

问题是 Snowflake 会尝试将传递给它的 SQL 拆分成多个语句,用“;”分隔并且那里使用的解析器不理解 javascript 语法。

解决方案是用 [] 包装您的 sql 查询。如果将单元素数组传递给 Snowflake 运算符,它会假定数组的每个元素都是一条语句,甚至不会尝试拆分它。