Snowflake 存储过程中的最大 JavaScript 字符串大小

Posted

技术标签:

【中文标题】Snowflake 存储过程中的最大 JavaScript 字符串大小【英文标题】:Maximum JavaScript string size in Snowflake Stored Procedures 【发布时间】:2019-12-11 23:19:02 【问题描述】:

Snowflake 文档说 VARCHAR 列限制为 16 MB 未压缩 https://docs.snowflake.net/manuals/sql-reference/data-types-text.html#data-types-for-text-strings

VARCHAR holds unicode characters.  The maximum length is 16 MB (uncompressed). The maximum number of Unicode characters that can be stored in a VARCHAR column depends on whether the characters are singlebyte or multibyte:

Singlebyte
16,777,216

Multibyte
Between 8,388,608 (2 bytes per character) and 4,194,304 (4 bytes per character)

If a length is not specified, the default is the maximum length.

Snowflake 文档说 VARCHAR 数据会自动转换为 javascript 字符串数据类型。https://docs.snowflake.net/manuals/sql-reference/stored-procedures-usage.html#sql-and-javascript-data-type-mapping

问题: 如果我调用 Snowflake 过程(或 JavaScript UDF)并从表中传入 VARCHAR 数据,Snowflake 过程中是否存在大小限制,或者它会处理 16MB 的字符串变量吗?

【问题讨论】:

【参考方案1】:

JavaScript 最多可处理 16MB:

CREATE OR REPLACE FUNCTION MaxParam("STRING" VARCHAR)
RETURNS STRING LANGUAGE JAVASCRIPT STRICT IMMUTABLE AS
'return STRING;';

CREATE TABLE T AS SELECT LPAD('111', 16777216, '0') STR;
SELECT MaxParam(STR) FROM T;
=> 0000000000000000000000000000000000000...

SELECT MaxParam(LPAD('111', 16777217, '0'));
=> String '(padded string)' is too long and would be truncated
(Error message is from LPAD, not JS)

【讨论】:

谢谢汉斯!如果我和你一样了解 JavaScript,我可以自己回答这个问题,但这将有助于其他人参考。感谢您的 map 函数处理显示为未定义的 NULL 参数! 我相信这实际上与 Snowflake 中 SQL VARCHAR 数据类型的 16MB 限制有关,而不是 JavaScript。未经测试,我确信 JavaScript 可以在过程/函数中处理 > 16MB 的文本。你找到了我的一些旧东西,也许吧?我永远无法理解为什么 SQL NULL 必须在存储过程 API 中映射为 undefined 而不是 null。

以上是关于Snowflake 存储过程中的最大 JavaScript 字符串大小的主要内容,如果未能解决你的问题,请参考以下文章

使用 Snowflake 中的任务调用存储过程

在 SnowFlake DB 中并行执行存储过程中的 SQL 语句

Snowflake 中的存储过程能否提供一个表值输出,就像我们在 SQL Server 中得到的一样

如何使用 Snowflake Javascript 存储过程或函数遍历表中的所有列?

在 Snowflake 中处理多个 SQL 语句的存储过程

Snowflake - 系统/内置存储过程