【发布时间】: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