Use optimized bitmap set function for membership test in postgres_fdw
authorMichael Paquier <michael@paquier.xyz>
Sun, 1 Jul 2018 06:10:10 +0000 (15:10 +0900)
committerMichael Paquier <michael@paquier.xyz>
Sun, 1 Jul 2018 06:10:10 +0000 (15:10 +0900)
Deparsing logic in postgres_fdw for locking, FROM clause (alias) and Var
(column qualification) does not need to know the exact number of members
involved, which can be calculated with bms_num_members(), but just if
there is more than one relation involved, which is what bms_membership()
does.  The latter is more performant than the former so this shaves a
couple of cycles.

Author: Daniel Gustafsson
Reviewed-by: Ashutosh Bapat, Nathan Bossart
Discussion: https://postgr.es/m/C73594E0-2B67-4E10-BB35-CDE0E41CC384@yesql.se

contrib/postgres_fdw/deparse.c

index d272719ff48540f8d4834ac6ee8f81cb7a88d25e..8068e28184c2c0cd39a4b2986481a478da67c9c7 100644 (file)
@@ -1076,7 +1076,7 @@ deparseFromExpr(List *quals, deparse_expr_cxt *context)
    /* Construct FROM clause */
    appendStringInfoString(buf, " FROM ");
    deparseFromExprForRel(buf, context->root, scanrel,
-                         (bms_num_members(scanrel->relids) > 1),
+                         (bms_membership(scanrel->relids) == BMS_MULTIPLE),
                          (Index) 0, NULL, context->params_list);
 
    /* Construct WHERE clause */
@@ -1262,7 +1262,7 @@ deparseLockingClause(deparse_expr_cxt *context)
                }
 
                /* Add the relation alias if we are here for a join relation */
-               if (bms_num_members(rel->relids) > 1 &&
+               if (bms_membership(rel->relids) == BMS_MULTIPLE &&
                    rc->strength != LCS_NONE)
                    appendStringInfo(buf, " OF %s%d", REL_ALIAS_PREFIX, relid);
            }
@@ -2328,7 +2328,7 @@ deparseVar(Var *node, deparse_expr_cxt *context)
    int         colno;
 
    /* Qualify columns when multiple relations are involved. */
-   bool        qualify_col = (bms_num_members(relids) > 1);
+   bool        qualify_col = (bms_membership(relids) == BMS_MULTIPLE);
 
    /*
     * If the Var belongs to the foreign relation that is deparsed as a