• B
    Remove LEFT part of JOIN to pg_roles because of optimizer limitation: · 05e27a9c
    Bruce Momjian 提交于
    > True, but they're not being used where you'd expect. This seems to be
    > something to do with the fact that it's not pg_authid which is being
    > accessed, but rather the view pg_roles.
    
    I looked into this and it seems the problem is that the view doesn't
    get flattened into the main query because of the has_nullable_targetlist
    limitation in prepjointree.c.  That's triggered because pg_roles has
            '********'::text AS rolpassword
    which isn't nullable, meaning it would produce wrong behavior if
    referenced above the outer join.
    
    Ultimately, the reason this is a problem is that the planner deals only
    in simple Vars while processing joins; it doesn't want to think about
    expressions.  I'm starting to think that it may be time to fix this,
    because I've run into several related restrictions lately, but it seems
    like a nontrivial project.
    
    In the meantime, reducing the LEFT JOIN to pg_roles to a JOIN as per
    Peter's suggestion seems like the best short-term workaround.
    05e27a9c
describe.c 51.5 KB