Re: segmentation fault with simple UPDATE statement (postgres 10.5) - Mailing list pgsql-bugs

From Andres Freund
Subject Re: segmentation fault with simple UPDATE statement (postgres 10.5)
Date
Msg-id 20181212171616.6kxyhcf4hwllff5k@alap3.anarazel.de
Whole thread Raw
In response to Re: segmentation fault with simple UPDATE statement (postgres 10.5)  (Tom Lane <tgl@sss.pgh.pa.us>)
Responses Re: segmentation fault with simple UPDATE statement (postgres 10.5)
List pgsql-bugs
Hi,

On 2018-12-12 11:13:17 -0500, Tom Lane wrote:
> Bezverhijs Eduards <Eduards.Bezverhijs@tieto.com> writes:
> > We encountered a bug in our systems with update statement, but long story short, here's the self-containing test
casewhich results in segmentation fault.
 
>
> Huh.  I can reproduce this in 9.6 and 10, but not earlier or later
> branches.  Looking ...

Based on a relatively quick look it looks to me that crashing/no
crashing is a question of plan shape, rather than a bugfix.

The subplan is:
   {TARGETENTRY
   :expr
      {SUBPLAN
      :subLinkType 5
      :testexpr <>
      :paramIds <>
      :plan_id 1
      :plan_name SubPlan\ 1\ \(returns\ $1\)
      :firstColType 1043
      :firstColTypmod 5
      :firstColCollation 100
      :useHashTable false
      :unknownEqFalse false
      :parallel_safe false
      :setParam (i 1)
      :parParam (i 0)
      :args (
         {VAR
         :varno 1
         :varattno 1
         :vartype 1043
         :vartypmod 5
         :varcollid 100
         :varlevelsup 0
         :varnoold 1
         :varoattno 1
         :location 55
         }
      )
      :startup_cost 0.00
      :per_call_cost 38.25
      }
   :resno 2
   :resname <>
   :ressortgroupref 0
   :resorigtbl 0
   :resorigcol 0
   :resjunk true
   }

with varno still referencing a specific varno, rather than INNER/OUTER.
That works for master:
┌─────────────────────────────────────────────────────────────────────────┐
│                               QUERY PLAN                                │
├─────────────────────────────────────────────────────────────────────────┤
│ Update on public.t1  (cost=0.00..86477.60 rows=2260 width=46)           │
│   ->  Seq Scan on public.t1  (cost=0.00..86477.60 rows=2260 width=46)   │
│         Output: $1, (SubPlan 1 (returns $1)), t1.ctid                   │
│         SubPlan 1 (returns $1)                                          │
│           ->  Seq Scan on public.t2  (cost=0.00..38.25 rows=11 width=8) │
│                 Output: t2.b                                            │
│                 Filter: ((t2.b)::text = (t1.a)::text)                   │
└─────────────────────────────────────────────────────────────────────────┘

where the subplan is executed as a child of a seqscan, which thus has
ecxt_scantuple set.

But in 10:
┌───────────────────────────────────────────────────────────────────────────────┐
│                                  QUERY PLAN                                   │
├───────────────────────────────────────────────────────────────────────────────┤
│ Update on public.t1  (cost=0.00..86477.60 rows=2260 width=46)                 │
│   ->  Result  (cost=0.00..86477.60 rows=2260 width=46)                        │
│         Output: $1, ((SubPlan 1 (returns $1))), t1.ctid                       │
│         One-Time Filter: ('X'::text <> ALL ('{Y,Z}'::text[]))                 │
│         ->  Seq Scan on public.t1  (cost=0.00..86477.60 rows=2260 width=46)   │
│               Output: $1, (SubPlan 1 (returns $1)), t1.ctid                   │
│               SubPlan 1 (returns $1)                                          │
│                 ->  Seq Scan on public.t2  (cost=0.00..38.25 rows=11 width=8) │
│                       Output: t2.b                                            │
│                       Filter: ((t2.b)::text = (t1.a)::text)                   │
└───────────────────────────────────────────────────────────────────────────────┘

the subplan is executed below a Result node, which won't have scantuple
set. Therefore we crash.

Looking as to why that reference isn't corrected.

Greetings,

Andres Freund


pgsql-bugs by date:

Previous
From: Tom Lane
Date:
Subject: Re: segmentation fault with simple UPDATE statement (postgres 10.5)
Next
From: Tom Lane
Date:
Subject: Re: segmentation fault with simple UPDATE statement (postgres 10.5)