【问题标题】:Snowflake Javascript UDF creation via JDBC client is stripping curly braces from function通过 JDBC 客户端创建 Snowflake Javascript UDF 正在从函数中剥离花括号
【发布时间】:2021-11-17 18:37:31
【问题描述】:

我正在使用 Java Snowflake JDBC 客户端 (3.13.10) 和 jooq 创建 Javascript UDF。通过 jooq 构造并提供给 JDBC 客户端的查询字符串包括完整的 JS 函数体。

例如,这是来自我在执行查询之前附加的调试器。查询内容:

CREATE OR REPLACE FUNCTION "DB_EXAMPLE"."SCHEMA_EXAMPLE"."MATCH_SCORE"(sources varchar,basescore double precision) RETURNS double precision LANGUAGE javascript  AS
$$
function main(sources, basescore) {
    let score = 0 + basescore;
    if (sources.includes("something")) {
        score += 10;
    }
    if (sources.includes("else")) {
        score += 20;
    }
    return score;
}
return main(SOURCES, BASESCORE);

$$

但是,在收到时,Snowflake 似乎正在剥离一些花括号/方括号并弄乱 JS 函数定义。

我无法弄清楚是什么导致这些在 JDBC 客户端执行查询和 Snowflake 接收它之间被删除。

这是我在雪花历史区域看到的。

CREATE OR REPLACE FUNCTION "DB_EXAMPLE"."SCHEMA_EXAMPLE"."MATCH_SCORE"(sources varchar,basescore double precision) RETURNS double precision LANGUAGE javascript  AS
$$
function main(sources, basescore) 
    let score = 0 + basescore;
    if (sources.includes("something")) {
        score += 10;
    
    if (sources.includes("else")) 
        score += 20;
    
    return score;
}
return main(SOURCES, BASESCORE);

$$

如果您仔细观察,您会发现 main 函数的左大括号缺失,if 语句的右大括号也缺失。

知道我在这里缺少什么吗?

【问题讨论】:

  • 您能否与发送 create 语句(以及任何相关语句准备等)的 JDBC 调用共享 Java?
  • Snowflake 只运行它被要求运行的内容。这个问题似乎更有可能来自客户端。请分享 Java 代码详情。
  • 你们都在这里,执行查询输入的 Java 包装器中的某些东西必须更改它。我在 Java 上不是很好,所以明天我需要一些时间来挖掘包装器并研究它。不幸的是,代码来自另一个 maven 包,所以我需要逐步通过字节码来弄清楚它或访问源代码。当我有更多信息时,我会在这里更新。
  • 在 JDBC 连接字符串中使用 tracing=ALL 并检查日志文件。它可能会显示更多信息并让您了解正在发生的事情。
  • 谢谢@Sergiu。我通过与一位同事单步执行来缩小范围——这段代码正在使用 jooq,而当 jooq 找到函数定义的花括号时,它似乎正在执行关键字替换。所以这不是雪花问题。一旦我完全弄清楚了这一点,我将编辑问题并在正文中提及 jooq 以明确这一点。目前正在寻找一种在 jooq 配置中禁用关键字替换/渲染的方法。

标签: snowflake-cloud-data-platform


【解决方案1】:

问题最终是JS函数定义是通过jOOQ传递的。

jOOQ 在函数定义字符串中找到花括号/方括号并将它们解释为关键字。定义的结果输出字符串将是 jOOQ 在错误地认为大括号是分隔关键字后提出的后处理版本。

来自 jOOQ 文档

关键字:大括号也用于分隔关键字,它暴露 DSL.keyword(String) 中指定的行为(例如,大写, 小写字母等)。以下表达式使用嵌入的 普通 SQL 模板中的关键字:

DSL.field("{current_timestamp}");

参考:https://www.jooq.org/javadoc/latest/org.jooq/org/jooq/SQL.html

这里的快速解决方案是直接从 Snowflake 客户端连接运行 UDF 创建查询,而不是通过 jOOQ 上下文,这避免了 jOOQ 尝试处理查询。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-22
    • 1970-01-01
    • 2023-03-25
    • 2013-02-08
    • 2020-05-28
    • 2020-11-13
    • 2011-05-08
    • 1970-01-01
    相关资源
    最近更新 更多