Age Owner Branch data TLA Line data Source code
1 : : /*
2 : : * contrib/btree_gist/btree_numeric.c
3 : : */
4 : : #include "postgres.h"
5 : :
6 : : #include <math.h>
7 : : #include <float.h>
8 : :
9 : : #include "btree_gist.h"
10 : : #include "btree_utils_var.h"
11 : : #include "utils/builtins.h"
12 : : #include "utils/numeric.h"
13 : : #include "utils/rel.h"
14 : :
15 : : /*
16 : : ** Bytea ops
17 : : */
7261 teodor@sigaev.ru 18 :CBC 3 : PG_FUNCTION_INFO_V1(gbt_numeric_compress);
19 : 3 : PG_FUNCTION_INFO_V1(gbt_numeric_union);
20 : 3 : PG_FUNCTION_INFO_V1(gbt_numeric_picksplit);
21 : 3 : PG_FUNCTION_INFO_V1(gbt_numeric_consistent);
22 : 3 : PG_FUNCTION_INFO_V1(gbt_numeric_penalty);
23 : 3 : PG_FUNCTION_INFO_V1(gbt_numeric_same);
24 : :
25 : :
26 : : /* define for comparison */
27 : :
28 : : static bool
2581 andrew@dunslane.net 29 : 2768 : gbt_numeric_gt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
30 : : {
4741 tgl@sss.pgh.pa.us 31 : 2768 : return DatumGetBool(DirectFunctionCall2(numeric_gt,
32 : : PointerGetDatum(a),
33 : : PointerGetDatum(b)));
34 : : }
35 : :
36 : : static bool
2581 andrew@dunslane.net 37 : 3075 : gbt_numeric_ge(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
38 : : {
4741 tgl@sss.pgh.pa.us 39 : 3075 : return DatumGetBool(DirectFunctionCall2(numeric_ge,
40 : : PointerGetDatum(a),
41 : : PointerGetDatum(b)));
42 : : }
43 : :
44 : : static bool
2581 andrew@dunslane.net 45 : 1263 : gbt_numeric_eq(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
46 : : {
4741 tgl@sss.pgh.pa.us 47 : 1263 : return DatumGetBool(DirectFunctionCall2(numeric_eq,
48 : : PointerGetDatum(a),
49 : : PointerGetDatum(b)));
50 : : }
51 : :
52 : : static bool
2581 andrew@dunslane.net 53 : 2370 : gbt_numeric_le(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
54 : : {
4741 tgl@sss.pgh.pa.us 55 : 2370 : return DatumGetBool(DirectFunctionCall2(numeric_le,
56 : : PointerGetDatum(a),
57 : : PointerGetDatum(b)));
58 : : }
59 : :
60 : : static bool
2581 andrew@dunslane.net 61 : 1796 : gbt_numeric_lt(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
62 : : {
4741 tgl@sss.pgh.pa.us 63 : 1796 : return DatumGetBool(DirectFunctionCall2(numeric_lt,
64 : : PointerGetDatum(a),
65 : : PointerGetDatum(b)));
66 : : }
67 : :
68 : : static int32
2581 andrew@dunslane.net 69 : 62059 : gbt_numeric_cmp(const void *a, const void *b, Oid collation, FmgrInfo *flinfo)
70 : : {
4741 tgl@sss.pgh.pa.us 71 : 62059 : return DatumGetInt32(DirectFunctionCall2(numeric_cmp,
72 : : PointerGetDatum(a),
73 : : PointerGetDatum(b)));
74 : : }
75 : :
76 : :
77 : : static const gbtree_vinfo tinfo =
78 : : {
79 : : gbt_t_numeric,
80 : : 0,
81 : : false,
82 : : gbt_numeric_gt,
83 : : gbt_numeric_ge,
84 : : gbt_numeric_eq,
85 : : gbt_numeric_le,
86 : : gbt_numeric_lt,
87 : : gbt_numeric_cmp,
88 : : NULL
89 : : };
90 : :
91 : :
92 : : /**************************************************
93 : : * Text ops
94 : : **************************************************/
95 : :
96 : :
97 : : Datum
7168 bruce@momjian.us 98 : 3173 : gbt_numeric_compress(PG_FUNCTION_ARGS)
99 : : {
100 : 3173 : GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
101 : :
102 : 3173 : PG_RETURN_POINTER(gbt_var_compress(entry, &tinfo));
103 : : }
104 : :
105 : :
106 : :
107 : : Datum
7261 teodor@sigaev.ru 108 : 11405 : gbt_numeric_consistent(PG_FUNCTION_ARGS)
109 : : {
7168 bruce@momjian.us 110 : 11405 : GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0);
111 : 11405 : void *query = (void *) DatumGetNumeric(PG_GETARG_DATUM(1));
112 : 11405 : StrategyNumber strategy = (StrategyNumber) PG_GETARG_UINT16(2);
113 : :
114 : : /* Oid subtype = PG_GETARG_OID(3); */
5844 tgl@sss.pgh.pa.us 115 : 11405 : bool *recheck = (bool *) PG_GETARG_POINTER(4);
116 : : bool retval;
117 : 11405 : GBT_VARKEY *key = (GBT_VARKEY *) DatumGetPointer(entry->key);
7168 bruce@momjian.us 118 : 11405 : GBT_VARKEY_R r = gbt_var_key_readable(key);
119 : :
120 : : /* All cases served by this function are exact */
5844 tgl@sss.pgh.pa.us 121 : 11405 : *recheck = false;
122 : :
4741 123 : 22810 : retval = gbt_var_consistent(&r, query, strategy, PG_GET_COLLATION(),
2581 andrew@dunslane.net 124 : 11405 : GIST_LEAF(entry), &tinfo, fcinfo->flinfo);
7168 bruce@momjian.us 125 : 11405 : PG_RETURN_BOOL(retval);
126 : : }
127 : :
128 : :
129 : :
130 : : Datum
7261 teodor@sigaev.ru 131 : 2745 : gbt_numeric_union(PG_FUNCTION_ARGS)
132 : : {
7168 bruce@momjian.us 133 : 2745 : GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
134 : 2745 : int32 *size = (int *) PG_GETARG_POINTER(1);
135 : :
4741 tgl@sss.pgh.pa.us 136 : 2745 : PG_RETURN_POINTER(gbt_var_union(entryvec, size, PG_GET_COLLATION(),
137 : : &tinfo, fcinfo->flinfo));
138 : : }
139 : :
140 : :
141 : : Datum
7261 teodor@sigaev.ru 142 : 2700 : gbt_numeric_same(PG_FUNCTION_ARGS)
143 : : {
7168 bruce@momjian.us 144 : 2700 : Datum d1 = PG_GETARG_DATUM(0);
145 : 2700 : Datum d2 = PG_GETARG_DATUM(1);
146 : 2700 : bool *result = (bool *) PG_GETARG_POINTER(2);
147 : :
2581 andrew@dunslane.net 148 : 2700 : *result = gbt_var_same(d1, d2, PG_GET_COLLATION(), &tinfo, fcinfo->flinfo);
4741 tgl@sss.pgh.pa.us 149 : 2700 : PG_RETURN_POINTER(result);
150 : : }
151 : :
152 : :
153 : : Datum
7168 bruce@momjian.us 154 : 6258 : gbt_numeric_penalty(PG_FUNCTION_ARGS)
155 : : {
156 : 6258 : GISTENTRY *o = (GISTENTRY *) PG_GETARG_POINTER(0);
157 : 6258 : GISTENTRY *n = (GISTENTRY *) PG_GETARG_POINTER(1);
158 : 6258 : float *result = (float *) PG_GETARG_POINTER(2);
159 : :
160 : : Numeric us,
161 : : os,
162 : : ds;
163 : :
164 : 6258 : GBT_VARKEY *org = (GBT_VARKEY *) DatumGetPointer(o->key);
165 : 6258 : GBT_VARKEY *newe = (GBT_VARKEY *) DatumGetPointer(n->key);
166 : : Datum uni;
167 : : GBT_VARKEY_R rk,
168 : : ok,
169 : : uk;
170 : :
171 : 6258 : rk = gbt_var_key_readable(org);
3307 heikki.linnakangas@i 172 : 6258 : uni = PointerGetDatum(gbt_var_key_copy(&rk));
2581 andrew@dunslane.net 173 : 6258 : gbt_var_bin_union(&uni, newe, PG_GET_COLLATION(), &tinfo, fcinfo->flinfo);
7168 bruce@momjian.us 174 : 6258 : ok = gbt_var_key_readable(org);
175 : 6258 : uk = gbt_var_key_readable((GBT_VARKEY *) DatumGetPointer(uni));
176 : :
1536 alvherre@alvh.no-ip. 177 : 6258 : us = DatumGetNumeric(DirectFunctionCall2(numeric_sub,
178 : : PointerGetDatum(uk.upper),
179 : : PointerGetDatum(uk.lower)));
180 : :
181 : 6258 : os = DatumGetNumeric(DirectFunctionCall2(numeric_sub,
182 : : PointerGetDatum(ok.upper),
183 : : PointerGetDatum(ok.lower)));
184 : :
185 : 6258 : ds = DatumGetNumeric(DirectFunctionCall2(numeric_sub,
186 : : NumericGetDatum(us),
187 : : NumericGetDatum(os)));
188 : :
5007 rhaas@postgresql.org 189 [ + + ]: 6258 : if (numeric_is_nan(us))
190 : : {
191 [ + + ]: 327 : if (numeric_is_nan(os))
7168 bruce@momjian.us 192 : 320 : *result = 0.0;
193 : : else
194 : 7 : *result = 1.0;
195 : : }
196 : : else
197 : : {
1313 peter@eisentraut.org 198 : 5931 : Numeric nul = int64_to_numeric(0);
199 : :
7168 bruce@momjian.us 200 : 5931 : *result = 0.0;
201 : :
202 [ + + ]: 5931 : if (DirectFunctionCall2(numeric_gt, NumericGetDatum(ds), NumericGetDatum(nul)))
203 : : {
204 : 1608 : *result += FLT_MIN;
1536 alvherre@alvh.no-ip. 205 : 1608 : os = DatumGetNumeric(DirectFunctionCall2(numeric_div,
206 : : NumericGetDatum(ds),
207 : : NumericGetDatum(us)));
7168 bruce@momjian.us 208 : 1608 : *result += (float4) DatumGetFloat8(DirectFunctionCall1(numeric_float8_no_overflow, NumericGetDatum(os)));
209 : : }
210 : : }
211 : :
212 [ + + ]: 6258 : if (*result > 0)
213 : 1615 : *result *= (FLT_MAX / (((GISTENTRY *) PG_GETARG_POINTER(0))->rel->rd_att->natts + 1));
214 : :
215 : 6258 : PG_RETURN_POINTER(result);
216 : : }
217 : :
218 : :
219 : :
220 : : Datum
7261 teodor@sigaev.ru 221 : 26 : gbt_numeric_picksplit(PG_FUNCTION_ARGS)
222 : : {
7168 bruce@momjian.us 223 : 26 : GistEntryVector *entryvec = (GistEntryVector *) PG_GETARG_POINTER(0);
224 : 26 : GIST_SPLITVEC *v = (GIST_SPLITVEC *) PG_GETARG_POINTER(1);
225 : :
4741 tgl@sss.pgh.pa.us 226 : 26 : gbt_var_picksplit(entryvec, v, PG_GET_COLLATION(),
227 : : &tinfo, fcinfo->flinfo);
7168 bruce@momjian.us 228 : 26 : PG_RETURN_POINTER(v);
229 : : }
|