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