Fix xslt_process() to ensure that it inserts a NULL terminator after the
[PostgreSQL.git] / contrib / btree_gist / btree_bytea.c
blob90090d7a445c475e3271f9f0e4713da4d5731a8c
1 /*
2 * $PostgreSQL$
3 */
4 #include "btree_gist.h"
5 #include "btree_utils_var.h"
6 #include "utils/builtins.h"
9 /*
10 ** Bytea ops
12 PG_FUNCTION_INFO_V1(gbt_bytea_compress);
13 PG_FUNCTION_INFO_V1(gbt_bytea_union);
14 PG_FUNCTION_INFO_V1(gbt_bytea_picksplit);
15 PG_FUNCTION_INFO_V1(gbt_bytea_consistent);
16 PG_FUNCTION_INFO_V1(gbt_bytea_penalty);
17 PG_FUNCTION_INFO_V1(gbt_bytea_same);
19 Datum gbt_bytea_compress(PG_FUNCTION_ARGS);
20 Datum gbt_bytea_union(PG_FUNCTION_ARGS);
21 Datum gbt_bytea_picksplit(PG_FUNCTION_ARGS);
22 Datum gbt_bytea_consistent(PG_FUNCTION_ARGS);
23 Datum gbt_bytea_penalty(PG_FUNCTION_ARGS);
24 Datum gbt_bytea_same(PG_FUNCTION_ARGS);
27 /* define for comparison */
29 static bool
30 gbt_byteagt(const void *a, const void *b)
32 return (DatumGetBool(DirectFunctionCall2(byteagt, PointerGetDatum(a), PointerGetDatum(b))));
35 static bool
36 gbt_byteage(const void *a, const void *b)
38 return (DatumGetBool(DirectFunctionCall2(byteage, PointerGetDatum(a), PointerGetDatum(b))));
41 static bool
42 gbt_byteaeq(const void *a, const void *b)
44 return (DatumGetBool(DirectFunctionCall2(byteaeq, PointerGetDatum(a), PointerGetDatum(b))));
47 static bool
48 gbt_byteale(const void *a, const void *b)
50 return (DatumGetBool(DirectFunctionCall2(byteale, PointerGetDatum(a), PointerGetDatum(b))));
53 static bool
54 gbt_bytealt(const void *a, const void *b)
56 return (DatumGetBool(DirectFunctionCall2(bytealt, PointerGetDatum(a), PointerGetDatum(b))));
60 static int32
61 gbt_byteacmp(const bytea *a, const bytea *b)
63 return
64 (DatumGetInt32(DirectFunctionCall2(byteacmp, PointerGetDatum(a), PointerGetDatum(b))));
68 static const gbtree_vinfo tinfo =
70 gbt_t_bytea,
72 TRUE,
73 gbt_byteagt,
74 gbt_byteage,
75 gbt_byteaeq,
76 gbt_byteale,
77 gbt_bytealt,
78 gbt_byteacmp,
79 NULL
83 /**************************************************
84 * Text ops
85 **************************************************/
88 Datum
89 gbt_bytea_compress(PG_FUNCTION_ARGS)
91 GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
93 PG_RETURN_POINTER(gbt_var_compress(entry, &tinfo));
98 Datum
99 gbt_bytea_consistent(PG_FUNCTION_ARGS)
101 GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
102 void *query = (void *) DatumGetByteaP(PG_GETARG_DATUM(1));
103 StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
105 /* Oid subtype = PG_GETARG_OID(3); */
106 bool *recheck = (bool *) PG_GETARG_POINTER(4);
107 bool retval;
108 GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
109 GBT_VARKEY_R r = gbt_var_key_readable(key);
111 /* All cases served by this function are exact */
112 *recheck = false;
114 retval = gbt_var_consistent(&r, query, &strategy, GIST_LEAF(entry), &tinfo);
115 PG_RETURN_BOOL(retval);
120 Datum
121 gbt_bytea_union(PG_FUNCTION_ARGS)
123 GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
124 int32 *size = (int *) PG_GETARG_POINTER(1);
126 PG_RETURN_POINTER(gbt_var_union(entryvec, size, &tinfo));
130 Datum
131 gbt_bytea_picksplit(PG_FUNCTION_ARGS)
133 GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
134 GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
136 gbt_var_picksplit(entryvec, v, &tinfo);
137 PG_RETURN_POINTER(v);
140 Datum
141 gbt_bytea_same(PG_FUNCTION_ARGS)
143 Datum d1 = PG_GETARG_DATUM(0);
144 Datum d2 = PG_GETARG_DATUM(1);
145 bool *result = (bool *) PG_GETARG_POINTER(2);
147 PG_RETURN_POINTER(gbt_var_same(result, d1, d2, &tinfo));
151 Datum
152 gbt_bytea_penalty(PG_FUNCTION_ARGS)
154 GISTENTRY *o = (GISTENTRY *) PG_GETARG_POINTER(0);
155 GISTENTRY *n = (GISTENTRY *) PG_GETARG_POINTER(1);
156 float *result = (float *) PG_GETARG_POINTER(2);
158 PG_RETURN_POINTER(gbt_var_penalty(result, o, n, &tinfo));