mirror of
https://github.com/postgres/postgres.git
synced 2025-04-18 13:44:19 +03:00
Add support for sorted gist index builds to btree_gist
This enables sortsupport in the btree_gist extension for faster builds of gist indexes. Sorted gist index build strategy is the new default now. Regression tests are unchanged (except for one small change in the 'enum' test to add coverage for enum values added later) and are using the sorted build strategy instead. One version of this was committed a long time ago already, in commit 9f984ba6d2, but it was quickly reverted because of buildfarm failures. The failures were presumably caused by some small bugs, but we never got around to debug and commit it again. This patch was written from scratch, implementing the same idea, with some fragments and ideas from the original patch. Author: Bernd Helmle <mailings@oopsware.de> Author: Andrey Borodin <x4mmm@yandex-team.ru> Discussion: https://www.postgresql.org/message-id/64d324ce2a6d535d3f0f3baeeea7b25beff82ce4.camel@oopsware.de
This commit is contained in:
parent
9370978da8
commit
e4309f73f6
@ -34,7 +34,7 @@ DATA = btree_gist--1.0--1.1.sql \
|
||||
btree_gist--1.1--1.2.sql btree_gist--1.2.sql btree_gist--1.2--1.3.sql \
|
||||
btree_gist--1.3--1.4.sql btree_gist--1.4--1.5.sql \
|
||||
btree_gist--1.5--1.6.sql btree_gist--1.6--1.7.sql \
|
||||
btree_gist--1.7--1.8.sql
|
||||
btree_gist--1.7--1.8.sql btree_gist--1.8--1.9.sql
|
||||
PGFILEDESC = "btree_gist - B-tree equivalent GiST operator classes"
|
||||
|
||||
REGRESS = init int2 int4 int8 float4 float8 cash oid timestamp timestamptz \
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "btree_gist.h"
|
||||
#include "btree_utils_var.h"
|
||||
#include "utils/fmgrprotos.h"
|
||||
#include "utils/sortsupport.h"
|
||||
#include "utils/varbit.h"
|
||||
|
||||
/* GiST support functions */
|
||||
@ -15,6 +16,8 @@ PG_FUNCTION_INFO_V1(gbt_bit_picksplit);
|
||||
PG_FUNCTION_INFO_V1(gbt_bit_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_bit_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_bit_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_bit_sortsupport);
|
||||
PG_FUNCTION_INFO_V1(gbt_varbit_sortsupport);
|
||||
|
||||
|
||||
/* define for comparison */
|
||||
@ -200,3 +203,46 @@ gbt_bit_penalty(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_POINTER(gbt_var_penalty(result, o, n, PG_GET_COLLATION(),
|
||||
&tinfo, fcinfo->flinfo));
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_bit_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
GBT_VARKEY *key1 = PG_DETOAST_DATUM(x);
|
||||
GBT_VARKEY *key2 = PG_DETOAST_DATUM(y);
|
||||
|
||||
GBT_VARKEY_R arg1 = gbt_var_key_readable(key1);
|
||||
GBT_VARKEY_R arg2 = gbt_var_key_readable(key2);
|
||||
Datum result;
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
result = DirectFunctionCall2(byteacmp,
|
||||
PointerGetDatum(arg1.lower),
|
||||
PointerGetDatum(arg2.lower));
|
||||
|
||||
GBT_FREE_IF_COPY(key1, x);
|
||||
GBT_FREE_IF_COPY(key2, y);
|
||||
|
||||
return DatumGetInt32(result);
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_bit_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_bit_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_varbit_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_bit_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include "btree_gist.h"
|
||||
#include "btree_utils_num.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct boolkey
|
||||
{
|
||||
@ -20,6 +21,7 @@ PG_FUNCTION_INFO_V1(gbt_bool_picksplit);
|
||||
PG_FUNCTION_INFO_V1(gbt_bool_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_bool_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_bool_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_bool_sortsupport);
|
||||
|
||||
static bool
|
||||
gbt_boolgt(const void *a, const void *b, FmgrInfo *flinfo)
|
||||
@ -161,3 +163,24 @@ gbt_bool_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_bool_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
boolKEY *arg1 = (boolKEY *) DatumGetPointer(x);
|
||||
boolKEY *arg2 = (boolKEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
return (int32) arg1->lower - (int32) arg2->lower;
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_bool_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_bool_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "btree_gist.h"
|
||||
#include "btree_utils_var.h"
|
||||
#include "utils/fmgrprotos.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
/* GiST support functions */
|
||||
PG_FUNCTION_INFO_V1(gbt_bytea_compress);
|
||||
@ -14,6 +15,7 @@ PG_FUNCTION_INFO_V1(gbt_bytea_picksplit);
|
||||
PG_FUNCTION_INFO_V1(gbt_bytea_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_bytea_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_bytea_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_bytea_sortsupport);
|
||||
|
||||
|
||||
/* define for comparison */
|
||||
@ -156,3 +158,35 @@ gbt_bytea_penalty(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_POINTER(gbt_var_penalty(result, o, n, PG_GET_COLLATION(),
|
||||
&tinfo, fcinfo->flinfo));
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_bytea_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
GBT_VARKEY *key1 = PG_DETOAST_DATUM(x);
|
||||
GBT_VARKEY *key2 = PG_DETOAST_DATUM(y);
|
||||
|
||||
GBT_VARKEY_R xkey = gbt_var_key_readable(key1);
|
||||
GBT_VARKEY_R ykey = gbt_var_key_readable(key2);
|
||||
Datum result;
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
result = DirectFunctionCall2(byteacmp,
|
||||
PointerGetDatum(xkey.lower),
|
||||
PointerGetDatum(ykey.lower));
|
||||
|
||||
GBT_FREE_IF_COPY(key1, x);
|
||||
GBT_FREE_IF_COPY(key2, y);
|
||||
|
||||
return DatumGetInt32(result);
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_bytea_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_bytea_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "btree_utils_num.h"
|
||||
#include "common/int.h"
|
||||
#include "utils/cash.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@ -23,6 +24,7 @@ PG_FUNCTION_INFO_V1(gbt_cash_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_cash_distance);
|
||||
PG_FUNCTION_INFO_V1(gbt_cash_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_cash_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_cash_sortsupport);
|
||||
|
||||
static bool
|
||||
gbt_cashgt(const void *a, const void *b, FmgrInfo *flinfo)
|
||||
@ -210,3 +212,29 @@ gbt_cash_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_cash_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
cashKEY *arg1 = (cashKEY *) DatumGetPointer(x);
|
||||
cashKEY *arg2 = (cashKEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
if (arg1->lower > arg2->lower)
|
||||
return 1;
|
||||
else if (arg1->lower < arg2->lower)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_cash_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_cash_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "btree_utils_num.h"
|
||||
#include "utils/fmgrprotos.h"
|
||||
#include "utils/date.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@ -23,6 +24,7 @@ PG_FUNCTION_INFO_V1(gbt_date_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_date_distance);
|
||||
PG_FUNCTION_INFO_V1(gbt_date_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_date_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_date_sortsupport);
|
||||
|
||||
static bool
|
||||
gbt_dategt(const void *a, const void *b, FmgrInfo *flinfo)
|
||||
@ -249,3 +251,26 @@ gbt_date_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_date_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
dateKEY *akey = (dateKEY *) DatumGetPointer(x);
|
||||
dateKEY *bkey = (dateKEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
return DatumGetInt32(DirectFunctionCall2(date_cmp,
|
||||
DateADTGetDatum(akey->lower),
|
||||
DateADTGetDatum(bkey->lower)));
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_date_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_date_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -7,6 +7,8 @@
|
||||
#include "btree_utils_num.h"
|
||||
#include "fmgr.h"
|
||||
#include "utils/fmgrprotos.h"
|
||||
#include "utils/fmgroids.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
/* enums are really Oids, so we just use the same structure */
|
||||
|
||||
@ -24,6 +26,7 @@ PG_FUNCTION_INFO_V1(gbt_enum_picksplit);
|
||||
PG_FUNCTION_INFO_V1(gbt_enum_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_enum_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_enum_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_enum_sortsupport);
|
||||
|
||||
|
||||
static bool
|
||||
@ -179,3 +182,39 @@ gbt_enum_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_enum_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
oidKEY *arg1 = (oidKEY *) DatumGetPointer(x);
|
||||
oidKEY *arg2 = (oidKEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
return DatumGetInt32(CallerFInfoFunctionCall2(enum_cmp,
|
||||
ssup->ssup_extra,
|
||||
InvalidOid,
|
||||
arg1->lower,
|
||||
arg2->lower));
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_enum_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
FmgrInfo *flinfo;
|
||||
|
||||
ssup->comparator = gbt_enum_ssup_cmp;
|
||||
|
||||
/*
|
||||
* Since gbt_enum_ssup_cmp() uses enum_cmp() like the rest of the
|
||||
* comparison functions, it also needs to pass flinfo when calling it. The
|
||||
* caller to a SortSupport comparison function doesn't provide an FmgrInfo
|
||||
* struct, so look it up now, save it in ssup_extra and use it in
|
||||
* gbt_enum_ssup_cmp() later.
|
||||
*/
|
||||
flinfo = MemoryContextAlloc(ssup->ssup_cxt, sizeof(FmgrInfo));
|
||||
fmgr_info_cxt(F_ENUM_CMP, flinfo, ssup->ssup_cxt);
|
||||
ssup->ssup_extra = flinfo;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "btree_gist.h"
|
||||
#include "btree_utils_num.h"
|
||||
#include "utils/float.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct float4key
|
||||
{
|
||||
@ -22,6 +23,7 @@ PG_FUNCTION_INFO_V1(gbt_float4_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_float4_distance);
|
||||
PG_FUNCTION_INFO_V1(gbt_float4_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_float4_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_float4_sortsupport);
|
||||
|
||||
static bool
|
||||
gbt_float4gt(const void *a, const void *b, FmgrInfo *flinfo)
|
||||
@ -204,3 +206,24 @@ gbt_float4_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_float4_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
float4KEY *arg1 = (float4KEY *) DatumGetPointer(x);
|
||||
float4KEY *arg2 = (float4KEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
return float4_cmp_internal(arg1->lower, arg2->lower);
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_float4_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_float4_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "btree_gist.h"
|
||||
#include "btree_utils_num.h"
|
||||
#include "utils/float.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct float8key
|
||||
{
|
||||
@ -22,6 +23,7 @@ PG_FUNCTION_INFO_V1(gbt_float8_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_float8_distance);
|
||||
PG_FUNCTION_INFO_V1(gbt_float8_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_float8_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_float8_sortsupport);
|
||||
|
||||
|
||||
static bool
|
||||
@ -212,3 +214,24 @@ gbt_float8_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_float8_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
float8KEY *arg1 = (float8KEY *) DatumGetPointer(x);
|
||||
float8KEY *arg2 = (float8KEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
return float8_cmp_internal(arg1->lower, arg2->lower);
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_float8_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_float8_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
197
contrib/btree_gist/btree_gist--1.8--1.9.sql
Normal file
197
contrib/btree_gist/btree_gist--1.8--1.9.sql
Normal file
@ -0,0 +1,197 @@
|
||||
/* contrib/btree_gist/btree_gist--1.7--1.8.sql */
|
||||
|
||||
-- complain if script is sourced in psql, rather than via CREATE EXTENSION
|
||||
\echo Use "ALTER EXTENSION btree_gist UPDATE TO '1.9'" to load this file. \quit
|
||||
|
||||
CREATE FUNCTION gbt_bit_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_varbit_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_bool_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_bytea_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_cash_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_date_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_enum_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_float4_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_float8_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_inet_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_int2_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_int4_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_int8_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_intv_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_macaddr_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_macad8_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_numeric_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_oid_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_text_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_bpchar_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_time_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_ts_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
CREATE FUNCTION gbt_uuid_sortsupport(internal)
|
||||
RETURNS void
|
||||
AS 'MODULE_PATHNAME'
|
||||
LANGUAGE C IMMUTABLE PARALLEL SAFE STRICT;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_bit_ops USING gist ADD
|
||||
FUNCTION 11 (bit, bit) gbt_bit_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_vbit_ops USING gist ADD
|
||||
FUNCTION 11 (varbit, varbit) gbt_varbit_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_bool_ops USING gist ADD
|
||||
FUNCTION 11 (bool, bool) gbt_bool_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_bytea_ops USING gist ADD
|
||||
FUNCTION 11 (bytea, bytea) gbt_bytea_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_cash_ops USING gist ADD
|
||||
FUNCTION 11 (money, money) gbt_cash_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_date_ops USING gist ADD
|
||||
FUNCTION 11 (date, date) gbt_date_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_enum_ops USING gist ADD
|
||||
FUNCTION 11 (anyenum, anyenum) gbt_enum_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_float4_ops USING gist ADD
|
||||
FUNCTION 11 (float4, float4) gbt_float4_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_float8_ops USING gist ADD
|
||||
FUNCTION 11 (float8, float8) gbt_float8_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_inet_ops USING gist ADD
|
||||
FUNCTION 11 (inet, inet) gbt_inet_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_cidr_ops USING gist ADD
|
||||
FUNCTION 11 (cidr, cidr) gbt_inet_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_int2_ops USING gist ADD
|
||||
FUNCTION 11 (int2, int2) gbt_int2_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_int4_ops USING gist ADD
|
||||
FUNCTION 11 (int4, int4) gbt_int4_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_int8_ops USING gist ADD
|
||||
FUNCTION 11 (int8, int8) gbt_int8_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_interval_ops USING gist ADD
|
||||
FUNCTION 11 (interval, interval) gbt_intv_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_macaddr_ops USING gist ADD
|
||||
FUNCTION 11 (macaddr, macaddr) gbt_macaddr_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_macaddr8_ops USING gist ADD
|
||||
FUNCTION 11 (macaddr8, macaddr8) gbt_macad8_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_numeric_ops USING gist ADD
|
||||
FUNCTION 11 (numeric, numeric) gbt_numeric_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_oid_ops USING gist ADD
|
||||
FUNCTION 11 (oid, oid) gbt_oid_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_text_ops USING gist ADD
|
||||
FUNCTION 11 (text, text) gbt_text_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_bpchar_ops USING gist ADD
|
||||
FUNCTION 11 (bpchar, bpchar) gbt_bpchar_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_time_ops USING gist ADD
|
||||
FUNCTION 11 (time, time) gbt_time_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_timetz_ops USING gist ADD
|
||||
FUNCTION 11 (timetz, timetz) gbt_time_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_timestamp_ops USING gist ADD
|
||||
FUNCTION 11 (timestamp, timestamp) gbt_ts_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_timestamptz_ops USING gist ADD
|
||||
FUNCTION 11 (timestamptz, timestamptz) gbt_ts_sortsupport (internal) ;
|
||||
|
||||
ALTER OPERATOR FAMILY gist_uuid_ops USING gist ADD
|
||||
FUNCTION 11 (uuid, uuid) gbt_uuid_sortsupport (internal) ;
|
@ -1,6 +1,6 @@
|
||||
# btree_gist extension
|
||||
comment = 'support for indexing common datatypes in GiST'
|
||||
default_version = '1.8'
|
||||
default_version = '1.9'
|
||||
module_pathname = '$libdir/btree_gist'
|
||||
relocatable = true
|
||||
trusted = true
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "btree_utils_num.h"
|
||||
#include "catalog/pg_type.h"
|
||||
#include "utils/builtins.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct inetkey
|
||||
{
|
||||
@ -21,6 +22,7 @@ PG_FUNCTION_INFO_V1(gbt_inet_picksplit);
|
||||
PG_FUNCTION_INFO_V1(gbt_inet_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_inet_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_inet_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_inet_sortsupport);
|
||||
|
||||
|
||||
static bool
|
||||
@ -178,3 +180,29 @@ gbt_inet_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_inet_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
inetKEY *arg1 = (inetKEY *) DatumGetPointer(x);
|
||||
inetKEY *arg2 = (inetKEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
if (arg1->lower < arg2->lower)
|
||||
return -1;
|
||||
else if (arg1->lower > arg2->lower)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_inet_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_inet_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "btree_gist.h"
|
||||
#include "btree_utils_num.h"
|
||||
#include "common/int.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct int16key
|
||||
{
|
||||
@ -22,6 +23,7 @@ PG_FUNCTION_INFO_V1(gbt_int2_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_int2_distance);
|
||||
PG_FUNCTION_INFO_V1(gbt_int2_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_int2_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_int2_sortsupport);
|
||||
|
||||
|
||||
static bool
|
||||
@ -209,3 +211,27 @@ gbt_int2_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_int2_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
int16KEY *arg1 = (int16KEY *) DatumGetPointer(x);
|
||||
int16KEY *arg2 = (int16KEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
if (arg1->lower < arg2->lower)
|
||||
return -1;
|
||||
else if (arg1->lower > arg2->lower)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_int2_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_int2_ssup_cmp;
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -2,10 +2,10 @@
|
||||
* contrib/btree_gist/btree_int4.c
|
||||
*/
|
||||
#include "postgres.h"
|
||||
|
||||
#include "btree_gist.h"
|
||||
#include "btree_utils_num.h"
|
||||
#include "common/int.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct int32key
|
||||
{
|
||||
@ -22,6 +22,7 @@ PG_FUNCTION_INFO_V1(gbt_int4_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_int4_distance);
|
||||
PG_FUNCTION_INFO_V1(gbt_int4_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_int4_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_int4_sortsupport);
|
||||
|
||||
static bool
|
||||
gbt_int4gt(const void *a, const void *b, FmgrInfo *flinfo)
|
||||
@ -208,3 +209,27 @@ gbt_int4_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_int4_ssup_cmp(Datum a, Datum b, SortSupport ssup)
|
||||
{
|
||||
int32KEY *ia = (int32KEY *) DatumGetPointer(a);
|
||||
int32KEY *ib = (int32KEY *) DatumGetPointer(b);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
if (ia->lower < ib->lower)
|
||||
return -1;
|
||||
else if (ia->lower > ib->lower)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_int4_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_int4_ssup_cmp;
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "btree_gist.h"
|
||||
#include "btree_utils_num.h"
|
||||
#include "common/int.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct int64key
|
||||
{
|
||||
@ -22,6 +23,7 @@ PG_FUNCTION_INFO_V1(gbt_int8_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_int8_distance);
|
||||
PG_FUNCTION_INFO_V1(gbt_int8_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_int8_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_int8_sortsupport);
|
||||
|
||||
|
||||
static bool
|
||||
@ -209,3 +211,28 @@ gbt_int8_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_int8_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
int64KEY *arg1 = (int64KEY *) DatumGetPointer(x);
|
||||
int64KEY *arg2 = (int64KEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
if (arg1->lower < arg2->lower)
|
||||
return -1;
|
||||
else if (arg1->lower > arg2->lower)
|
||||
return 1;
|
||||
else
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_int8_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_int8_ssup_cmp;
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "btree_gist.h"
|
||||
#include "btree_utils_num.h"
|
||||
#include "utils/fmgrprotos.h"
|
||||
#include "utils/sortsupport.h"
|
||||
#include "utils/timestamp.h"
|
||||
|
||||
typedef struct
|
||||
@ -24,6 +25,7 @@ PG_FUNCTION_INFO_V1(gbt_intv_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_intv_distance);
|
||||
PG_FUNCTION_INFO_V1(gbt_intv_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_intv_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_intv_sortsupport);
|
||||
|
||||
|
||||
static bool
|
||||
@ -291,3 +293,26 @@ gbt_intv_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_intv_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
intvKEY *arg1 = (intvKEY *) DatumGetPointer(x);
|
||||
intvKEY *arg2 = (intvKEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
return DatumGetInt32(DirectFunctionCall2(interval_cmp,
|
||||
IntervalPGetDatum(&arg1->lower),
|
||||
IntervalPGetDatum(&arg2->lower)));
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_intv_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_intv_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "btree_utils_num.h"
|
||||
#include "utils/fmgrprotos.h"
|
||||
#include "utils/inet.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@ -23,6 +24,7 @@ PG_FUNCTION_INFO_V1(gbt_macad_picksplit);
|
||||
PG_FUNCTION_INFO_V1(gbt_macad_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_macad_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_macad_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_macaddr_sortsupport);
|
||||
|
||||
|
||||
static bool
|
||||
@ -188,3 +190,26 @@ gbt_macad_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_macaddr_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
macKEY *arg1 = (macKEY *) DatumGetPointer(x);
|
||||
macKEY *arg2 = (macKEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
return DatumGetInt32(DirectFunctionCall2(macaddr_cmp,
|
||||
MacaddrPGetDatum(&arg1->lower),
|
||||
MacaddrPGetDatum(&arg2->lower)));
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_macaddr_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_macaddr_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "btree_utils_num.h"
|
||||
#include "utils/fmgrprotos.h"
|
||||
#include "utils/inet.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@ -23,6 +24,7 @@ PG_FUNCTION_INFO_V1(gbt_macad8_picksplit);
|
||||
PG_FUNCTION_INFO_V1(gbt_macad8_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_macad8_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_macad8_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_macad8_sortsupport);
|
||||
|
||||
static bool
|
||||
gbt_macad8gt(const void *a, const void *b, FmgrInfo *flinfo)
|
||||
@ -185,3 +187,26 @@ gbt_macad8_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_macaddr8_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
mac8KEY *arg1 = (mac8KEY *) DatumGetPointer(x);
|
||||
mac8KEY *arg2 = (mac8KEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
return DatumGetInt32(DirectFunctionCall2(macaddr8_cmp,
|
||||
Macaddr8PGetDatum(&arg1->lower),
|
||||
Macaddr8PGetDatum(&arg2->lower)));
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_macad8_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_macaddr8_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -11,6 +11,7 @@
|
||||
#include "utils/builtins.h"
|
||||
#include "utils/numeric.h"
|
||||
#include "utils/rel.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
/* GiST support functions */
|
||||
PG_FUNCTION_INFO_V1(gbt_numeric_compress);
|
||||
@ -19,6 +20,7 @@ PG_FUNCTION_INFO_V1(gbt_numeric_picksplit);
|
||||
PG_FUNCTION_INFO_V1(gbt_numeric_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_numeric_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_numeric_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_numeric_sortsupport);
|
||||
|
||||
|
||||
/* define for comparison */
|
||||
@ -216,3 +218,35 @@ gbt_numeric_picksplit(PG_FUNCTION_ARGS)
|
||||
&tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(v);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_numeric_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
GBT_VARKEY *key1 = PG_DETOAST_DATUM(x);
|
||||
GBT_VARKEY *key2 = PG_DETOAST_DATUM(y);
|
||||
|
||||
GBT_VARKEY_R arg1 = gbt_var_key_readable(key1);
|
||||
GBT_VARKEY_R arg2 = gbt_var_key_readable(key2);
|
||||
Datum result;
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
result = DirectFunctionCall2(numeric_cmp,
|
||||
PointerGetDatum(arg1.lower),
|
||||
PointerGetDatum(arg2.lower));
|
||||
|
||||
GBT_FREE_IF_COPY(key1, x);
|
||||
GBT_FREE_IF_COPY(key2, y);
|
||||
|
||||
return DatumGetInt32(result);
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_numeric_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_numeric_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -5,6 +5,7 @@
|
||||
|
||||
#include "btree_gist.h"
|
||||
#include "btree_utils_num.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@ -21,6 +22,7 @@ PG_FUNCTION_INFO_V1(gbt_oid_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_oid_distance);
|
||||
PG_FUNCTION_INFO_V1(gbt_oid_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_oid_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_oid_sortsupport);
|
||||
|
||||
|
||||
static bool
|
||||
@ -209,3 +211,29 @@ gbt_oid_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_oid_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
oidKEY *arg1 = (oidKEY *) DatumGetPointer(x);
|
||||
oidKEY *arg2 = (oidKEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
if (arg1->lower > arg2->lower)
|
||||
return 1;
|
||||
else if (arg1->lower < arg2->lower)
|
||||
return -1;
|
||||
else
|
||||
return 0;
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_oid_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_oid_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "btree_utils_var.h"
|
||||
#include "mb/pg_wchar.h"
|
||||
#include "utils/fmgrprotos.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
/* GiST support functions */
|
||||
PG_FUNCTION_INFO_V1(gbt_text_compress);
|
||||
@ -17,6 +18,8 @@ PG_FUNCTION_INFO_V1(gbt_text_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_bpchar_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_text_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_text_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_text_sortsupport);
|
||||
PG_FUNCTION_INFO_V1(gbt_bpchar_sortsupport);
|
||||
|
||||
|
||||
/* define for comparison */
|
||||
@ -279,3 +282,69 @@ gbt_text_penalty(PG_FUNCTION_ARGS)
|
||||
PG_RETURN_POINTER(gbt_var_penalty(result, o, n, PG_GET_COLLATION(),
|
||||
&tinfo, fcinfo->flinfo));
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_text_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
GBT_VARKEY *key1 = PG_DETOAST_DATUM(x);
|
||||
GBT_VARKEY *key2 = PG_DETOAST_DATUM(y);
|
||||
|
||||
GBT_VARKEY_R arg1 = gbt_var_key_readable(key1);
|
||||
GBT_VARKEY_R arg2 = gbt_var_key_readable(key2);
|
||||
Datum result;
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
result = DirectFunctionCall2Coll(bttextcmp,
|
||||
ssup->ssup_collation,
|
||||
PointerGetDatum(arg1.lower),
|
||||
PointerGetDatum(arg2.lower));
|
||||
|
||||
GBT_FREE_IF_COPY(key1, x);
|
||||
GBT_FREE_IF_COPY(key2, y);
|
||||
|
||||
return DatumGetInt32(result);
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_text_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_text_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_bpchar_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
GBT_VARKEY *key1 = PG_DETOAST_DATUM(x);
|
||||
GBT_VARKEY *key2 = PG_DETOAST_DATUM(y);
|
||||
|
||||
GBT_VARKEY_R arg1 = gbt_var_key_readable(key1);
|
||||
GBT_VARKEY_R arg2 = gbt_var_key_readable(key2);
|
||||
Datum result;
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
result = DirectFunctionCall2Coll(bpcharcmp,
|
||||
ssup->ssup_collation,
|
||||
PointerGetDatum(arg1.lower),
|
||||
PointerGetDatum(arg2.lower));
|
||||
|
||||
GBT_FREE_IF_COPY(key1, x);
|
||||
GBT_FREE_IF_COPY(key2, y);
|
||||
|
||||
return DatumGetInt32(result);
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_bpchar_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_bpchar_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include "btree_utils_num.h"
|
||||
#include "utils/fmgrprotos.h"
|
||||
#include "utils/date.h"
|
||||
#include "utils/sortsupport.h"
|
||||
#include "utils/timestamp.h"
|
||||
|
||||
typedef struct
|
||||
@ -26,6 +27,8 @@ PG_FUNCTION_INFO_V1(gbt_time_distance);
|
||||
PG_FUNCTION_INFO_V1(gbt_timetz_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_time_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_time_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_time_sortsupport);
|
||||
PG_FUNCTION_INFO_V1(gbt_timetz_sortsupport);
|
||||
|
||||
|
||||
#ifdef USE_FLOAT8_BYVAL
|
||||
@ -322,3 +325,26 @@ gbt_time_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_timekey_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
timeKEY *arg1 = (timeKEY *) DatumGetPointer(x);
|
||||
timeKEY *arg2 = (timeKEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
return DatumGetInt32(DirectFunctionCall2(time_cmp,
|
||||
TimeADTGetDatumFast(arg1->lower),
|
||||
TimeADTGetDatumFast(arg2->lower)));
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_time_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_timekey_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -10,6 +10,7 @@
|
||||
#include "utils/fmgrprotos.h"
|
||||
#include "utils/timestamp.h"
|
||||
#include "utils/float.h"
|
||||
#include "utils/sortsupport.h"
|
||||
|
||||
typedef struct
|
||||
{
|
||||
@ -29,6 +30,7 @@ PG_FUNCTION_INFO_V1(gbt_tstz_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_tstz_distance);
|
||||
PG_FUNCTION_INFO_V1(gbt_ts_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_ts_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_ts_sortsupport);
|
||||
|
||||
|
||||
#ifdef USE_FLOAT8_BYVAL
|
||||
@ -393,3 +395,26 @@ gbt_ts_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_ts_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
tsKEY *arg1 = (tsKEY *) DatumGetPointer(x);
|
||||
tsKEY *arg2 = (tsKEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
return DatumGetInt32(DirectFunctionCall2(timestamp_cmp,
|
||||
TimestampGetDatumFast(arg1->lower),
|
||||
TimestampGetDatumFast(arg2->lower)));
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_ts_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_ts_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -41,7 +41,17 @@ typedef struct
|
||||
GBT_VARKEY *(*f_l2n) (GBT_VARKEY *, FmgrInfo *flinfo); /* convert leaf to node */
|
||||
} gbtree_vinfo;
|
||||
|
||||
|
||||
/*
|
||||
* Free ptr1 in case its a copy of ptr2.
|
||||
*
|
||||
* This is adapted from varlena's PG_FREE_IF_COPY, though doesn't require
|
||||
* fcinfo access.
|
||||
*/
|
||||
#define GBT_FREE_IF_COPY(ptr1, ptr2) \
|
||||
do { \
|
||||
if ((Pointer) (ptr1) != DatumGetPointer(ptr2)) \
|
||||
pfree(ptr1); \
|
||||
} while (0)
|
||||
|
||||
extern GBT_VARKEY_R gbt_var_key_readable(const GBT_VARKEY *k);
|
||||
|
||||
|
@ -6,6 +6,7 @@
|
||||
#include "btree_gist.h"
|
||||
#include "btree_utils_num.h"
|
||||
#include "port/pg_bswap.h"
|
||||
#include "utils/sortsupport.h"
|
||||
#include "utils/uuid.h"
|
||||
|
||||
typedef struct
|
||||
@ -23,6 +24,7 @@ PG_FUNCTION_INFO_V1(gbt_uuid_picksplit);
|
||||
PG_FUNCTION_INFO_V1(gbt_uuid_consistent);
|
||||
PG_FUNCTION_INFO_V1(gbt_uuid_penalty);
|
||||
PG_FUNCTION_INFO_V1(gbt_uuid_same);
|
||||
PG_FUNCTION_INFO_V1(gbt_uuid_sortsupport);
|
||||
|
||||
|
||||
static int
|
||||
@ -230,3 +232,24 @@ gbt_uuid_same(PG_FUNCTION_ARGS)
|
||||
*result = gbt_num_same((void *) b1, (void *) b2, &tinfo, fcinfo->flinfo);
|
||||
PG_RETURN_POINTER(result);
|
||||
}
|
||||
|
||||
static int
|
||||
gbt_uuid_ssup_cmp(Datum x, Datum y, SortSupport ssup)
|
||||
{
|
||||
uuidKEY *arg1 = (uuidKEY *) DatumGetPointer(x);
|
||||
uuidKEY *arg2 = (uuidKEY *) DatumGetPointer(y);
|
||||
|
||||
/* for leaf items we expect lower == upper, so only compare lower */
|
||||
return uuid_internal_cmp(&arg1->lower, &arg2->lower);
|
||||
}
|
||||
|
||||
Datum
|
||||
gbt_uuid_sortsupport(PG_FUNCTION_ARGS)
|
||||
{
|
||||
SortSupport ssup = (SortSupport) PG_GETARG_POINTER(0);
|
||||
|
||||
ssup->comparator = gbt_uuid_ssup_cmp;
|
||||
ssup->ssup_extra = NULL;
|
||||
|
||||
PG_RETURN_VOID();
|
||||
}
|
||||
|
@ -1,5 +1,8 @@
|
||||
-- enum check
|
||||
create type rainbow as enum ('r','o','y','g','b','i','v');
|
||||
create type rainbow as enum ('r','o','g','b','i','v');
|
||||
-- enum values added later take some different codepaths internally,
|
||||
-- so make sure we have coverage for those too
|
||||
alter type rainbow add value 'y' before 'g';
|
||||
CREATE TABLE enumtmp (a rainbow);
|
||||
\copy enumtmp from 'data/enum.data'
|
||||
SET enable_seqscan=on;
|
||||
|
@ -51,6 +51,7 @@ install_data(
|
||||
'btree_gist--1.5--1.6.sql',
|
||||
'btree_gist--1.6--1.7.sql',
|
||||
'btree_gist--1.7--1.8.sql',
|
||||
'btree_gist--1.8--1.9.sql',
|
||||
kwargs: contrib_data_args,
|
||||
)
|
||||
|
||||
|
@ -1,6 +1,10 @@
|
||||
-- enum check
|
||||
|
||||
create type rainbow as enum ('r','o','y','g','b','i','v');
|
||||
create type rainbow as enum ('r','o','g','b','i','v');
|
||||
|
||||
-- enum values added later take some different codepaths internally,
|
||||
-- so make sure we have coverage for those too
|
||||
alter type rainbow add value 'y' before 'g';
|
||||
|
||||
CREATE TABLE enumtmp (a rainbow);
|
||||
|
||||
|
@ -52,6 +52,13 @@
|
||||
<type>oid</type>, and <type>money</type>.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
By default <filename>btree_gist</filename> builds <acronym>GiST</acronym> index with
|
||||
<function>sortsupport</function> in <firstterm>sorted</firstterm> mode. This usually results in
|
||||
much faster index built speed. It is still possible to revert to buffered built strategy
|
||||
by using the <literal>buffering</literal> parameter when creating the index.
|
||||
</para>
|
||||
|
||||
<para>
|
||||
This module is considered <quote>trusted</quote>, that is, it can be
|
||||
installed by non-superusers who have <literal>CREATE</literal> privilege
|
||||
|
Loading…
x
Reference in New Issue
Block a user