@@ -14,92 +14,99 @@ PG_FUNCTION_INFO_V1(gbt_bit_consistent);
1414PG_FUNCTION_INFO_V1 (gbt_bit_penalty );
1515PG_FUNCTION_INFO_V1 (gbt_bit_same );
1616
17- Datum gbt_bit_compress (PG_FUNCTION_ARGS );
18- Datum gbt_bit_union (PG_FUNCTION_ARGS );
19- Datum gbt_bit_picksplit (PG_FUNCTION_ARGS );
20- Datum gbt_bit_consistent (PG_FUNCTION_ARGS );
21- Datum gbt_bit_penalty (PG_FUNCTION_ARGS );
22- Datum gbt_bit_same (PG_FUNCTION_ARGS );
17+ Datum gbt_bit_compress (PG_FUNCTION_ARGS );
18+ Datum gbt_bit_union (PG_FUNCTION_ARGS );
19+ Datum gbt_bit_picksplit (PG_FUNCTION_ARGS );
20+ Datum gbt_bit_consistent (PG_FUNCTION_ARGS );
21+ Datum gbt_bit_penalty (PG_FUNCTION_ARGS );
22+ Datum gbt_bit_same (PG_FUNCTION_ARGS );
2323
2424
2525
2626/* define for comparison */
2727
28- static bool gbt_bitgt (const void * a ,const void * b )
28+ static bool
29+ gbt_bitgt (const void * a ,const void * b )
2930{
30- return (DatumGetBool (DirectFunctionCall2 (bitgt , PointerGetDatum (a ), PointerGetDatum (b ) ) ) );
31+ return (DatumGetBool (DirectFunctionCall2 (bitgt , PointerGetDatum (a ), PointerGetDatum (b ))) );
3132}
3233
33- static bool gbt_bitge (const void * a ,const void * b )
34+ static bool
35+ gbt_bitge (const void * a ,const void * b )
3436{
35- return (DatumGetBool (DirectFunctionCall2 (bitge , PointerGetDatum (a ), PointerGetDatum (b ) ) ) );
37+ return (DatumGetBool (DirectFunctionCall2 (bitge , PointerGetDatum (a ), PointerGetDatum (b ))) );
3638}
3739
38- static bool gbt_biteq (const void * a ,const void * b )
40+ static bool
41+ gbt_biteq (const void * a ,const void * b )
3942{
40- return (DatumGetBool (DirectFunctionCall2 (biteq , PointerGetDatum (a ), PointerGetDatum (b ) ) ) );
43+ return (DatumGetBool (DirectFunctionCall2 (biteq , PointerGetDatum (a ), PointerGetDatum (b ))) );
4144}
4245
43- static bool gbt_bitle (const void * a ,const void * b )
46+ static bool
47+ gbt_bitle (const void * a ,const void * b )
4448{
45- return (DatumGetBool (DirectFunctionCall2 (bitle , PointerGetDatum (a ), PointerGetDatum (b ) ) ) );
49+ return (DatumGetBool (DirectFunctionCall2 (bitle , PointerGetDatum (a ), PointerGetDatum (b ))) );
4650}
4751
48- static bool gbt_bitlt (const void * a ,const void * b )
52+ static bool
53+ gbt_bitlt (const void * a ,const void * b )
4954{
50- return (DatumGetBool (DirectFunctionCall2 (bitlt , PointerGetDatum (a ), PointerGetDatum (b ) ) ) );
55+ return (DatumGetBool (DirectFunctionCall2 (bitlt , PointerGetDatum (a ), PointerGetDatum (b ))) );
5156}
5257
53- static int32 gbt_bitcmp (const bytea * a ,const bytea * b )
58+ static int32
59+ gbt_bitcmp (const bytea * a ,const bytea * b )
5460{
55- return
56- ( DatumGetInt32 (DirectFunctionCall2 (byteacmp ,PointerGetDatum (a ),PointerGetDatum (b ) ) ) );
61+ return
62+ ( DatumGetInt32 (DirectFunctionCall2 (byteacmp ,PointerGetDatum (a ),PointerGetDatum (b ))) );
5763}
58-
64+
5965
6066static bytea *
61- gbt_bit_xfrm ( bytea * leaf )
67+ gbt_bit_xfrm ( bytea * leaf )
6268{
63- bytea * out = leaf ;
64- int s = VARBITBYTES (leaf )+ VARHDRSZ ;
69+ bytea * out = leaf ;
70+ int s = VARBITBYTES (leaf )+ VARHDRSZ ;
6571
66- out = palloc ( s );
67- VARATT_SIZEP (out )= s ;
68- memcpy ( (void * ) VARDATA (out ), (void * ) VARBITS (leaf ),VARBITBYTES (leaf ) );
69- return out ;
72+ out = palloc ( s );
73+ VARATT_SIZEP (out )= s ;
74+ memcpy ( (void * ) VARDATA (out ), (void * ) VARBITS (leaf ),VARBITBYTES (leaf ));
75+ return out ;
7076}
7177
7278
7379
7480
75- static GBT_VARKEY * gbt_bit_l2n (GBT_VARKEY * leaf )
81+ static GBT_VARKEY *
82+ gbt_bit_l2n (GBT_VARKEY * leaf )
7683{
7784
78- GBT_VARKEY * out = leaf ;
79- GBT_VARKEY_R r = gbt_var_key_readable ( leaf );
80- bytea * o ;
85+ GBT_VARKEY * out = leaf ;
86+ GBT_VARKEY_R r = gbt_var_key_readable ( leaf );
87+ bytea * o ;
8188
82- o = gbt_bit_xfrm (r .lower );
83- r .upper = r .lower = o ;
84- out = gbt_var_key_copy (& r , TRUE );
85- pfree (o );
89+ o = gbt_bit_xfrm (r .lower );
90+ r .upper = r .lower = o ;
91+ out = gbt_var_key_copy (& r , TRUE);
92+ pfree (o );
8693
87- return out ;
94+ return out ;
8895
8996}
9097
9198static const gbtree_vinfo tinfo =
9299{
93- gbt_t_bit ,
94- FALSE,
95- TRUE,
96- gbt_bitgt ,
97- gbt_bitge ,
98- gbt_biteq ,
99- gbt_bitle ,
100- gbt_bitlt ,
101- gbt_bitcmp ,
102- gbt_bit_l2n
100+ gbt_t_bit ,
101+ FALSE,
102+ TRUE,
103+ gbt_bitgt ,
104+ gbt_bitge ,
105+ gbt_biteq ,
106+ gbt_bitle ,
107+ gbt_bitlt ,
108+ gbt_bitcmp ,
109+ gbt_bit_l2n
103110};
104111
105112
@@ -108,78 +115,81 @@ static const gbtree_vinfo tinfo =
108115 **************************************************/
109116
110117Datum
111- gbt_bit_compress (PG_FUNCTION_ARGS )
118+ gbt_bit_compress (PG_FUNCTION_ARGS )
112119{
113- GISTENTRY * entry = (GISTENTRY * )PG_GETARG_POINTER (0 );
114- PG_RETURN_POINTER (gbt_var_compress (entry ,& tinfo ) );
120+ GISTENTRY * entry = (GISTENTRY * )PG_GETARG_POINTER (0 );
121+
122+ PG_RETURN_POINTER (gbt_var_compress (entry ,& tinfo ));
115123}
116124
117125Datum
118126gbt_bit_consistent (PG_FUNCTION_ARGS )
119127{
120- GISTENTRY * entry = (GISTENTRY * )PG_GETARG_POINTER (0 );
121- GBT_VARKEY * ktst = (GBT_VARKEY * )DatumGetPointer (entry -> key ) ;
122- GBT_VARKEY * key = (GBT_VARKEY * )DatumGetPointer (PG_DETOAST_DATUM (entry -> key ) );
123- void * qtst = (void * )DatumGetPointer (PG_GETARG_DATUM (1 ) );
124- void * query = (void * )DatumGetByteaP (PG_GETARG_DATUM (1 ) );
125- StrategyNumber strategy = (StrategyNumber )PG_GETARG_UINT16 (2 );
126- bool retval = FALSE;
127- GBT_VARKEY_R r = gbt_var_key_readable (key );
128-
129- if (GIST_LEAF (entry ) )
130- {
131- retval = gbt_var_consistent (& r ,query ,& strategy , TRUE,& tinfo );
132- }else {
133- bytea * q = gbt_bit_xfrm ( (bytea * )query );
134- retval = gbt_var_consistent (& r , (void * )q ,& strategy , FALSE,& tinfo );
135- pfree (q );
136- }
137-
138- if (ktst != key ){
139- pfree (key );
140- }
141- if (qtst != query ){
142- pfree (query );
143- }
144- PG_RETURN_BOOL (retval );
128+ GISTENTRY * entry = (GISTENTRY * )PG_GETARG_POINTER (0 );
129+ GBT_VARKEY * ktst = (GBT_VARKEY * )DatumGetPointer (entry -> key );
130+ GBT_VARKEY * key = (GBT_VARKEY * )DatumGetPointer (PG_DETOAST_DATUM (entry -> key ));
131+ void * qtst = (void * )DatumGetPointer (PG_GETARG_DATUM (1 ));
132+ void * query = (void * )DatumGetByteaP (PG_GETARG_DATUM (1 ));
133+ StrategyNumber strategy = (StrategyNumber )PG_GETARG_UINT16 (2 );
134+ bool retval = FALSE;
135+ GBT_VARKEY_R r = gbt_var_key_readable (key );
136+
137+ if (GIST_LEAF (entry ))
138+ retval = gbt_var_consistent (& r ,query ,& strategy , TRUE,& tinfo );
139+ else
140+ {
141+ bytea * q = gbt_bit_xfrm ((bytea * )query );
142+
143+ retval = gbt_var_consistent (& r , (void * )q ,& strategy , FALSE,& tinfo );
144+ pfree (q );
145+ }
146+
147+ if (ktst != key )
148+ pfree (key );
149+ if (qtst != query )
150+ pfree (query );
151+ PG_RETURN_BOOL (retval );
145152}
146153
147154
148155
149156Datum
150157gbt_bit_union (PG_FUNCTION_ARGS )
151158{
152- GistEntryVector * entryvec = (GistEntryVector * )PG_GETARG_POINTER (0 );
153- int32 * size = (int * )PG_GETARG_POINTER (1 );
154- PG_RETURN_POINTER (gbt_var_union (entryvec ,size ,& tinfo ) );
159+ GistEntryVector * entryvec = (GistEntryVector * )PG_GETARG_POINTER (0 );
160+ int32 * size = (int * )PG_GETARG_POINTER (1 );
161+
162+ PG_RETURN_POINTER (gbt_var_union (entryvec ,size ,& tinfo ));
155163}
156-
164+
157165
158166Datum
159167gbt_bit_picksplit (PG_FUNCTION_ARGS )
160168{
161- GistEntryVector * entryvec = (GistEntryVector * )PG_GETARG_POINTER (0 );
162- GIST_SPLITVEC * v = (GIST_SPLITVEC * )PG_GETARG_POINTER (1 );
163- gbt_var_picksplit (entryvec ,v ,& tinfo );
164- PG_RETURN_POINTER (v );
169+ GistEntryVector * entryvec = (GistEntryVector * )PG_GETARG_POINTER (0 );
170+ GIST_SPLITVEC * v = (GIST_SPLITVEC * )PG_GETARG_POINTER (1 );
171+
172+ gbt_var_picksplit (entryvec ,v ,& tinfo );
173+ PG_RETURN_POINTER (v );
165174}
166175
167176Datum
168177gbt_bit_same (PG_FUNCTION_ARGS )
169178{
170- Datum d1 = PG_GETARG_DATUM (0 );
171- Datum d2 = PG_GETARG_DATUM (1 );
172- bool * result = (bool * )PG_GETARG_POINTER (2 );
173- PG_RETURN_POINTER (gbt_var_same (result ,d1 ,d2 ,& tinfo ));
179+ Datum d1 = PG_GETARG_DATUM (0 );
180+ Datum d2 = PG_GETARG_DATUM (1 );
181+ bool * result = (bool * )PG_GETARG_POINTER (2 );
182+
183+ PG_RETURN_POINTER (gbt_var_same (result ,d1 ,d2 ,& tinfo ));
174184}
175185
176186
177187Datum
178188gbt_bit_penalty (PG_FUNCTION_ARGS )
179189{
180- float * result = (float * )PG_GETARG_POINTER (2 );
181- GISTENTRY * o = (GISTENTRY * )PG_GETARG_POINTER (0 );
182- GISTENTRY * n = (GISTENTRY * )PG_GETARG_POINTER (1 );
183- PG_RETURN_POINTER (gbt_var_penalty (result ,o ,n ,& tinfo ) );
184- }
190+ float * result = (float * )PG_GETARG_POINTER (2 );
191+ GISTENTRY * o = (GISTENTRY * )PG_GETARG_POINTER (0 );
192+ GISTENTRY * n = (GISTENTRY * )PG_GETARG_POINTER (1 );
185193
194+ PG_RETURN_POINTER (gbt_var_penalty (result ,o ,n ,& tinfo ));
195+ }