• Tom Lane's avatar
    In the planner, replace an empty FROM clause with a dummy RTE. · 4be058fe
    Tom Lane authored
    The fact that "SELECT expression" has no base relations has long been a
    thorn in the side of the planner.  It makes it hard to flatten a sub-query
    that looks like that, or is a trivial VALUES() item, because the planner
    generally uses relid sets to identify sub-relations, and such a sub-query
    would have an empty relid set if we flattened it.  prepjointree.c contains
    some baroque logic that works around this in certain special cases --- but
    there is a much better answer.  We can replace an empty FROM clause with a
    dummy RTE that acts like a table of one row and no columns, and then there
    are no such corner cases to worry about.  Instead we need some logic to
    get rid of useless dummy RTEs, but that's simpler and covers more cases
    than what was there before.
    
    For really trivial cases, where the query is just "SELECT expression" and
    nothing else, there's a hazard that adding the extra RTE makes for a
    noticeable slowdown; even though it's not much processing, there's not
    that much for the planner to do overall.  However testing says that the
    penalty is very small, close to the noise level.  In more complex queries,
    this is able to find optimizations that we could not find before.
    
    The new RTE type is called RTE_RESULT, since the "scan" plan type it
    gives rise to is a Result node (the same plan we produced for a "SELECT
    expression" query before).  To avoid confusion, rename the old ResultPath
    path type to GroupResultPath, reflecting that it's only used in degenerate
    grouping cases where we know the query produces just one grouped row.
    (It wouldn't work to unify the two cases, because there are different
    rules about where the associated quals live during query_planner.)
    
    Note: although this touches readfuncs.c, I don't think a catversion
    bump is required, because the added case can't occur in stored rules,
    only plans.
    
    Patch by me, reviewed by David Rowley and Mark Dilger
    
    Discussion: https://postgr.es/m/15944.1521127664@sss.pgh.pa.us
    4be058fe
pathnode.c 125 KB