Inline ginCompareAttEntries for speed
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 9 Jan 2026 18:31:43 +0000 (20:31 +0200)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Fri, 9 Jan 2026 18:31:43 +0000 (20:31 +0200)
It is called in tight loops during GIN index build.

Author: David Geier <geidav.pg@gmail.com>
Discussion: https://www.postgresql.org/message-id/5d366878-2007-4d31-861e-19294b7a583b@gmail.com

src/backend/access/gin/ginutil.c
src/include/access/gin_private.h

index a546cac18d3b6e2df8b204c928e4b859d00fddf3..d205093e21dc723a9277b6c42919ae4799431fa7 100644 (file)
@@ -387,44 +387,6 @@ GinInitMetabuffer(Buffer b)
                ((char *) metadata + sizeof(GinMetaPageData)) - (char *) page;
 }
 
-/*
- * Compare two keys of the same index column
- */
-int
-ginCompareEntries(GinState *ginstate, OffsetNumber attnum,
-                                 Datum a, GinNullCategory categorya,
-                                 Datum b, GinNullCategory categoryb)
-{
-       /* if not of same null category, sort by that first */
-       if (categorya != categoryb)
-               return (categorya < categoryb) ? -1 : 1;
-
-       /* all null items in same category are equal */
-       if (categorya != GIN_CAT_NORM_KEY)
-               return 0;
-
-       /* both not null, so safe to call the compareFn */
-       return DatumGetInt32(FunctionCall2Coll(&ginstate->compareFn[attnum - 1],
-                                                                                  ginstate->supportCollation[attnum - 1],
-                                                                                  a, b));
-}
-
-/*
- * Compare two keys of possibly different index columns
- */
-int
-ginCompareAttEntries(GinState *ginstate,
-                                        OffsetNumber attnuma, Datum a, GinNullCategory categorya,
-                                        OffsetNumber attnumb, Datum b, GinNullCategory categoryb)
-{
-       /* attribute number is the first sort key */
-       if (attnuma != attnumb)
-               return (attnuma < attnumb) ? -1 : 1;
-
-       return ginCompareEntries(ginstate, attnuma, a, categorya, b, categoryb);
-}
-
-
 /*
  * Support for sorting key datums in ginExtractEntries
  *
index b33f7cec5b4586448f7d9dcd151edcd7c6443122..e155045ce8a640a91b6df3a21c914637ccf6820d 100644 (file)
@@ -97,12 +97,6 @@ extern Buffer GinNewBuffer(Relation index);
 extern void GinInitBuffer(Buffer b, uint32 f);
 extern void GinInitPage(Page page, uint32 f, Size pageSize);
 extern void GinInitMetabuffer(Buffer b);
-extern int     ginCompareEntries(GinState *ginstate, OffsetNumber attnum,
-                                                         Datum a, GinNullCategory categorya,
-                                                         Datum b, GinNullCategory categoryb);
-extern int     ginCompareAttEntries(GinState *ginstate,
-                                                                OffsetNumber attnuma, Datum a, GinNullCategory categorya,
-                                                                OffsetNumber attnumb, Datum b, GinNullCategory categoryb);
 extern Datum *ginExtractEntries(GinState *ginstate, OffsetNumber attnum,
                                                                Datum value, bool isNull,
                                                                int32 *nentries, GinNullCategory **categories);
@@ -502,6 +496,44 @@ ginCompareItemPointers(ItemPointer a, ItemPointer b)
        return pg_cmp_u64(ia, ib);
 }
 
+/*
+ * Compare two keys of the same index column
+ */
+static inline int
+ginCompareEntries(GinState *ginstate, OffsetNumber attnum,
+                                 Datum a, GinNullCategory categorya,
+                                 Datum b, GinNullCategory categoryb)
+{
+       /* if not of same null category, sort by that first */
+       if (categorya != categoryb)
+               return (categorya < categoryb) ? -1 : 1;
+
+       /* all null items in same category are equal */
+       if (categorya != GIN_CAT_NORM_KEY)
+               return 0;
+
+       /* both not null, so safe to call the compareFn */
+       return DatumGetInt32(FunctionCall2Coll(&ginstate->compareFn[attnum - 1],
+                                                                                  ginstate->supportCollation[attnum - 1],
+                                                                                  a, b));
+}
+
+/*
+ * Compare two keys of possibly different index columns
+ */
+static inline int
+ginCompareAttEntries(GinState *ginstate,
+                                        OffsetNumber attnuma, Datum a, GinNullCategory categorya,
+                                        OffsetNumber attnumb, Datum b, GinNullCategory categoryb)
+{
+       /* attribute number is the first sort key */
+       if (attnuma != attnumb)
+               return (attnuma < attnumb) ? -1 : 1;
+
+       return ginCompareEntries(ginstate, attnuma, a, categorya, b, categoryb);
+
+}
+
 extern int     ginTraverseLock(Buffer buffer, bool searchMode);
 
 #endif                                                 /* GIN_PRIVATE_H */