Re: BUG #7790: null filters in CTEs don't work

From: Tom Lane <tgl(at)sss(dot)pgh(dot)pa(dot)us>
To: luisa(dot)j(dot)francisco(at)gmail(dot)com
Cc: pgsql-bugs(at)postgresql(dot)org
Subject: Re: BUG #7790: null filters in CTEs don't work
Date: 2013-01-07 01:13:01
Message-ID: 10864.1357521181@sss.pgh.pa.us
Views: Raw Message | Whole Thread | Download mbox | Resend email
Thread:
Lists: pgsql-bugs

luisa(dot)j(dot)francisco(at)gmail(dot)com writes:
> Expected output should have no nulls in it, but it does:

It's not apparent to me why you think the first query shouldn't produce
any rows with null parent_id? AFAICS, the recursive query will "crawl
up the tree" producing a row for every parent level above the given
base-case rows. Eventually you'll get up to a match to the row
('body', null), and there's nothing to stop that from being displayed.

It's a bit easier to see what's happening if you leave off the "ORDER
BY" so that the rows are printed in generation order:

regression=# SELECT id, parent_id
FROM item_tree i
WHERE parent_id IS NOT NULL
AND id NOT IN (
SELECT parent_id
FROM item_tree
WHERE parent_id IS NOT NULL);
id | parent_id
--------+-----------
tooth | mouth
tongue | mouth
sclera | eye
cornea | eye
(4 rows)

regression=# WITH RECURSIVE t(id, parent_id) AS (
SELECT id, parent_id
FROM item_tree i
WHERE parent_id IS NOT NULL
AND id NOT IN (
SELECT parent_id
FROM item_tree
WHERE parent_id IS NOT NULL)
UNION ALL
SELECT t.id, i.parent_id
FROM item_tree i
JOIN t
ON i.id = t.parent_id
)
SELECT * FROM t;
id | parent_id
--------+-----------
tooth | mouth
tongue | mouth
sclera | eye
cornea | eye
tooth | head
tongue | head
sclera | head
cornea | head
tooth | body
tongue | body
sclera | body
cornea | body
tooth |
tongue |
sclera |
cornea |
(16 rows)

regards, tom lane

In response to

Browse pgsql-bugs by date

  From Date Subject
Next Message funnybonn40 2013-01-07 04:17:41 BUG #7796: LC_MESSAGES
Previous Message Tom Lane 2013-01-07 00:41:06 Re: BUG #7793: tsearch_data thesaurus size limit