Thread

  1. 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