|
36 | 36 | #defineARRPTR(x) ( (int4 *) ARR_DATA_PTR(x) ) |
37 | 37 | #defineARRNELEMS(x) ArrayGetNItems( ARR_NDIM(x), ARR_DIMS(x)) |
38 | 38 |
|
39 | | -#defineARRISNULL(x) ( (x) ? ( ( ARR_NDIM(x) == NDIM ) ? ( ( ARRNELEMS( x ) ) ? 0 : 1 ) : 1 ) : 1 ) |
| 39 | +#defineARRISNULL(x) ( (x) ? ( ( ARR_NDIM(x) == NDIM ) ? ( ( ARRNELEMS( x ) ) ? 0 : 1 ) : ( ( ARR_NDIM(x) ) ? (elog(ERROR,"Array is not one-dimentional: %d dimentions", ARR_NDIM(x)),1) : 1 ) ) : 1 ) |
| 40 | +#defineARRISVOID(x) ( (x) ? ( ( ARR_NDIM(x) == NDIM ) ? ( ( ARRNELEMS( x ) ) ? 0 : 1 ) : 1 ) : 0 ) |
40 | 41 |
|
41 | 42 | #defineSORT(x) \ |
42 | 43 | do { \ |
@@ -300,15 +301,16 @@ g_int_compress(PG_FUNCTION_ARGS) |
300 | 301 |
|
301 | 302 | if (ARRISNULL(r)) |
302 | 303 | { |
303 | | -#ifdefGIST_DEBUG |
304 | | -elog(NOTICE,"COMP IN: NULL"); |
305 | | -#endif |
306 | | -if (r) |
307 | | -if (r!= (ArrayType*)DatumGetPointer(entry->key)) |
308 | | -pfree(r); |
309 | | - |
310 | | -gistentryinit(*retval, (Datum)0,entry->rel,entry->page,entry->offset, |
| 304 | +if (ARRISVOID(r) ) { |
| 305 | +ArrayType*out=new_intArrayType(0 ); |
| 306 | +gistentryinit(*retval,PointerGetDatum(out), |
| 307 | +entry->rel,entry->page,entry->offset,VARSIZE(out), FALSE); |
| 308 | +}else { |
| 309 | +gistentryinit(*retval, (Datum)0,entry->rel,entry->page,entry->offset, |
311 | 310 | 0, FALSE); |
| 311 | +} |
| 312 | +if (r)pfree(r); |
| 313 | + |
312 | 314 | PG_RETURN_POINTER(retval); |
313 | 315 | } |
314 | 316 |
|
@@ -371,14 +373,20 @@ g_int_decompress(PG_FUNCTION_ARGS) |
371 | 373 | else |
372 | 374 | in=NULL; |
373 | 375 |
|
374 | | -if (entry->bytes<ARR_OVERHEAD(NDIM)||ARRISNULL(in)) |
| 376 | +if (ARRISNULL(in)) |
375 | 377 | { |
376 | 378 | retval=palloc(sizeof(GISTENTRY)); |
377 | 379 |
|
| 380 | +if (ARRISVOID(in) ) { |
| 381 | +r=new_intArrayType(0 ); |
| 382 | +gistentryinit(*retval,PointerGetDatum(r), |
| 383 | +entry->rel,entry->page,entry->offset,VARSIZE(r), FALSE); |
| 384 | +}else { |
| 385 | +gistentryinit(*retval, (Datum)0,entry->rel,entry->page,entry->offset,0, FALSE); |
| 386 | +} |
378 | 387 | if (in) |
379 | 388 | if (in!= (ArrayType*)DatumGetPointer(entry->key)) |
380 | 389 | pfree(in); |
381 | | -gistentryinit(*retval, (Datum)0,entry->rel,entry->page,entry->offset,0, FALSE); |
382 | 390 | #ifdefGIST_DEBUG |
383 | 391 | elog(NOTICE,"DECOMP IN: NULL"); |
384 | 392 | #endif |
@@ -1137,10 +1145,17 @@ g_intbig_compress(PG_FUNCTION_ARGS) |
1137 | 1145 |
|
1138 | 1146 | if (ARRISNULL(in)) |
1139 | 1147 | { |
| 1148 | +if (ARRISVOID(in) ) { |
| 1149 | +r=new_intArrayType(SIGLENINT ); |
| 1150 | +gistentryinit(*retval,PointerGetDatum(r), |
| 1151 | +entry->rel,entry->page,entry->offset,VARSIZE(r), FALSE); |
| 1152 | +}else { |
| 1153 | +gistentryinit(*retval, (Datum)0,entry->rel,entry->page,entry->offset, |
| 1154 | +0, FALSE); |
| 1155 | +} |
1140 | 1156 | if (in) |
1141 | 1157 | if (in!= (ArrayType*)DatumGetPointer(entry->key)) |
1142 | 1158 | pfree(in); |
1143 | | -gistentryinit(*retval, (Datum)0,entry->rel,entry->page,entry->offset,0, FALSE); |
1144 | 1159 | PG_RETURN_POINTER (retval); |
1145 | 1160 | } |
1146 | 1161 |
|
|