Thread

Commits

  1. Correct type of front_pathkey to PathKey

  1. minor bug in sort_inner_and_outer()

    Tomas Vondra <tomas.vondra@enterprisedb.com> — 2022-01-14T00:48:33Z

    Hi,
    
    While looking at sort_inner_and_outer() I was rather confused what is
    stored in all_pathkeys, because the code does this:
    
      List *all_pathkeys;
    
      ...
    
      all_pathkeys = select_outer_pathkeys_for_merge(root,
                                                 extra->mergeclause_list,
                                                 joinrel);
    
      foreach(l, all_pathkeys)
      {
          List	   *front_pathkey = (List *) lfirst(l);
          ...
    
          /* Make a pathkey list with this guy first */
          if (l != list_head(all_pathkeys))
              outerkeys = lcons(front_pathkey,
                                ...);
          else
              ...
    
    which seems to suggest all_pathkeys is a list of lists, because why else
    would front_pathkey be a (List *). But that doesn't seem to be the case,
    front_pathkey is actually a PathKey, not a List, as demonstrated by gdb:
    
    (gdb) p *front_pathkey
    $2 = {type = T_PathKey, length = 0, ...}
    
    Maybe it's some clever list-fu that I can't comprehend, but I guess it's
    a bug present since ~2004. It's benign because we only ever pass the
    front_pathkey to lcons() which does not really care.
    
    
    regards
    
    -- 
    Tomas Vondra
    EnterpriseDB: http://www.enterprisedb.com
    The Enterprise PostgreSQL Company