2 * contrib/btree_gist/btree_int2.c
6 #include "btree_gist.h"
7 #include "btree_utils_num.h"
8 #include "common/int.h"
10 typedef struct int16key
19 PG_FUNCTION_INFO_V1(gbt_int2_compress
);
20 PG_FUNCTION_INFO_V1(gbt_int2_fetch
);
21 PG_FUNCTION_INFO_V1(gbt_int2_union
);
22 PG_FUNCTION_INFO_V1(gbt_int2_picksplit
);
23 PG_FUNCTION_INFO_V1(gbt_int2_consistent
);
24 PG_FUNCTION_INFO_V1(gbt_int2_distance
);
25 PG_FUNCTION_INFO_V1(gbt_int2_penalty
);
26 PG_FUNCTION_INFO_V1(gbt_int2_same
);
29 gbt_int2gt(const void *a
, const void *b
, FmgrInfo
*flinfo
)
31 return (*((const int16
*) a
) > *((const int16
*) b
));
34 gbt_int2ge(const void *a
, const void *b
, FmgrInfo
*flinfo
)
36 return (*((const int16
*) a
) >= *((const int16
*) b
));
39 gbt_int2eq(const void *a
, const void *b
, FmgrInfo
*flinfo
)
41 return (*((const int16
*) a
) == *((const int16
*) b
));
44 gbt_int2le(const void *a
, const void *b
, FmgrInfo
*flinfo
)
46 return (*((const int16
*) a
) <= *((const int16
*) b
));
49 gbt_int2lt(const void *a
, const void *b
, FmgrInfo
*flinfo
)
51 return (*((const int16
*) a
) < *((const int16
*) b
));
55 gbt_int2key_cmp(const void *a
, const void *b
, FmgrInfo
*flinfo
)
57 int16KEY
*ia
= (int16KEY
*) (((const Nsrt
*) a
)->t
);
58 int16KEY
*ib
= (int16KEY
*) (((const Nsrt
*) b
)->t
);
60 if (ia
->lower
== ib
->lower
)
62 if (ia
->upper
== ib
->upper
)
65 return (ia
->upper
> ib
->upper
) ? 1 : -1;
68 return (ia
->lower
> ib
->lower
) ? 1 : -1;
72 gbt_int2_dist(const void *a
, const void *b
, FmgrInfo
*flinfo
)
74 return GET_FLOAT_DISTANCE(int16
, a
, b
);
78 static const gbtree_ninfo tinfo
=
82 4, /* sizeof(gbtreekey4) */
93 PG_FUNCTION_INFO_V1(int2_dist
);
95 int2_dist(PG_FUNCTION_ARGS
)
97 int16 a
= PG_GETARG_INT16(0);
98 int16 b
= PG_GETARG_INT16(1);
102 if (pg_sub_s16_overflow(a
, b
, &r
) ||
105 (errcode(ERRCODE_NUMERIC_VALUE_OUT_OF_RANGE
),
106 errmsg("smallint out of range")));
114 /**************************************************
116 **************************************************/
120 gbt_int2_compress(PG_FUNCTION_ARGS
)
122 GISTENTRY
*entry
= (GISTENTRY
*) PG_GETARG_POINTER(0);
124 PG_RETURN_POINTER(gbt_num_compress(entry
, &tinfo
));
128 gbt_int2_fetch(PG_FUNCTION_ARGS
)
130 GISTENTRY
*entry
= (GISTENTRY
*) PG_GETARG_POINTER(0);
132 PG_RETURN_POINTER(gbt_num_fetch(entry
, &tinfo
));
136 gbt_int2_consistent(PG_FUNCTION_ARGS
)
138 GISTENTRY
*entry
= (GISTENTRY
*) PG_GETARG_POINTER(0);
139 int16 query
= PG_GETARG_INT16(1);
140 StrategyNumber strategy
= (StrategyNumber
) PG_GETARG_UINT16(2);
142 /* Oid subtype = PG_GETARG_OID(3); */
143 bool *recheck
= (bool *) PG_GETARG_POINTER(4);
144 int16KEY
*kkk
= (int16KEY
*) DatumGetPointer(entry
->key
);
147 /* All cases served by this function are exact */
150 key
.lower
= (GBT_NUMKEY
*) &kkk
->lower
;
151 key
.upper
= (GBT_NUMKEY
*) &kkk
->upper
;
153 PG_RETURN_BOOL(gbt_num_consistent(&key
, (void *) &query
, &strategy
,
154 GIST_LEAF(entry
), &tinfo
, fcinfo
->flinfo
));
159 gbt_int2_distance(PG_FUNCTION_ARGS
)
161 GISTENTRY
*entry
= (GISTENTRY
*) PG_GETARG_POINTER(0);
162 int16 query
= PG_GETARG_INT16(1);
164 /* Oid subtype = PG_GETARG_OID(3); */
165 int16KEY
*kkk
= (int16KEY
*) DatumGetPointer(entry
->key
);
168 key
.lower
= (GBT_NUMKEY
*) &kkk
->lower
;
169 key
.upper
= (GBT_NUMKEY
*) &kkk
->upper
;
171 PG_RETURN_FLOAT8(gbt_num_distance(&key
, (void *) &query
, GIST_LEAF(entry
),
172 &tinfo
, fcinfo
->flinfo
));
177 gbt_int2_union(PG_FUNCTION_ARGS
)
179 GistEntryVector
*entryvec
= (GistEntryVector
*) PG_GETARG_POINTER(0);
180 void *out
= palloc(sizeof(int16KEY
));
182 *(int *) PG_GETARG_POINTER(1) = sizeof(int16KEY
);
183 PG_RETURN_POINTER(gbt_num_union((void *) out
, entryvec
, &tinfo
, fcinfo
->flinfo
));
188 gbt_int2_penalty(PG_FUNCTION_ARGS
)
190 int16KEY
*origentry
= (int16KEY
*) DatumGetPointer(((GISTENTRY
*) PG_GETARG_POINTER(0))->key
);
191 int16KEY
*newentry
= (int16KEY
*) DatumGetPointer(((GISTENTRY
*) PG_GETARG_POINTER(1))->key
);
192 float *result
= (float *) PG_GETARG_POINTER(2);
194 penalty_num(result
, origentry
->lower
, origentry
->upper
, newentry
->lower
, newentry
->upper
);
196 PG_RETURN_POINTER(result
);
200 gbt_int2_picksplit(PG_FUNCTION_ARGS
)
202 PG_RETURN_POINTER(gbt_num_picksplit((GistEntryVector
*) PG_GETARG_POINTER(0),
203 (GIST_SPLITVEC
*) PG_GETARG_POINTER(1),
204 &tinfo
, fcinfo
->flinfo
));
208 gbt_int2_same(PG_FUNCTION_ARGS
)
210 int16KEY
*b1
= (int16KEY
*) PG_GETARG_POINTER(0);
211 int16KEY
*b2
= (int16KEY
*) PG_GETARG_POINTER(1);
212 bool *result
= (bool *) PG_GETARG_POINTER(2);
214 *result
= gbt_num_same((void *) b1
, (void *) b2
, &tinfo
, fcinfo
->flinfo
);
215 PG_RETURN_POINTER(result
);