1
0
mirror of https://github.com/postgres/postgres.git synced 2025-11-22 12:22:45 +03:00

Convert strategies to and from compare types

For each Index AM, provide a mapping between operator strategies and
the system-wide generic concept of a comparison type.  For example,
for btree, BTLessStrategyNumber maps to and from COMPARE_LT.  Numerous
places in the planner and executor think directly in terms of btree
strategy numbers (and a few in terms of hash strategy numbers.)  These
should be converted over subsequent commits to think in terms of
CompareType instead.  (This commit doesn't make any use of this API
yet.)

Author: Mark Dilger <mark.dilger@enterprisedb.com>
Reviewed-by: Peter Eisentraut <peter@eisentraut.org>
Discussion: https://www.postgresql.org/message-id/flat/E72EAA49-354D-4C2E-8EB9-255197F55330@enterprisedb.com
This commit is contained in:
Peter Eisentraut
2025-02-02 10:26:04 +01:00
parent 119fc30dd5
commit c09e5a6a01
13 changed files with 169 additions and 0 deletions

View File

@@ -298,6 +298,8 @@ brinhandler(PG_FUNCTION_ARGS)
amroutine->amestimateparallelscan = NULL;
amroutine->aminitparallelscan = NULL;
amroutine->amparallelrescan = NULL;
amroutine->amtranslatestrategy = NULL;
amroutine->amtranslatecmptype = NULL;
PG_RETURN_POINTER(amroutine);
}

View File

@@ -107,6 +107,8 @@ gisthandler(PG_FUNCTION_ARGS)
amroutine->amestimateparallelscan = NULL;
amroutine->aminitparallelscan = NULL;
amroutine->amparallelrescan = NULL;
amroutine->amtranslatestrategy = NULL;
amroutine->amtranslatecmptype = NULL;
PG_RETURN_POINTER(amroutine);
}

View File

@@ -21,6 +21,7 @@
#include "access/hash.h"
#include "access/hash_xlog.h"
#include "access/relscan.h"
#include "access/stratnum.h"
#include "access/tableam.h"
#include "access/xloginsert.h"
#include "commands/progress.h"
@@ -105,6 +106,8 @@ hashhandler(PG_FUNCTION_ARGS)
amroutine->amestimateparallelscan = NULL;
amroutine->aminitparallelscan = NULL;
amroutine->amparallelrescan = NULL;
amroutine->amtranslatestrategy = hashtranslatestrategy;
amroutine->amtranslatecmptype = hashtranslatecmptype;
PG_RETURN_POINTER(amroutine);
}
@@ -922,3 +925,19 @@ hashbucketcleanup(Relation rel, Bucket cur_bucket, Buffer bucket_buf,
else
LockBuffer(bucket_buf, BUFFER_LOCK_UNLOCK);
}
CompareType
hashtranslatestrategy(StrategyNumber strategy, Oid opfamily, Oid opcintype)
{
if (strategy == HTEqualStrategyNumber)
return COMPARE_EQ;
return COMPARE_INVALID;
}
StrategyNumber
hashtranslatecmptype(CompareType cmptype, Oid opfamily, Oid opcintype)
{
if (cmptype == COMPARE_EQ)
return HTEqualStrategyNumber;
return InvalidStrategy;
}

View File

@@ -107,6 +107,56 @@ GetIndexAmRoutineByAmId(Oid amoid, bool noerror)
}
/*
* IndexAmTranslateStrategy - given an access method and strategy, get the
* corresponding compare type.
*
* If missing_ok is false, throw an error if no compare type is found. If
* true, just return COMPARE_INVALID.
*/
CompareType
IndexAmTranslateStrategy(StrategyNumber strategy, Oid amoid, Oid opfamily, Oid opcintype, bool missing_ok)
{
CompareType result;
IndexAmRoutine *amroutine;
amroutine = GetIndexAmRoutineByAmId(amoid, false);
if (amroutine->amtranslatestrategy)
result = amroutine->amtranslatestrategy(strategy, opfamily, opcintype);
else
result = COMPARE_INVALID;
if (!missing_ok && result == COMPARE_INVALID)
elog(ERROR, "could not translate strategy number %d for index AM %u", strategy, amoid);
return result;
}
/*
* IndexAmTranslateCompareType - given an access method and compare type, get
* the corresponding strategy number.
*
* If missing_ok is false, throw an error if no strategy is found correlating
* to the given cmptype. If true, just return InvalidStrategy.
*/
StrategyNumber
IndexAmTranslateCompareType(CompareType cmptype, Oid amoid, Oid opfamily, Oid opcintype, bool missing_ok)
{
StrategyNumber result;
IndexAmRoutine *amroutine;
amroutine = GetIndexAmRoutineByAmId(amoid, false);
if (amroutine->amtranslatecmptype)
result = amroutine->amtranslatecmptype(cmptype, opfamily, opcintype);
else
result = InvalidStrategy;
if (!missing_ok && result == InvalidStrategy)
elog(ERROR, "could not translate compare type %u for index AM %u", cmptype, amoid);
return result;
}
/*
* Ask appropriate access method to validate the specified opclass.
*/

View File

@@ -20,6 +20,7 @@
#include "access/nbtree.h"
#include "access/relscan.h"
#include "access/stratnum.h"
#include "commands/progress.h"
#include "commands/vacuum.h"
#include "nodes/execnodes.h"
@@ -148,6 +149,8 @@ bthandler(PG_FUNCTION_ARGS)
amroutine->amestimateparallelscan = btestimateparallelscan;
amroutine->aminitparallelscan = btinitparallelscan;
amroutine->amparallelrescan = btparallelrescan;
amroutine->amtranslatestrategy = bttranslatestrategy;
amroutine->amtranslatecmptype = bttranslatecmptype;
PG_RETURN_POINTER(amroutine);
}
@@ -1508,3 +1511,43 @@ btgettreeheight(Relation rel)
{
return _bt_getrootheight(rel);
}
CompareType
bttranslatestrategy(StrategyNumber strategy, Oid opfamily, Oid opcintype)
{
switch (strategy)
{
case BTLessStrategyNumber:
return COMPARE_LT;
case BTLessEqualStrategyNumber:
return COMPARE_LE;
case BTEqualStrategyNumber:
return COMPARE_EQ;
case BTGreaterEqualStrategyNumber:
return COMPARE_GE;
case BTGreaterStrategyNumber:
return COMPARE_GT;
default:
return COMPARE_INVALID;
}
}
StrategyNumber
bttranslatecmptype(CompareType cmptype, Oid opfamily, Oid opcintype)
{
switch (cmptype)
{
case COMPARE_LT:
return BTLessStrategyNumber;
case COMPARE_LE:
return BTLessEqualStrategyNumber;
case COMPARE_EQ:
return BTEqualStrategyNumber;
case COMPARE_GE:
return BTGreaterEqualStrategyNumber;
case COMPARE_GT:
return BTGreaterStrategyNumber;
default:
return InvalidStrategy;
}
}

View File

@@ -92,6 +92,8 @@ spghandler(PG_FUNCTION_ARGS)
amroutine->amestimateparallelscan = NULL;
amroutine->aminitparallelscan = NULL;
amroutine->amparallelrescan = NULL;
amroutine->amtranslatestrategy = NULL;
amroutine->amtranslatecmptype = NULL;
PG_RETURN_POINTER(amroutine);
}