mirror of
https://github.com/postgres/postgres.git
synced 2025-11-09 06:21:09 +03:00
Create a "sort support" interface API for faster sorting.
This patch creates an API whereby a btree index opclass can optionally provide non-SQL-callable support functions for sorting. In the initial patch, we only use this to provide a directly-callable comparator function, which can be invoked with a bit less overhead than the traditional SQL-callable comparator. While that should be of value in itself, the real reason for doing this is to provide a datatype-extensible framework for more aggressive optimizations, as in Peter Geoghegan's recent work. Robert Haas and Tom Lane
This commit is contained in:
@@ -49,6 +49,7 @@
|
||||
#include "postgres.h"
|
||||
|
||||
#include "utils/builtins.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
|
||||
Datum
|
||||
@@ -69,6 +70,24 @@ btint2cmp(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_INT32((int32) a - (int32) b);
|
||||
}
|
||||
|
||||
static int
|
||||
btint2fastcmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
int16 a = DatumGetInt16(x);
|
||||
int16 b = DatumGetInt16(y);
|
||||
|
||||
return (int) a - (int) b;
|
||||
}
|
||||
|
||||
Datum
|
||||
btint2sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = btint2fastcmp;
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
Datum
|
||||
btint4cmp(PG_FUNCTION_ARGS)
|
||||
{
|
||||
@@ -83,6 +102,29 @@ btint4cmp(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_INT32(-1);
|
||||
}
|
||||
|
||||
static int
|
||||
btint4fastcmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
int32 a = DatumGetInt32(x);
|
||||
int32 b = DatumGetInt32(y);
|
||||
|
||||
if (a > b)
|
||||
return 1;
|
||||
else if (a == b)
|
||||
return 0;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
Datum
|
||||
btint4sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = btint4fastcmp;
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
Datum
|
||||
btint8cmp(PG_FUNCTION_ARGS)
|
||||
{
|
||||
@@ -97,6 +139,29 @@ btint8cmp(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_INT32(-1);
|
||||
}
|
||||
|
||||
static int
|
||||
btint8fastcmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
int64 a = DatumGetInt64(x);
|
||||
int64 b = DatumGetInt64(y);
|
||||
|
||||
if (a > b)
|
||||
return 1;
|
||||
else if (a == b)
|
||||
return 0;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
Datum
|
||||
btint8sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = btint8fastcmp;
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
Datum
|
||||
btint48cmp(PG_FUNCTION_ARGS)
|
||||
{
|
||||
@@ -195,6 +260,29 @@ btoidcmp(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_INT32(-1);
|
||||
}
|
||||
|
||||
static int
|
||||
btoidfastcmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
Oid a = DatumGetObjectId(x);
|
||||
Oid b = DatumGetObjectId(y);
|
||||
|
||||
if (a > b)
|
||||
return 1;
|
||||
else if (a == b)
|
||||
return 0;
|
||||
else
|
||||
return -1;
|
||||
}
|
||||
|
||||
Datum
|
||||
btoidsortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = btoidfastcmp;
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
Datum
|
||||
btoidvectorcmp(PG_FUNCTION_ARGS)
|
||||
{
|
||||
@@ -237,3 +325,21 @@ btnamecmp(PG_FUNCTION_ARGS)
|
||||
|
||||
PG_RETURN_INT32(strncmp(NameStr(*a), NameStr(*b), NAMEDATALEN));
|
||||
}
|
||||
|
||||
static int
|
||||
btnamefastcmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
Name a = DatumGetName(x);
|
||||
Name b = DatumGetName(y);
|
||||
|
||||
return strncmp(NameStr(*a), NameStr(*b), NAMEDATALEN);
|
||||
}
|
||||
|
||||
Datum
|
||||
btnamesortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = btnamefastcmp;
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user