Make UtilityContainsQuery recurse until it finds a non-utility Query.
authorTom Lane <tgl@sss.pgh.pa.us>
Thu, 28 Jun 2012 03:18:30 +0000 (23:18 -0400)
committerTom Lane <tgl@sss.pgh.pa.us>
Thu, 28 Jun 2012 03:18:30 +0000 (23:18 -0400)
commitbde689f809027422d4c0baaa3e63b69ce5762e2c
tree1e183710a3c5fb6f64b965b2cd010e01fc50ec68
parentf7867154129781ee1522344bef50890c01f2b47a
Make UtilityContainsQuery recurse until it finds a non-utility Query.

The callers of UtilityContainsQuery want it to return a non-utility Query
if it returns anything at all.  However, since we made CREATE TABLE
AS/SELECT INTO into a utility command instead of a variant of SELECT,
a command like "EXPLAIN SELECT INTO" results in two nested utility
statements.  So what we need UtilityContainsQuery to do is drill down
to the bottom non-utility Query.

I had thought of this possibility in setrefs.c, and fixed it there by
looping around the UtilityContainsQuery call; but overlooked that the call
sites in plancache.c have a similar issue.  In those cases it's
notationally inconvenient to provide an external loop, so let's redefine
UtilityContainsQuery as recursing down to a non-utility Query instead.

Noted by Rushabh Lathia.  This is a somewhat cleaned-up version of his
proposed patch.
src/backend/optimizer/plan/setrefs.c
src/backend/tcop/utility.c