• Tom Lane's avatar
    Make parser rely more heavily on the ParseNamespaceItem data structure. · 5815696b
    Tom Lane authored
    When I added the ParseNamespaceItem data structure (in commit 5ebaaa49),
    it wasn't very tightly integrated into the parser's APIs.  In the wake of
    adding p_rtindex to that struct (commit b541e9ac), there is a good reason
    to make more use of it: by passing around ParseNamespaceItem pointers
    instead of bare RTE pointers, we can get rid of various messy methods for
    passing back or deducing the rangetable index of an RTE during parsing.
    Hence, refactor the addRangeTableEntryXXX functions to build and return
    a ParseNamespaceItem struct, not just the RTE proper; and replace
    addRTEtoQuery with addNSItemToQuery, which is passed a ParseNamespaceItem
    rather than building one internally.
    
    Also, add per-column data (a ParseNamespaceColumn array) to each
    ParseNamespaceItem.  These arrays are built during addRangeTableEntryXXX,
    where we have column type data at hand so that it's nearly free to fill
    the data structure.  Later, when we need to build Vars referencing RTEs,
    we can use the ParseNamespaceColumn info to avoid the rather expensive
    operations done in get_rte_attribute_type() or expandRTE().
    get_rte_attribute_type() is indeed dead code now, so I've removed it.
    This makes for a useful improvement in parse analysis speed, around 20%
    in one moderately-complex test query.
    
    The ParseNamespaceColumn structs also include Var identity information
    (varno/varattno).  That info isn't actually being used in this patch,
    except that p_varno == 0 is a handy test for a dropped column.
    A follow-on patch will make more use of it.
    
    Discussion: https://postgr.es/m/2461.1577764221@sss.pgh.pa.us
    5815696b
rewriteHandler.c 124 KB