Thread
-
Re: BUG #19353: Error XX000 if referencing expanded array in grouping set: variable not found in subplan target list
Tender Wang <tndrwang@gmail.com> — 2025-12-13T10:01:51Z
Tom Lane <tgl@sss.pgh.pa.us> 于2025年12月13日周六 00:54写道: > PG Bug reporting form <noreply@postgresql.org> writes: > > After upgrading to Postgres 18 I've come across an error I wasn't getting > > beforehand. Here's a minimal way to reproduce the issue, that used to > work > > well in Postgres 12 and 17 at least. > > Thank you for this well-crafted bug report! Bisecting shows that > it broke at > > f5050f795aea67dfc40bbc429c8934e9439e22e7 is the first bad commit > commit f5050f795aea67dfc40bbc429c8934e9439e22e7 (HEAD) > Author: Richard Guo <rguo@postgresql.org> > Date: Tue Sep 10 12:36:48 2024 +0900 > > Mark expressions nullable by grouping sets > > I have not dug any deeper than that. > > regards, tom lane > > > When there is SRF in the query, the grouping_target changes in grouping_planner when entering the following function: split_pathtarget_at_srfs(root, grouping_target, scanjoin_target, &grouping_targets, &grouping_targets_contain_srfs); (gdb) pgprint grouping_target PathTarget [sortgrouprefs=0x556daae88358 cost={startup = 0, per_tuple = 0} width=72 has_volatile_expr=VOLATILITY_UNKNOWN] [exprs] Var [varno=1 varattno=3 vartype=1015 varcollid=100 varreturningtype=VAR_RETURNING_DEFAULT varnosyn=1 varattnosyn=3][varnullingrels] Bitmapset [2] Var [varno=1 varattno=2 vartype=1015 varcollid=100 varreturningtype=VAR_RETURNING_DEFAULT varnosyn=1 varattnosyn=2][varnullingrels] Bitmapset [2] Aggref [aggfnoid=2147 aggtype=20 inputcollid=100 aggtranstype=20 aggstar=false aggvariadic=false aggkind=110 'n' aggpresorted=false agglevelsup=0 aggsplit=AGGSPLIT_SIMPLE aggno=0 aggtransno=0][aggargtypes] OidList: [1043] [args] TargetEntry [resno=1 ressortgroupref=1] Var [varno=1 varattno=1 vartype=1043 vartypmod=259 varcollid=100 varreturningtype=VAR_RETURNING_DEFAULT varnosyn=1 varattnosyn=1] [aggdistinct] SortGroupClause [tleSortGroupRef=1 eqop=98 sortop=664 reverse_sort=false nulls_first=false hashable=true] So the targetlist of Agg is : gdb) pgprint plan->targetlist TargetEntry [resno=1] Var [varno=1 varattno=3 vartype=1015 varcollid=100 varreturningtype=VAR_RETURNING_DEFAULT varnosyn=1 varattnosyn=3][varnullingrels] Bitmapset [2] TargetEntry [resno=2 ressortgroupref=1] Var [varno=1 varattno=2 vartype=1015 varcollid=100 varreturningtype=VAR_RETURNING_DEFAULT varnosyn=1 varattnosyn=2][varnullingrels] Bitmapset [2] TargetEntry [resno=3] Aggref [aggfnoid=2147 aggtype=20 inputcollid=100 aggtranstype=20 aggstar=false aggvariadic=false aggkind=110 'n' aggpresorted=false agglevelsup=0 aggsplit=AGGSPLIT_SIMPLE aggno=0 aggtransno=0] [aggargtypes] OidList: [1043] [args] TargetEntry [resno=1 ressortgroupref=1] Var [varno=1 varattno=1 vartype=1043 vartypmod=259 varcollid=100 varreturningtype=VAR_RETURNING_DEFAULT varnosyn=1 varattnosyn=1] [aggdistinct] SortGroupClause [tleSortGroupRef=1 eqop=98 sortop=664 reverse_sort=false nulls_first=false hashable=true] But the subplan->targetlist is : Var [varno=1 varattno=2 vartype=1015 varcollid=100 varreturningtype=VAR_RETURNING_DEFAULT varnosyn=1 varattnosyn=2] FuncExpr [funcid=2331 funcresulttype=1043 funcretset=true funcvariadic=false funcformat=COERCE_EXPLICIT_CALL funccollid=100 inputcollid=100] Var [varno=1 varattno=3 vartype=1015 varcollid=100 varreturningtype=VAR_RETURNING_DEFAULT varnosyn=1 varattnosyn=3] Var [varno=1 varattno=1 vartype=1043 vartypmod=259 varcollid=100 varreturningtype=VAR_RETURNING_DEFAULT varnosyn=1 varattnosyn=1] in build_tlist_index(subplan->targetlist), varno = 1 varattno =3 will not be added into tlist_vinfo array, so "ERROR: variable not found in subplan target list" will report because search_indexed_tlist_for_var() returning null in fix_upper_expr_mutator(). -- Thanks, Tender Wang