Re: Index AM API cleanup

Mark Dilger <mark.dilger@enterprisedb.com>

From: Mark Dilger <mark.dilger@enterprisedb.com>
To: Peter Eisentraut <peter@eisentraut.org>
Cc: PostgreSQL Hackers <pgsql-hackers@postgresql.org>
Date: 2025-03-20T21:14:20Z
Lists: pgsql-hackers
On Thu, Mar 20, 2025 at 4:59 AM Peter Eisentraut <peter@eisentraut.org>
wrote:

> Here is a new version of the remaining main patch set.  I've made a lot
> of changes to reduce the size and scope.
>
> - In version v21, you had included a bunch of expected files in the
> "treeb" module, which wasn't necessary, since the test driver overwrote
> those anyway.  I removed those, which makes the patch much smaller.
>

Yes, I had noticed that also, but didn't repost because each post is quite
large.  Thanks for combining this cleanup with v22.


> - The patch set made various attempts to be able to use a non-btree
> operator family as the referenced operator family for ordering
> operators, but this was not fully developed, since you had just
> hardcoded BTREE_AM_OID in most places.  I have cut all of this out,
> since this just blows up the patch surface but doesn't add any
> functionality at this time.  I believe the patch for ALTER OPERATOR
> FAMILY / ADD falls into this category as well, so I have moved this to
> the end of the patch series, as "WIP".
>

Ok.

(I think this is ok because the purpose of this patch set is to allow
> new index types that behave like btree in many ways, whereas what the
> above feature would allow is to have a type that doesn't require a btree
> operator family to communicate its semantics.  These things are morally
> related but technically distinct.)
>

Ok.


> - For similar reasons, I removed the changes you made in typcache.c.
> With the new infrastructure we have in place, we might someday
> reconsider how the type cache works and make it more independent of
> hardcoded btree and hash behavior, but this is not necessary for this
> patch set.
>

Ok.


> - Move the changes in rangetypes.c to a separate "WIP" patch.  This
> patch is incomplete, as described in the patch, and also not needed for
> this patch series' goal.
>

Ok.

- There were also a couple of other minor "excessive" generalizations
> that I skipped.  For example, we don't need to make the function
> btcostestimate() independent of btree strategies.
>

Ok.


> - Conversely, I moved the changes in network.c to a separate patch at
> the front of the patch series, and fixed them up so that they actually
> work.  The effect of this is easily visible in the "inet" test in the
> "xtree" test module.
>

Your changes get exercised by the main regression suite and, of
course, src/test/recovery and src/bin/pg_upgrade, which each run the main
regression suite.  These all pass.  Likewise, the tests in
src/test/modules/treeb/ exercise the changes.


> - I separated out the changes dealing with row compare support into a
> separate patch.  I think this is not fully ready.  You'll see the FIXME
> in src/backend/executor/nodeIndexscan.c.  Also, this still had a test
> for BTREE_AM_OID in it, so it didn't really work anyway.  I think
> leaving this out for now is not a huge loss.  Index support for row
> compare is a specialized feature.
>

Ok.


> - I squashed together the remaining feature patches into one patch.  I
> observed that you had gradually adjusted the interfaces to use
> CompareType instead of strategy numbers, but then left it so that they
> would accept either one (for example, PathKey).  But then I went through
> and removed the strategy number support for the most part, since nothing
> was using it anymore.  (For example, PathKey was using strategy numbers
> for fake purposes anyway, so we don't need them there anymore, and it
> all trickles from there in a way.)  The resulting patch is much smaller
> and much much simpler now, since it is mostly just a straight conversion
> from strategy to compare type and not much else.
>

Ah, nice.  Yeah, I didn't like leaving the strategy number stuff lying
around, but didn't realize I had left so many improvements unrealized.
Thanks for your analysis.


> Here is the current lineup:
>
> v22-0001-TEST-Add-loadable-modules-as-tests-of-the-amapi.patch
> v22-0002-TEST-Fixup-for-test-driver.patch
>
> This is the test setup, as before.  I added a small fix to reduce the
> diffs further.
>
> v22-0003-TEST-Add-treeb-deep-copy-of-btree.patch.gz
> v22-0004-TEST-treeb-fixups.patch
>
> As before, with a compilation fix to keep up with some other changes.
>
> v22-0005-Generalize-index-support-in-network-support-func.patch
>
> As explained above, I think this patch stands on its own and is ready to
> go.  Check please.
>

Looks good.


> v22-0006-Convert-from-StrategyNumber-to-CompareType.patch


> This is all that remains now.  I think with a bit more polishing around
> the edges, some comment updates, etc., this is close to ready.
>

I went through this and only found one problem, a missing argument, easily
fixed as follows:

diff --git a/src/backend/executor/nodeIndexscan.c
b/src/backend/executor/nodeIndexscan.c
index c04fe461083..02a1feb2add 100644
--- a/src/backend/executor/nodeIndexscan.c
+++ b/src/backend/executor/nodeIndexscan.c
@@ -1365,6 +1365,7 @@ ExecIndexBuildScanKeys(PlanState *planstate, Relation
index,

                get_op_opfamily_properties(opno, opfamily, isorderby,
                                           &op_strategy,
+                                          NULL,        /* don't need
cmptype */
                                           &op_lefttype,
                                           &op_righttype);


v22-0007-TEST-Rotate-treeb-strategy-numbers.patch
>
> This still works. ;-)
>

Yes, this seems fine.


> v22-0008-WIP-Support-row-compare-index-scans-with-non-btr.patch
> v22-0009-WIP-Generalize-index-support-in-range-type-suppo.patch
> v22-0010-WIP-Allow-more-index-AMs-in-ALTER-OP-FAMILY.ADD.patch
>
> These are postponed, as described above.
>

—
Mark Dilger
EnterpriseDB: http://www.enterprisedb.com
The Enterprise PostgreSQL Company

Commits

Same data as JSON: GET /api/v1/messages/:b64id/commits the thread's linked commits as JSON, with link sources. API reference →
  1. Relax ordering-related hardcoded btree requirements in planning

  2. Support non-btree indexes in get_actual_variable_range()

  3. Convert PathKey to use CompareType

  4. Generalize index support in network support function

  5. Update a code comment

  6. Allow non-btree unique indexes for matviews

  7. Allow non-btree unique indexes for partition keys

  8. Add some opfamily support functions to lsyscache.c

  9. Simplify and generalize PrepareSortSupportFromIndexRel()

  10. Generalize hash and ordering support in amapi

  11. Drop opcintype from index AM strategy translation API

  12. Allow non-btree speculative insertion indexes

  13. Support non-btree indexes for foreign keys

  14. Integrate GistTranslateCompareType() into IndexAmTranslateCompareType()

  15. Convert strategies to and from compare types

  16. Move CompareType to separate header file

  17. Add get_opfamily_name() function

  18. Rename GistTranslateStratnum() to GistTranslateCompareType()

  19. Change gist stratnum function to use CompareType

  20. Rename RowCompareType to CompareType

  21. Improve slightly misleading internal error message

  22. Track scan reversals in MergeJoin

  23. Track sort direction in SortGroupClause

  24. Add stratnum GiST support function

  25. Add amgettreeheight index AM API routine