PolarDB-for-PostgreSQL

Форк
0
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
*/
15
PG_FUNCTION_INFO_V1(gbt_bytea_compress);
16
PG_FUNCTION_INFO_V1(gbt_bytea_union);
17
PG_FUNCTION_INFO_V1(gbt_bytea_picksplit);
18
PG_FUNCTION_INFO_V1(gbt_bytea_consistent);
19
PG_FUNCTION_INFO_V1(gbt_bytea_penalty);
20
PG_FUNCTION_INFO_V1(gbt_bytea_same);
21

22

23
/* define for comparison */
24

25
static bool
26
gbt_byteagt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
27
{
28
	return DatumGetBool(DirectFunctionCall2(byteagt,
29
											PointerGetDatum(a),
30
											PointerGetDatum(b)));
31
}
32

33
static bool
34
gbt_byteage(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
35
{
36
	return DatumGetBool(DirectFunctionCall2(byteage,
37
											PointerGetDatum(a),
38
											PointerGetDatum(b)));
39
}
40

41
static bool
42
gbt_byteaeq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
43
{
44
	return DatumGetBool(DirectFunctionCall2(byteaeq,
45
											PointerGetDatum(a),
46
											PointerGetDatum(b)));
47
}
48

49
static bool
50
gbt_byteale(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
51
{
52
	return DatumGetBool(DirectFunctionCall2(byteale,
53
											PointerGetDatum(a),
54
											PointerGetDatum(b)));
55
}
56

57
static bool
58
gbt_bytealt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
59
{
60
	return DatumGetBool(DirectFunctionCall2(bytealt,
61
											PointerGetDatum(a),
62
											PointerGetDatum(b)));
63
}
64

65
static int32
66
gbt_byteacmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
67
{
68
	return DatumGetInt32(DirectFunctionCall2(byteacmp,
69
											 PointerGetDatum(a),
70
											 PointerGetDatum(b)));
71
}
72

73

74
static const gbtree_vinfo tinfo =
75
{
76
	gbt_t_bytea,
77
	0,
78
	true,
79
	gbt_byteagt,
80
	gbt_byteage,
81
	gbt_byteaeq,
82
	gbt_byteale,
83
	gbt_bytealt,
84
	gbt_byteacmp,
85
	NULL
86
};
87

88

89
/**************************************************
90
 * Text ops
91
 **************************************************/
92

93

94
Datum
95
gbt_bytea_compress(PG_FUNCTION_ARGS)
96
{
97
	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
98

99
	PG_RETURN_POINTER(gbt_var_compress(entry, &tinfo));
100
}
101

102

103

104
Datum
105
gbt_bytea_consistent(PG_FUNCTION_ARGS)
106
{
107
	GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
108
	void	   *query = (void *) DatumGetByteaP(PG_GETARG_DATUM(1));
109
	StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
110

111
	/* Oid		subtype = PG_GETARG_OID(3); */
112
	bool	   *recheck = (bool *) PG_GETARG_POINTER(4);
113
	bool		retval;
114
	GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
115
	GBT_VARKEY_R r = gbt_var_key_readable(key);
116

117
	/* All cases served by this function are exact */
118
	*recheck = false;
119

120
	retval = gbt_var_consistent(&r, query, strategy, PG_GET_COLLATION(),
121
								GIST_LEAF(entry), &tinfo, fcinfo->flinfo);
122
	PG_RETURN_BOOL(retval);
123
}
124

125

126

127
Datum
128
gbt_bytea_union(PG_FUNCTION_ARGS)
129
{
130
	GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
131
	int32	   *size = (int *) PG_GETARG_POINTER(1);
132

133
	PG_RETURN_POINTER(gbt_var_union(entryvec, size, PG_GET_COLLATION(),
134
									&tinfo, fcinfo->flinfo));
135
}
136

137

138
Datum
139
gbt_bytea_picksplit(PG_FUNCTION_ARGS)
140
{
141
	GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
142
	GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
143

144
	gbt_var_picksplit(entryvec, v, PG_GET_COLLATION(),
145
					  &tinfo, fcinfo->flinfo);
146
	PG_RETURN_POINTER(v);
147
}
148

149
Datum
150
gbt_bytea_same(PG_FUNCTION_ARGS)
151
{
152
	Datum		d1 = PG_GETARG_DATUM(0);
153
	Datum		d2 = PG_GETARG_DATUM(1);
154
	bool	   *result = (bool *) PG_GETARG_POINTER(2);
155

156
	*result = gbt_var_same(d1, d2, PG_GET_COLLATION(), &tinfo, fcinfo->flinfo);
157
	PG_RETURN_POINTER(result);
158
}
159

160

161
Datum
162
gbt_bytea_penalty(PG_FUNCTION_ARGS)
163
{
164
	GISTENTRY  *o = (GISTENTRY *) PG_GETARG_POINTER(0);
165
	GISTENTRY  *n = (GISTENTRY *) PG_GETARG_POINTER(1);
166
	float	   *result = (float *) PG_GETARG_POINTER(2);
167

168
	PG_RETURN_POINTER(gbt_var_penalty(result, o, n, PG_GET_COLLATION(),
169
									  &tinfo, fcinfo->flinfo));
170
}
171

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.