PolarDB-for-PostgreSQL
170 строк · 3.9 Кб
1/*
2* contrib/btree_gist/btree_bytea.c
3*/
4#include "postgres.h"5
6#include "btree_gist.h"7#include "btree_utils_var.h"8#include "utils/builtins.h"9#include "utils/bytea.h"10
11
12/*
13** Bytea ops
14*/
15PG_FUNCTION_INFO_V1(gbt_bytea_compress);16PG_FUNCTION_INFO_V1(gbt_bytea_union);17PG_FUNCTION_INFO_V1(gbt_bytea_picksplit);18PG_FUNCTION_INFO_V1(gbt_bytea_consistent);19PG_FUNCTION_INFO_V1(gbt_bytea_penalty);20PG_FUNCTION_INFO_V1(gbt_bytea_same);21
22
23/* define for comparison */
24
25static bool26gbt_byteagt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)27{
28return DatumGetBool(DirectFunctionCall2(byteagt,29PointerGetDatum(a),30PointerGetDatum(b)));31}
32
33static bool34gbt_byteage(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)35{
36return DatumGetBool(DirectFunctionCall2(byteage,37PointerGetDatum(a),38PointerGetDatum(b)));39}
40
41static bool42gbt_byteaeq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)43{
44return DatumGetBool(DirectFunctionCall2(byteaeq,45PointerGetDatum(a),46PointerGetDatum(b)));47}
48
49static bool50gbt_byteale(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)51{
52return DatumGetBool(DirectFunctionCall2(byteale,53PointerGetDatum(a),54PointerGetDatum(b)));55}
56
57static bool58gbt_bytealt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)59{
60return DatumGetBool(DirectFunctionCall2(bytealt,61PointerGetDatum(a),62PointerGetDatum(b)));63}
64
65static int3266gbt_byteacmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)67{
68return DatumGetInt32(DirectFunctionCall2(byteacmp,69PointerGetDatum(a),70PointerGetDatum(b)));71}
72
73
74static const gbtree_vinfo tinfo =75{
76gbt_t_bytea,770,78true,79gbt_byteagt,80gbt_byteage,81gbt_byteaeq,82gbt_byteale,83gbt_bytealt,84gbt_byteacmp,85NULL86};87
88
89/**************************************************
90* Text ops
91**************************************************/
92
93
94Datum
95gbt_bytea_compress(PG_FUNCTION_ARGS)96{
97GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);98
99PG_RETURN_POINTER(gbt_var_compress(entry, &tinfo));100}
101
102
103
104Datum
105gbt_bytea_consistent(PG_FUNCTION_ARGS)106{
107GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);108void *query = (void *) DatumGetByteaP(PG_GETARG_DATUM(1));109StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);110
111/* Oid subtype = PG_GETARG_OID(3); */112bool *recheck = (bool *) PG_GETARG_POINTER(4);113bool retval;114GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);115GBT_VARKEY_R r = gbt_var_key_readable(key);116
117/* All cases served by this function are exact */118*recheck = false;119
120retval = gbt_var_consistent(&r, query, strategy, PG_GET_COLLATION(),121GIST_LEAF(entry), &tinfo, fcinfo->flinfo);122PG_RETURN_BOOL(retval);123}
124
125
126
127Datum
128gbt_bytea_union(PG_FUNCTION_ARGS)129{
130GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);131int32 *size = (int *) PG_GETARG_POINTER(1);132
133PG_RETURN_POINTER(gbt_var_union(entryvec, size, PG_GET_COLLATION(),134&tinfo, fcinfo->flinfo));135}
136
137
138Datum
139gbt_bytea_picksplit(PG_FUNCTION_ARGS)140{
141GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);142GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);143
144gbt_var_picksplit(entryvec, v, PG_GET_COLLATION(),145&tinfo, fcinfo->flinfo);146PG_RETURN_POINTER(v);147}
148
149Datum
150gbt_bytea_same(PG_FUNCTION_ARGS)151{
152Datum d1 = PG_GETARG_DATUM(0);153Datum d2 = PG_GETARG_DATUM(1);154bool *result = (bool *) PG_GETARG_POINTER(2);155
156*result = gbt_var_same(d1, d2, PG_GET_COLLATION(), &tinfo, fcinfo->flinfo);157PG_RETURN_POINTER(result);158}
159
160
161Datum
162gbt_bytea_penalty(PG_FUNCTION_ARGS)163{
164GISTENTRY *o = (GISTENTRY *) PG_GETARG_POINTER(0);165GISTENTRY *n = (GISTENTRY *) PG_GETARG_POINTER(1);166float *result = (float *) PG_GETARG_POINTER(2);167
168PG_RETURN_POINTER(gbt_var_penalty(result, o, n, PG_GET_COLLATION(),169&tinfo, fcinfo->flinfo));170}
171