Suporting multiple recursive table reads

From: Wesley Massuda <wesley(dot)massuda(at)gmail(dot)com>
To: pgsql-hackers(at)postgresql(dot)org
Subject: Suporting multiple recursive table reads
Date: 2015-10-21 16:31:05
Message-ID: CABsWHhjqke69DG6+bOQci4zWzyiX8T_Jirbj7UQU2NwVGJLwAg@mail.gmail.com
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

I am trying to patch postgres to accept this query. A recursive query
referencing the recursive table twice. By removing some checks it accepts
the query and generates a plan.

### Query

create table base(k1,k2,k3) as (values
(1,null,null),(2,null,null),(3,1,2));

with recursive x(k1,k2,k3) as ( select k1,null::record,null ::record from
base union all select b.k1,x1,x2 from base as b join x as x1 on
x1.k1=b.k2 join x as x2 on x2.k1=b.k3 where b.k2 is not null or b.k3 is
not null) select * from x;

drop table base;

### Plan

CTE Scan on x (cost=7745569.00..11990441.80 rows=212243640 width=68)
CTE x
-> Recursive Union (cost=0.00..7745569.00 rows=212243640 width=60)
-> Seq Scan on base (cost=0.00..30.40 rows=2040 width=4)
-> Merge Join (cost=31081.98..350066.58 rows=21224160 width=6
0)
Merge Cond: (x2.k1 = b.k3)
-> Sort (cost=1868.26..1919.26 rows=20400 width=32)
Sort Key: x2.k1
-> WorkTable Scan on x x2 (cost=0.00..408.00 rows
=20400 width=32)
-> Materialize (cost=29213.72..30254.12 rows=208080 wid
th=36)
-> Sort (cost=29213.72..29733.92 rows=208080 widt
h=36)
Sort Key: b.k3
-> Merge Join (cost=2010.80..5142.20 rows=2
08080 width=36)
Merge Cond: (b.k2 = x1.k1)
-> Sort (cost=142.54..147.64 rows=204
0 width=12)
Sort Key: b.k2
-> Seq Scan on base b (cost=0.0
0..30.40 rows=2040 width=12)
Filter: ((k2 IS NOT NULL) O
R (k3 IS NOT NULL))
-> Sort (cost=1868.26..1919.26 rows=2
0400 width=32)
Sort Key: x1.k1
-> WorkTable Scan on x x1 (cost
=0.00..408.00 rows=20400 width=32)

But when the query is executed looks like the working table can't be read
twice. Then the second join returns empty. Reading the executor of
workingtablescan, i see some notes about a private read pointer and
copying.

It's my first time in the postgres codebase. Can someone point out if the
working_table table can't really be read twice. And if there is similar
code in other executor that allow it.

--
Wesley S. Massuda

Browse pgsql-hackers by date

  From Date Subject
Next Message Robbie Harwood 2015-10-21 16:39:27 Re: [PATCH v3] GSSAPI encryption support
Previous Message Robbie Harwood 2015-10-21 16:28:29 Re: [PATCH v3] GSSAPI encryption support