@@ -45,7 +45,7 @@ NDBOX *g_cube_binary_union(NDBOX * r1, NDBOX * r2, int *sizep);
4545bool * g_cube_same (NDBOX * b1 ,NDBOX * b2 ,bool * result );
4646
4747/*
48- ** R-treesuport functions
48+ ** R-treesupport functions
4949*/
5050bool cube_same (NDBOX * a ,NDBOX * b );
5151bool cube_different (NDBOX * a ,NDBOX * b );
@@ -168,13 +168,15 @@ g_cube_consistent(GISTENTRY *entry,
168168{
169169
170170/*
171- ** if entry is not leaf, use g_cube_internal_consistent, * else use
171+ * if entry is not leaf, use g_cube_internal_consistent, else use
172172 * g_cube_leaf_consistent
173173 */
174174if (GIST_LEAF (entry ))
175- return (g_cube_leaf_consistent ((NDBOX * ) (entry -> pred ),query ,strategy ));
175+ return g_cube_leaf_consistent ((NDBOX * )DatumGetPointer (entry -> key ),
176+ query ,strategy );
176177else
177- return (g_cube_internal_consistent ((NDBOX * ) (entry -> pred ),query ,strategy ));
178+ return g_cube_internal_consistent ((NDBOX * )DatumGetPointer (entry -> key ),
179+ query ,strategy );
178180}
179181
180182
@@ -194,7 +196,7 @@ g_cube_union(bytea *entryvec, int *sizep)
194196 * fprintf(stderr, "union\n");
195197 */
196198numranges = (VARSIZE (entryvec )- VARHDRSZ ) /sizeof (GISTENTRY );
197- tmp = (NDBOX * ) (((GISTENTRY * ) (VARDATA (entryvec )))[0 ]).pred ;
199+ tmp = (NDBOX * )DatumGetPointer (((( GISTENTRY * ) (VARDATA (entryvec )))[0 ]).key ) ;
198200
199201/*
200202 * sizep = sizeof(NDBOX); -- NDBOX has variable size
@@ -204,14 +206,8 @@ g_cube_union(bytea *entryvec, int *sizep)
204206for (i = 1 ;i < numranges ;i ++ )
205207{
206208out = g_cube_binary_union (tmp , (NDBOX * )
207- (((GISTENTRY * ) (VARDATA (entryvec )))[i ]).pred ,
209+ DatumGetPointer (((( GISTENTRY * ) (VARDATA (entryvec )))[i ]).key ) ,
208210sizep );
209-
210- /*
211- * fprintf(stderr, "\t%s ^ %s -> %s\n", cube_out(tmp),
212- * cube_out((NDBOX *)(((GISTENTRY
213- * *)(VARDATA(entryvec)))[i]).pred), cube_out(out));
214- */
215211if (i > 1 )
216212pfree (tmp );
217213tmp = out ;
@@ -243,15 +239,16 @@ g_cube_decompress(GISTENTRY *entry)
243239float *
244240g_cube_penalty (GISTENTRY * origentry ,GISTENTRY * newentry ,float * result )
245241{
246- Datum ud ;
242+ NDBOX * ud ;
247243float tmp1 ,
248244tmp2 ;
249245
250- ud = (Datum )cube_union ((NDBOX * ) (origentry -> pred ), (NDBOX * ) (newentry -> pred ));
251- rt_cube_size ((NDBOX * )ud ,& tmp1 );
252- rt_cube_size ((NDBOX * ) (origentry -> pred ),& tmp2 );
246+ ud = cube_union ((NDBOX * )DatumGetPointer (origentry -> key ),
247+ (NDBOX * )DatumGetPointer (newentry -> key ));
248+ rt_cube_size (ud ,& tmp1 );
249+ rt_cube_size ((NDBOX * )DatumGetPointer (origentry -> key ),& tmp2 );
253250* result = tmp1 - tmp2 ;
254- pfree (( char * ) ud );
251+ pfree (ud );
255252
256253/*
257254 * fprintf(stderr, "penalty\n"); fprintf(stderr, "\t%g\n", *result);
@@ -308,16 +305,16 @@ g_cube_picksplit(bytea *entryvec,
308305
309306for (i = FirstOffsetNumber ;i < maxoff ;i = OffsetNumberNext (i ))
310307{
311- datum_alpha = (NDBOX * ) (((GISTENTRY * ) (VARDATA (entryvec )))[i ].pred );
308+ datum_alpha = (NDBOX * )DatumGetPointer (((GISTENTRY * ) (VARDATA (entryvec )))[i ].key );
312309for (j = OffsetNumberNext (i );j <=maxoff ;j = OffsetNumberNext (j ))
313310{
314- datum_beta = (NDBOX * ) (((GISTENTRY * ) (VARDATA (entryvec )))[j ].pred );
311+ datum_beta = (NDBOX * )DatumGetPointer (((GISTENTRY * ) (VARDATA (entryvec )))[j ].key );
315312
316313/* compute the wasted space by unioning these guys */
317314/* size_waste = size_union - size_inter; */
318- union_d = ( NDBOX * ) cube_union (datum_alpha ,datum_beta );
315+ union_d = cube_union (datum_alpha ,datum_beta );
319316rt_cube_size (union_d ,& size_union );
320- inter_d = ( NDBOX * ) cube_inter (datum_alpha ,datum_beta );
317+ inter_d = cube_inter (datum_alpha ,datum_beta );
321318rt_cube_size (inter_d ,& size_inter );
322319size_waste = size_union - size_inter ;
323320
@@ -346,12 +343,12 @@ g_cube_picksplit(bytea *entryvec,
346343right = v -> spl_right ;
347344v -> spl_nright = 0 ;
348345
349- datum_alpha = (NDBOX * ) (((GISTENTRY * ) (VARDATA (entryvec )))[seed_1 ].pred );
350- datum_l = ( NDBOX * ) cube_union (datum_alpha ,datum_alpha );
351- rt_cube_size (( NDBOX * ) datum_l ,& size_l );
352- datum_beta = (NDBOX * ) (((GISTENTRY * ) (VARDATA (entryvec )))[seed_2 ].pred ); ;
353- datum_r = ( NDBOX * ) cube_union (datum_beta ,datum_beta );
354- rt_cube_size (( NDBOX * ) datum_r ,& size_r );
346+ datum_alpha = (NDBOX * )DatumGetPointer (((GISTENTRY * ) (VARDATA (entryvec )))[seed_1 ].key );
347+ datum_l = cube_union (datum_alpha ,datum_alpha );
348+ rt_cube_size (datum_l ,& size_l );
349+ datum_beta = (NDBOX * )DatumGetPointer (((GISTENTRY * ) (VARDATA (entryvec )))[seed_2 ].key ) ;
350+ datum_r = cube_union (datum_beta ,datum_beta );
351+ rt_cube_size (datum_r ,& size_r );
355352
356353/*
357354 * Now split up the regions between the two seeds.An important
@@ -389,11 +386,11 @@ g_cube_picksplit(bytea *entryvec,
389386}
390387
391388/* okay, which page needs least enlargement? */
392- datum_alpha = (NDBOX * ) (((GISTENTRY * ) (VARDATA (entryvec )))[i ].pred );
393- union_dl = ( NDBOX * ) cube_union (datum_l ,datum_alpha );
394- union_dr = ( NDBOX * ) cube_union (datum_r ,datum_alpha );
395- rt_cube_size (( NDBOX * ) union_dl ,& size_alpha );
396- rt_cube_size (( NDBOX * ) union_dr ,& size_beta );
389+ datum_alpha = (NDBOX * )DatumGetPointer (((GISTENTRY * ) (VARDATA (entryvec )))[i ].key );
390+ union_dl = cube_union (datum_l ,datum_alpha );
391+ union_dr = cube_union (datum_r ,datum_alpha );
392+ rt_cube_size (union_dl ,& size_alpha );
393+ rt_cube_size (union_dr ,& size_beta );
397394
398395/* pick which page to add it to */
399396if (size_alpha - size_l < size_beta - size_r )
@@ -417,8 +414,8 @@ g_cube_picksplit(bytea *entryvec,
417414}
418415* left = * right = FirstOffsetNumber ;/* sentinel value, see dosplit() */
419416
420- v -> spl_ldatum = ( char * ) datum_l ;
421- v -> spl_rdatum = ( char * ) datum_r ;
417+ v -> spl_ldatum = PointerGetDatum ( datum_l ) ;
418+ v -> spl_rdatum = PointerGetDatum ( datum_r ) ;
422419
423420return v ;
424421}