Discarded adjust_relid_set() return values in remove_self_join_rel

  • Jump to comment-1
    SATYANARAYANA NARLAPURAM<satyanarlapuram@gmail.com>
    Apr 25, 2026, 7:45 AM UTC
    Hi hackers,
    I found that removeselfjoin_rel() in analyzejoins.c discards the
    return values of two adjustrelidset() calls when updating
    root->allresultrelids and root->leafresultrelids:
    adjust_relid_set(root->all_result_relids, toRemove->relid,
    toKeep->relid);
    adjust_relid_set(root->leaf_result_relids, toRemove->relid,
    toKeep->relid);
    adjustrelidset() does not modify its input in-place. When it finds
    the old relid in the set, it calls bms_copy() to create a new
    Bitmapset, performs the substitution on the copy, and returns the new
    pointer. Without capturing the return value, the original sets are
    never updated. Every other call site in the file analyzejoins.c correctly
    assigns the return value.
    I am not able to craft a query to show it as a problem.
    For the current release, these two lines appears to be a no-op?
    Attached a patch to assign the returned values.
    Thanks,
    Satya
    • Jump to comment-1
      Tender Wang<tndrwang@gmail.com>
      Apr 25, 2026, 7:53 AM UTC
      Hi,
      SATYANARAYANA NARLAPURAM <satyanarlapuram@gmail.com> 于2026年4月25日周六 15:44写道:

      Hi hackers,

      I found that removeselfjoin_rel() in analyzejoins.c discards the
      return values of two adjustrelidset() calls when updating
      root->allresultrelids and root->leafresultrelids:
      adjustrelidset(root->allresultrelids, toRemove->relid, toKeep->relid);
      adjustrelidset(root->leafresultrelids, toRemove->relid, toKeep->relid);

      adjustrelidset() does not modify its input in-place. When it finds
      the old relid in the set, it calls bms_copy() to create a new
      Bitmapset, performs the substitution on the copy, and returns the new
      pointer. Without capturing the return value, the original sets are
      never updated. Every other call site in the file analyzejoins.c correctly
      assigns the return value.

      I am not able to craft a query to show it as a problem.
      For the current release, these two lines appears to be a no-op?

      Attached a patch to assign the returned values.
      The topic in [1] seems to be the same issue as your report.
      You can take a look at [1] to double-check.
      [1] https://www.postgresql.org/message-id/CAMbWs49fYQcqJfJ_Gtn8r1GFNoYtb1%3D2AUab4ieuqY4Zid9ocQ%40mail.gmail.com
      (Sorry for not adding pgsql-hackers mail in the last email)
      --
      Thanks,
      Tender Wang