AWS Redshift中CTE多次引用子查询触发断言错误的技术问询
AWS Redshift重复引用CTE标量子查询触发Assert错误
问题场景
当在WHERE子句中多次引用同一个CTE的标量子查询时,Redshift会触发内部Assert错误,示例查询如下:
WITH var_table AS ( SELECT 8 AS x ) SELECT * FROM real_table WHERE real_table_col_1 = (select x from var_table) AND real_table_col_2 = (select x from var_table)
错误详情
触发的错误信息:
ERROR: Assert Detail: ----------------------------------------------- error: Assert code: 1000 context: query->a_last_plan()->m_locus == LocusXNode - query: 48508061 location: xen_execute.cpp:8916 process: padbmaster [pid=2659] -----------------------------------------------
可正常执行的替代方案
- 改用临时表:将CTE替换为临时表后,查询可正常运行
create temporary table var_table AS ( SELECT 8 AS x ); SELECT * FROM real_table WHERE real_table_col_1 = (select x from var_table) AND real_table_col_2 = (select x from var_table)
- 单次引用CTE子查询:仅在WHERE子句中引用一次CTE的标量子查询时,无错误
WITH var_table AS ( SELECT 8 AS x ) SELECT * FROM real_table WHERE real_table_col_1 = (select x from var_table)
结论
这是Redshift的Bug,并非设计特性。错误信息显示执行计划生成阶段的内部断言校验失败,属于Redshift查询引擎的逻辑缺陷。临时表是当前可靠的规避方案,若能整理出稳定的最小复现用例,建议提交给AWS技术支持团队以推动问题修复。
内容的提问来源于stack exchange,提问作者Amuoeba
相关产品推荐
相关产品推荐

