diff --git a/contrib/btree_gist/btree_cash.c b/contrib/btree_gist/btree_cash.c index 8de3716c945ec34aa9837494352193548ce1900e..63f86ebeefe03e26a8ba85dff102f47055e8e253 100644 --- a/contrib/btree_gist/btree_cash.c +++ b/contrib/btree_gist/btree_cash.c @@ -78,6 +78,7 @@ static const gbtree_ninfo tinfo = { gbt_t_cash, sizeof(Cash), + 16, /* sizeof(gbtreekey16) */ gbt_cashgt, gbt_cashge, gbt_casheq, diff --git a/contrib/btree_gist/btree_date.c b/contrib/btree_gist/btree_date.c index 9cab7ec42f5d17cd9a51d5195a1f088c5c5c1cd9..7a4c6aa6003fa05c6ab629bf2ae4f8035630eccc 100644 --- a/contrib/btree_gist/btree_date.c +++ b/contrib/btree_gist/btree_date.c @@ -96,6 +96,7 @@ static const gbtree_ninfo tinfo = { gbt_t_date, sizeof(DateADT), + 8, /* sizeof(gbtreekey8) */ gbt_dategt, gbt_datege, gbt_dateeq, diff --git a/contrib/btree_gist/btree_float4.c b/contrib/btree_gist/btree_float4.c index 55e1c4c1c6d676cefee4d3ac7af2e370b4b3c589..778d8dad84407c68fd90d567eaf26f3181c3373a 100644 --- a/contrib/btree_gist/btree_float4.c +++ b/contrib/btree_gist/btree_float4.c @@ -77,6 +77,7 @@ static const gbtree_ninfo tinfo = { gbt_t_float4, sizeof(float4), + 8, /* sizeof(gbtreekey8) */ gbt_float4gt, gbt_float4ge, gbt_float4eq, diff --git a/contrib/btree_gist/btree_float8.c b/contrib/btree_gist/btree_float8.c index 62271dec84aa94a9f8f9300743bdea2e7c556505..c898bf2d975ce26e4761d06a969654258e724133 100644 --- a/contrib/btree_gist/btree_float8.c +++ b/contrib/btree_gist/btree_float8.c @@ -85,6 +85,7 @@ static const gbtree_ninfo tinfo = { gbt_t_float8, sizeof(float8), + 16, /* sizeof(gbtreekey16) */ gbt_float8gt, gbt_float8ge, gbt_float8eq, diff --git a/contrib/btree_gist/btree_inet.c b/contrib/btree_gist/btree_inet.c index 24ae6bf36935d0b467d7ed0fe48f2fa5d44228e0..822786125d99b12cef2aa5cb8f9db88c120e811a 100644 --- a/contrib/btree_gist/btree_inet.c +++ b/contrib/btree_gist/btree_inet.c @@ -74,6 +74,7 @@ static const gbtree_ninfo tinfo = { gbt_t_inet, sizeof(double), + 16, /* sizeof(gbtreekey16) */ gbt_inetgt, gbt_inetge, gbt_ineteq, diff --git a/contrib/btree_gist/btree_int2.c b/contrib/btree_gist/btree_int2.c index d51ad0c2ab2efb7f1e1b00705f8650365e06addc..a88aae64537c32d2caeeb18d2d58da96eda5e2d9 100644 --- a/contrib/btree_gist/btree_int2.c +++ b/contrib/btree_gist/btree_int2.c @@ -77,6 +77,7 @@ static const gbtree_ninfo tinfo = { gbt_t_int2, sizeof(int16), + 4, /* sizeof(gbtreekey4) */ gbt_int2gt, gbt_int2ge, gbt_int2eq, diff --git a/contrib/btree_gist/btree_int4.c b/contrib/btree_gist/btree_int4.c index e7641f22847a975d7b4de7b9a75941d99887bd8d..889a5120783346855056ecc16603653678957058 100644 --- a/contrib/btree_gist/btree_int4.c +++ b/contrib/btree_gist/btree_int4.c @@ -78,6 +78,7 @@ static const gbtree_ninfo tinfo = { gbt_t_int4, sizeof(int32), + 8, /* sizeof(gbtreekey8) */ gbt_int4gt, gbt_int4ge, gbt_int4eq, diff --git a/contrib/btree_gist/btree_int8.c b/contrib/btree_gist/btree_int8.c index 8bc8cb5fdf7de08ff5ec2e759eb39bfd36b8227c..8685cee1760ac24eccdeca9a747c885bac79bf35 100644 --- a/contrib/btree_gist/btree_int8.c +++ b/contrib/btree_gist/btree_int8.c @@ -78,6 +78,7 @@ static const gbtree_ninfo tinfo = { gbt_t_int8, sizeof(int64), + 16, /* sizeof(gbtreekey16) */ gbt_int8gt, gbt_int8ge, gbt_int8eq, diff --git a/contrib/btree_gist/btree_interval.c b/contrib/btree_gist/btree_interval.c index 93a341eb77e4abf9ac287a275379e532de39d809..68d80e8e0ae765b56c18c30b0f79a0754b46f0b6 100644 --- a/contrib/btree_gist/btree_interval.c +++ b/contrib/btree_gist/btree_interval.c @@ -87,7 +87,9 @@ gbt_intv_dist(const void *a, const void *b) /* * INTERVALSIZE should be the actual size-on-disk of an Interval, as shown * in pg_type. This might be less than sizeof(Interval) if the compiler - * insists on adding alignment padding at the end of the struct. + * insists on adding alignment padding at the end of the struct. (Note: + * this concern is obsolete with the current definition of Interval, but + * was real before a separate "day" field was added to it.) */ #define INTERVALSIZE 16 @@ -95,6 +97,7 @@ static const gbtree_ninfo tinfo = { gbt_t_intv, sizeof(Interval), + 32, /* sizeof(gbtreekey32) */ gbt_intvgt, gbt_intvge, gbt_intveq, diff --git a/contrib/btree_gist/btree_macaddr.c b/contrib/btree_gist/btree_macaddr.c index 6255564ac5abaaad828db3168dcec76c28a70144..244b95154bb7b7e137420755071d505a5c4653c4 100644 --- a/contrib/btree_gist/btree_macaddr.c +++ b/contrib/btree_gist/btree_macaddr.c @@ -74,6 +74,7 @@ static const gbtree_ninfo tinfo = { gbt_t_macad, sizeof(macaddr), + 16, /* sizeof(gbtreekey16) */ gbt_macadgt, gbt_macadge, gbt_macadeq, diff --git a/contrib/btree_gist/btree_oid.c b/contrib/btree_gist/btree_oid.c index dcd0765417bf6833a974fcb03af1f7d96e64e50a..f6b7bfa05b729bc97d28a65446710f8390f83c26 100644 --- a/contrib/btree_gist/btree_oid.c +++ b/contrib/btree_gist/btree_oid.c @@ -84,6 +84,7 @@ static const gbtree_ninfo tinfo = { gbt_t_oid, sizeof(Oid), + 8, /* sizeof(gbtreekey8) */ gbt_oidgt, gbt_oidge, gbt_oideq, diff --git a/contrib/btree_gist/btree_time.c b/contrib/btree_gist/btree_time.c index e0e32428e22f1b96faac017a9ab9952c82f8afcc..cdf81711e76513022692fabd228a0e892b08d3f8 100644 --- a/contrib/btree_gist/btree_time.c +++ b/contrib/btree_gist/btree_time.c @@ -124,6 +124,7 @@ static const gbtree_ninfo tinfo = { gbt_t_time, sizeof(TimeADT), + 16, /* sizeof(gbtreekey16) */ gbt_timegt, gbt_timege, gbt_timeeq, diff --git a/contrib/btree_gist/btree_ts.c b/contrib/btree_gist/btree_ts.c index 10f325d67202e77ca3ff7d6f7a01750e5d034406..a13dcc8beaa3d42a5c5dbc4f533c0d1cbca3189c 100644 --- a/contrib/btree_gist/btree_ts.c +++ b/contrib/btree_gist/btree_ts.c @@ -127,6 +127,7 @@ static const gbtree_ninfo tinfo = { gbt_t_ts, sizeof(Timestamp), + 16, /* sizeof(gbtreekey16) */ gbt_tsgt, gbt_tsge, gbt_tseq, diff --git a/contrib/btree_gist/btree_utils_num.c b/contrib/btree_gist/btree_utils_num.c index 5e52ab542bfe4f82ac57e31447ca2c18b2c30017..505633c98b815bf15c52e5254a64697fa6e959db 100644 --- a/contrib/btree_gist/btree_utils_num.c +++ b/contrib/btree_gist/btree_utils_num.c @@ -28,7 +28,7 @@ gbt_num_compress(GISTENTRY *retval, GISTENTRY *entry, const gbtree_ninfo *tinfo) Cash ch; } v; - GBT_NUMKEY *r = (GBT_NUMKEY *) palloc0(2 * tinfo->size); + GBT_NUMKEY *r = (GBT_NUMKEY *) palloc0(tinfo->indexsize); void *leaf = NULL; switch (tinfo->t) @@ -77,6 +77,8 @@ gbt_num_compress(GISTENTRY *retval, GISTENTRY *entry, const gbtree_ninfo *tinfo) leaf = DatumGetPointer(entry->key); } + Assert(tinfo->indexsize >= 2 * tinfo->size); + memcpy((void *) &r[0], leaf, tinfo->size); memcpy((void *) &r[tinfo->size], leaf, tinfo->size); retval = palloc(sizeof(GISTENTRY)); @@ -165,7 +167,7 @@ gbt_num_bin_union(Datum *u, GBT_NUMKEY *e, const gbtree_ninfo *tinfo) if (!DatumGetPointer(*u)) { - *u = PointerGetDatum(palloc(2 * tinfo->size)); + *u = PointerGetDatum(palloc0(tinfo->indexsize)); memcpy((void *) &(((GBT_NUMKEY *) DatumGetPointer(*u))[0]), (void *) rd.lower, tinfo->size); memcpy((void *) &(((GBT_NUMKEY *) DatumGetPointer(*u))[tinfo->size]), (void *) rd.upper, tinfo->size); } diff --git a/contrib/btree_gist/btree_utils_num.h b/contrib/btree_gist/btree_utils_num.h index d7a61d2242690ce00649f9a7eb4fedb9d820c3f0..0d79cd2a7f7c1d861d442fd6f381c94a5b952f01 100644 --- a/contrib/btree_gist/btree_utils_num.h +++ b/contrib/btree_gist/btree_utils_num.h @@ -37,7 +37,8 @@ typedef struct /* Attribs */ enum gbtree_type t; /* data type */ - int32 size; /* size of type , 0 means variable */ + int32 size; /* size of type, 0 means variable */ + int32 indexsize; /* size of datums stored in index */ /* Methods */