• Tom Lane's avatar
    Suppress unnecessary RelabelType nodes in yet more cases. · 20729324
    Tom Lane authored
    Commit a477bfc1 fixed eval_const_expressions() to ensure that it
    didn't generate unnecessary RelabelType nodes, but I failed to notice
    that some other places in the planner had the same issue.  Really
    noplace in the planner should be using plain makeRelabelType(), for
    fear of generating expressions that should be equal() to semantically
    equivalent trees, but aren't.
    
    An example is that because canonicalize_ec_expression() failed
    to be careful about this, we could end up with an equivalence class
    containing both a plain Const, and a Const-with-RelabelType
    representing exactly the same value.  So far as I can tell this led to
    no visible misbehavior, but we did waste a bunch of cycles generating
    and evaluating "Const = Const-with-RelabelType" to prove such entries
    are redundant.
    
    Hence, move the support function added by a477bfc1 to where it can
    be more generally useful, and use it in the places where planner code
    previously used makeRelabelType.
    
    Back-patch to v12, like the previous patch.  While I have no concrete
    evidence of any real misbehavior here, it's certainly possible that
    I overlooked a case where equivalent expressions that aren't equal()
    could cause a user-visible problem.  In any case carrying extra
    RelabelType nodes through planning to execution isn't very desirable.
    
    Discussion: https://postgr.es/m/1311836.1597781384@sss.pgh.pa.us
    20729324
nodeFuncs.c 110 KB