]> granicus.if.org Git - postgresql/blob - contrib/btree_gist/btree_bytea.c
Convert contrib modules to use the extension facility.
[postgresql] / contrib / btree_gist / btree_bytea.c
1 /*
2  * contrib/btree_gist/btree_bytea.c
3  */
4 #include "btree_gist.h"
5 #include "btree_utils_var.h"
6 #include "utils/bytea.h"
7
8
9 /*
10 ** Bytea ops
11 */
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);
18
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);
25
26
27 /* define for comparison */
28
29 static bool
30 gbt_byteagt(const void *a, const void *b)
31 {
32         return (DatumGetBool(DirectFunctionCall2(byteagt, PointerGetDatum(a), PointerGetDatum(b))));
33 }
34
35 static bool
36 gbt_byteage(const void *a, const void *b)
37 {
38         return (DatumGetBool(DirectFunctionCall2(byteage, PointerGetDatum(a), PointerGetDatum(b))));
39 }
40
41 static bool
42 gbt_byteaeq(const void *a, const void *b)
43 {
44         return (DatumGetBool(DirectFunctionCall2(byteaeq, PointerGetDatum(a), PointerGetDatum(b))));
45 }
46
47 static bool
48 gbt_byteale(const void *a, const void *b)
49 {
50         return (DatumGetBool(DirectFunctionCall2(byteale, PointerGetDatum(a), PointerGetDatum(b))));
51 }
52
53 static bool
54 gbt_bytealt(const void *a, const void *b)
55 {
56         return (DatumGetBool(DirectFunctionCall2(bytealt, PointerGetDatum(a), PointerGetDatum(b))));
57 }
58
59
60 static int32
61 gbt_byteacmp(const bytea *a, const bytea *b)
62 {
63         return
64                 (DatumGetInt32(DirectFunctionCall2(byteacmp, PointerGetDatum(a), PointerGetDatum(b))));
65 }
66
67
68 static const gbtree_vinfo tinfo =
69 {
70         gbt_t_bytea,
71         0,
72         TRUE,
73         gbt_byteagt,
74         gbt_byteage,
75         gbt_byteaeq,
76         gbt_byteale,
77         gbt_bytealt,
78         gbt_byteacmp,
79         NULL
80 };
81
82
83 /**************************************************
84  * Text ops
85  **************************************************/
86
87
88 Datum
89 gbt_bytea_compress(PG_FUNCTION_ARGS)
90 {
91         GISTENTRY  *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
92
93         PG_RETURN_POINTER(gbt_var_compress(entry, &tinfo));
94 }
95
96
97
98 Datum
99 gbt_bytea_consistent(PG_FUNCTION_ARGS)
100 {
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);
104
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);
110
111         /* All cases served by this function are exact */
112         *recheck = false;
113
114         retval = gbt_var_consistent(&r, query, &strategy, GIST_LEAF(entry), &tinfo);
115         PG_RETURN_BOOL(retval);
116 }
117
118
119
120 Datum
121 gbt_bytea_union(PG_FUNCTION_ARGS)
122 {
123         GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
124         int32      *size = (int *) PG_GETARG_POINTER(1);
125
126         PG_RETURN_POINTER(gbt_var_union(entryvec, size, &tinfo));
127 }
128
129
130 Datum
131 gbt_bytea_picksplit(PG_FUNCTION_ARGS)
132 {
133         GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
134         GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
135
136         gbt_var_picksplit(entryvec, v, &tinfo);
137         PG_RETURN_POINTER(v);
138 }
139
140 Datum
141 gbt_bytea_same(PG_FUNCTION_ARGS)
142 {
143         Datum           d1 = PG_GETARG_DATUM(0);
144         Datum           d2 = PG_GETARG_DATUM(1);
145         bool       *result = (bool *) PG_GETARG_POINTER(2);
146
147         PG_RETURN_POINTER(gbt_var_same(result, d1, d2, &tinfo));
148 }
149
150
151 Datum
152 gbt_bytea_penalty(PG_FUNCTION_ARGS)
153 {
154         GISTENTRY  *o = (GISTENTRY *) PG_GETARG_POINTER(0);
155         GISTENTRY  *n = (GISTENTRY *) PG_GETARG_POINTER(1);
156         float      *result = (float *) PG_GETARG_POINTER(2);
157
158         PG_RETURN_POINTER(gbt_var_penalty(result, o, n, &tinfo));
159 }