Athena准备语句参数顺序



我正试图将Athena参数化查询功能与CTE结合使用。

如果我像这样运行一个简单的Athena CTE select语句,我不会得到任何结果,即使我应该得到一个值为1:的单行

aws athena start-query-execution  
--query-string "WITH cte as (select 1 where 1 = ?) select * from cte where 2 = ?" 
--query-execution-context "Database"="default"  
--result-configuration "OutputLocation"="s3://athena-test-bucket/" 
--execution-parameters "1" "2"
# Output CSV:
# "_col0"

奇怪的是,如果我反转参数,查询就会正常工作:

aws athena start-query-execution  
--query-string "WITH cte as (select 1 where 1 = ?) select * from cte where 2 = ?" 
--query-execution-context "Database"="default"  
--result-configuration "OutputLocation"="s3://athena-test-bucket/" 
--execution-parameters "2" "1"
# Output CSV:
# "_col0"
# "1"

AWS文件指出:

在参数化查询中,参数是位置性的,用?表示?。参数在查询中按顺序分配值。不支持命名参数。

但事实显然并非如此,因为只有当参数的顺序相反时,查询才会按预期运行。

我如何让Athena以标准的、从前到后的位置方式正确插入参数,这是其他DB的典型方式?虽然上面的例子很简单,但在现实中,我有带有任意数量参数的任意嵌套CTE的查询。

这是旧版本的Presto(链接1,链接2(和Trino(链接(中已知的问题(使用WITH子句准备的语句的参数顺序不正确(,已修复。对于版本0.272中的Presto(修复PR(:

使用WITH子句修复已准备语句查询的参数排序。

遗憾的是,在编写Athena引擎版本2时,它是基于Presto 0.217的,因此您需要通过更改参数顺序来解决问题。

UPD

应该在基于Trino的Athena v3引擎中工作。

最新更新