22
33#include "access/gist.h"
44#include "access/itup.h"
5- /*#include "access/rtree.h"*/
65#include "crc32.h"
76
87/* bigint defines */
@@ -38,7 +37,7 @@ typedef char *BITVECP;
3837
3938typedef struct
4039{
41- int4 len ;
40+ int32 vl_len_ ; /* varlena header (do not touch directly!) */
4241 int4 flag ;
4342 char data [1 ];
4443} GISTTYPE ;
@@ -47,7 +46,7 @@ typedef struct
4746
4847#define ISALLTRUE (x ) ( ((GISTTYPE*)x)->flag & ALLISTRUE )
4948
50- #define GTHDRSIZE ( sizeof(int4)*2 )
49+ #define GTHDRSIZE (VARHDRSZ + sizeof(int4))
5150#define CALCGTSIZE (flag ) ( GTHDRSIZE+(((flag) & ALLISTRUE) ? 0 : SIGLEN) )
5251
5352#define GETSIGN (x ) ( (BITVECP)( (char*)x+GTHDRSIZE ) )
@@ -112,14 +111,13 @@ ghstore_compress(PG_FUNCTION_ARGS)
112111
113112 if (entry -> leafkey )
114113 {
115- GISTTYPE * res = (GISTTYPE * ) palloc (CALCGTSIZE (0 ));
114+ GISTTYPE * res = (GISTTYPE * ) palloc0 (CALCGTSIZE (0 ));
116115 HStore * toastedval = (HStore * ) DatumGetPointer (entry -> key );
117116 HStore * val = (HStore * ) DatumGetPointer (PG_DETOAST_DATUM (entry -> key ));
118117 HEntry * ptr = ARRPTR (val );
119118 char * words = STRPTR (val );
120119
121- memset (res , 0 , CALCGTSIZE (0 ));
122- res -> len = CALCGTSIZE (0 );
120+ SET_VARSIZE (res , CALCGTSIZE (0 ));
123121
124122 while (ptr - ARRPTR (val ) < val -> size )
125123 {
@@ -156,7 +154,7 @@ ghstore_compress(PG_FUNCTION_ARGS)
156154 );
157155
158156 res = (GISTTYPE * ) palloc (CALCGTSIZE (ALLISTRUE ));
159- res -> len = CALCGTSIZE (ALLISTRUE );
157+ SET_VARSIZE ( res , CALCGTSIZE (ALLISTRUE ) );
160158 res -> flag = ALLISTRUE ;
161159
162160 retval = (GISTENTRY * ) palloc (sizeof (GISTENTRY ));
@@ -286,10 +284,11 @@ ghstore_union(PG_FUNCTION_ARGS)
286284
287285 len = CALCGTSIZE (flag );
288286 result = (GISTTYPE * ) palloc (len );
289- * size = result -> len = len ;
287+ SET_VARSIZE ( result , len ) ;
290288 result -> flag = flag ;
291289 if (!ISALLTRUE (result ))
292290 memcpy ((void * ) GETSIGN (result ), (void * ) base , sizeof (BITVEC ));
291+ * size = len ;
293292
294293 PG_RETURN_POINTER (result );
295294}
@@ -383,27 +382,27 @@ ghstore_picksplit(PG_FUNCTION_ARGS)
383382 if (ISALLTRUE (GETENTRY (entryvec , seed_1 )))
384383 {
385384 datum_l = (GISTTYPE * ) palloc (GTHDRSIZE );
386- datum_l -> len = GTHDRSIZE ;
385+ SET_VARSIZE ( datum_l , GTHDRSIZE ) ;
387386 datum_l -> flag = ALLISTRUE ;
388387 }
389388 else
390389 {
391390 datum_l = (GISTTYPE * ) palloc (GTHDRSIZE + SIGLEN );
392- datum_l -> len = GTHDRSIZE + SIGLEN ;
391+ SET_VARSIZE ( datum_l , GTHDRSIZE + SIGLEN ) ;
393392 datum_l -> flag = 0 ;
394393 memcpy ((void * ) GETSIGN (datum_l ), (void * ) GETSIGN (GETENTRY (entryvec , seed_1 )), sizeof (BITVEC ))
395394 ;
396395 }
397396 if (ISALLTRUE (GETENTRY (entryvec , seed_2 )))
398397 {
399398 datum_r = (GISTTYPE * ) palloc (GTHDRSIZE );
400- datum_r -> len = GTHDRSIZE ;
399+ SET_VARSIZE ( datum_r , GTHDRSIZE ) ;
401400 datum_r -> flag = ALLISTRUE ;
402401 }
403402 else
404403 {
405404 datum_r = (GISTTYPE * ) palloc (GTHDRSIZE + SIGLEN );
406- datum_r -> len = GTHDRSIZE + SIGLEN ;
405+ SET_VARSIZE ( datum_r , GTHDRSIZE + SIGLEN ) ;
407406 datum_r -> flag = 0 ;
408407 memcpy ((void * ) GETSIGN (datum_r ), (void * ) GETSIGN (GETENTRY (entryvec , seed_2 )), sizeof (BITVEC ));
409408 }
0 commit comments