为什么 Snowflake LAST_QUERY_ID returns NULL?

Why does Snowflake LAST_QUERY_ID returns NULL?

给定以下程序

CREATE OR REPLACE PROCEDURE z()
RETURNS STRING NOT NULL
LANGUAGE JAVASCRIPT
AS
$$

const what = snowflake.execute( {sqlText: "select  as value from values (1), (2), (3);"} )

return 'Hi There';
$$
;

如果我 运行 下面的 2 个陈述

CALL z();

select * from table(result_scan(-2));

我得到一个错误 "SQL Error [709] [02000]: Statement 01912a0c-01c1-0574-0000-4de50036137e not found"

如果我 运行 下面的 2 个陈述

CALL z();

SELECT LAST_QUERY_ID(), LAST_QUERY_ID(-1), LAST_QUERY_ID(-2);

它告诉我 LAST_QUERY_ID() 和 LAST_QUERY_ID(-1) 是相同的,而且 LAST_QUERY_ID(-2) returns NULL...

知道为什么它是 returns NULL 而不是允许我检索查询结果的东西 "select as value from values (1), (2), (3);" 吗?

谢谢

It shows me that LAST_QUERY_ID() and LAST_QUERY_ID(-1) are identical but also that LAST_QUERY_ID(-2) returns NULL

LAST_QUERY_ID() 和 LAST_QUERY_ID(-1) 应该看到相同的查询 ID,因为它们相同(LAST_QUERY_ID 的默认值为“-1” ").

另一方面,LAST_QUERY_ID(-2) 不应 returns NULL,"select * from table(result_scan(-2))" 查询不应失败。

如果您定义具有 CALLER 权限的函数,您可以看到 LAST_QUERY_ID(-2) returns 查询 ID 和 "select * from table(result_scan(-2))" 查询有效:

CREATE OR REPLACE PROCEDURE z()
RETURNS STRING NOT NULL
LANGUAGE JAVASCRIPT
EXECUTE AS CALLER
AS
$$

const what = snowflake.execute( {sqlText: "select  as value from values (1), (2), (3);"} )

return 'Hi There';
$$
;

作为解决方法,您可以使用历史记录 window 检查最新的查询。您应该能够在历史选项卡中看到您的查询 (01912a0c-01c1-0574-0000-4de50036137e)。您会注意到这些查询是由同一用户在同一会话中执行的。因此,不应限制列出这些查询。

我能够在我的测试环境中重现该问题,我会将该问题报告给开发团队。如果您可以访问 Snowflake 支持,最好提交有关此问题的支持案例,这样您就可以轻松地遵循该过程。

郑重声明,这是我从 Snowflake Support 得到的答案

这是预期的行为,因为有意设置了安全限制(来自 SP 内部的查询无法访问外部查询,反之亦然)。 我们设置了一个全面的限制,即此类 SP 的内部和外部世界应该分开。无法从一个访问另一个查询的 "result"。 是的,如果我们声明具有调用者权限的过程,那么在这种情况下一切(LAST_QUERY_ID 和 RESULT_SCAN)都可以正常工作。 当 "owner's right" SP 的所有者和调用者相同时,正在讨论实现此用例,所有这些限制都应取消。但我们无法确定时间线,我可以 link 这个案例与那个讨论,以便我们有这个记录。

我觉得不错 :-)