2
2
3
3
#include "access/gist.h"
4
4
#include "access/itup.h"
5
- /*#include "access/rtree.h"*/
6
5
#include "crc32.h"
7
6
8
7
/* bigint defines */
@@ -38,7 +37,7 @@ typedef char *BITVECP;
38
37
39
38
typedef struct
40
39
{
41
- int4 len ;
40
+ int32 vl_len_ ; /* varlena header (do not touch directly!) */
42
41
int4 flag ;
43
42
char data [1 ];
44
43
} GISTTYPE ;
@@ -47,7 +46,7 @@ typedef struct
47
46
48
47
#define ISALLTRUE (x ) ( ((GISTTYPE*)x)->flag & ALLISTRUE )
49
48
50
- #define GTHDRSIZE ( sizeof(int4)*2 )
49
+ #define GTHDRSIZE (VARHDRSZ + sizeof(int4))
51
50
#define CALCGTSIZE (flag ) ( GTHDRSIZE+(((flag) & ALLISTRUE) ? 0 : SIGLEN) )
52
51
53
52
#define GETSIGN (x ) ( (BITVECP)( (char*)x+GTHDRSIZE ) )
@@ -112,14 +111,13 @@ ghstore_compress(PG_FUNCTION_ARGS)
112
111
113
112
if (entry -> leafkey )
114
113
{
115
- GISTTYPE * res = (GISTTYPE * ) palloc (CALCGTSIZE (0 ));
114
+ GISTTYPE * res = (GISTTYPE * ) palloc0 (CALCGTSIZE (0 ));
116
115
HStore * toastedval = (HStore * ) DatumGetPointer (entry -> key );
117
116
HStore * val = (HStore * ) DatumGetPointer (PG_DETOAST_DATUM (entry -> key ));
118
117
HEntry * ptr = ARRPTR (val );
119
118
char * words = STRPTR (val );
120
119
121
- memset (res , 0 , CALCGTSIZE (0 ));
122
- res -> len = CALCGTSIZE (0 );
120
+ SET_VARSIZE (res , CALCGTSIZE (0 ));
123
121
124
122
while (ptr - ARRPTR (val ) < val -> size )
125
123
{
@@ -156,7 +154,7 @@ ghstore_compress(PG_FUNCTION_ARGS)
156
154
);
157
155
158
156
res = (GISTTYPE * ) palloc (CALCGTSIZE (ALLISTRUE ));
159
- res -> len = CALCGTSIZE (ALLISTRUE );
157
+ SET_VARSIZE ( res , CALCGTSIZE (ALLISTRUE ) );
160
158
res -> flag = ALLISTRUE ;
161
159
162
160
retval = (GISTENTRY * ) palloc (sizeof (GISTENTRY ));
@@ -286,10 +284,11 @@ ghstore_union(PG_FUNCTION_ARGS)
286
284
287
285
len = CALCGTSIZE (flag );
288
286
result = (GISTTYPE * ) palloc (len );
289
- * size = result -> len = len ;
287
+ SET_VARSIZE ( result , len ) ;
290
288
result -> flag = flag ;
291
289
if (!ISALLTRUE (result ))
292
290
memcpy ((void * ) GETSIGN (result ), (void * ) base , sizeof (BITVEC ));
291
+ * size = len ;
293
292
294
293
PG_RETURN_POINTER (result );
295
294
}
@@ -383,27 +382,27 @@ ghstore_picksplit(PG_FUNCTION_ARGS)
383
382
if (ISALLTRUE (GETENTRY (entryvec , seed_1 )))
384
383
{
385
384
datum_l = (GISTTYPE * ) palloc (GTHDRSIZE );
386
- datum_l -> len = GTHDRSIZE ;
385
+ SET_VARSIZE ( datum_l , GTHDRSIZE ) ;
387
386
datum_l -> flag = ALLISTRUE ;
388
387
}
389
388
else
390
389
{
391
390
datum_l = (GISTTYPE * ) palloc (GTHDRSIZE + SIGLEN );
392
- datum_l -> len = GTHDRSIZE + SIGLEN ;
391
+ SET_VARSIZE ( datum_l , GTHDRSIZE + SIGLEN ) ;
393
392
datum_l -> flag = 0 ;
394
393
memcpy ((void * ) GETSIGN (datum_l ), (void * ) GETSIGN (GETENTRY (entryvec , seed_1 )), sizeof (BITVEC ))
395
394
;
396
395
}
397
396
if (ISALLTRUE (GETENTRY (entryvec , seed_2 )))
398
397
{
399
398
datum_r = (GISTTYPE * ) palloc (GTHDRSIZE );
400
- datum_r -> len = GTHDRSIZE ;
399
+ SET_VARSIZE ( datum_r , GTHDRSIZE ) ;
401
400
datum_r -> flag = ALLISTRUE ;
402
401
}
403
402
else
404
403
{
405
404
datum_r = (GISTTYPE * ) palloc (GTHDRSIZE + SIGLEN );
406
- datum_r -> len = GTHDRSIZE + SIGLEN ;
405
+ SET_VARSIZE ( datum_r , GTHDRSIZE + SIGLEN ) ;
407
406
datum_r -> flag = 0 ;
408
407
memcpy ((void * ) GETSIGN (datum_r ), (void * ) GETSIGN (GETENTRY (entryvec , seed_2 )), sizeof (BITVEC ));
409
408
}
0 commit comments