aboutsummaryrefslogtreecommitdiff
path: root/contrib/btree_gist/btree_utils_num.c
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/btree_gist/btree_utils_num.c')
-rw-r--r--contrib/btree_gist/btree_utils_num.c58
1 files changed, 58 insertions, 0 deletions
diff --git a/contrib/btree_gist/btree_utils_num.c b/contrib/btree_gist/btree_utils_num.c
index 86a7f486f9f..5bfe659f917 100644
--- a/contrib/btree_gist/btree_utils_num.c
+++ b/contrib/btree_gist/btree_utils_num.c
@@ -93,6 +93,64 @@ gbt_num_compress(GISTENTRY *entry, const gbtree_ninfo *tinfo)
return retval;
}
+/*
+ * Convert a compressed leaf item back to the original type, for index-only
+ * scans.
+ */
+GISTENTRY *
+gbt_num_fetch(GISTENTRY *entry, const gbtree_ninfo *tinfo)
+{
+ GISTENTRY *retval;
+ Datum datum;
+
+ Assert(tinfo->indexsize >= 2 * tinfo->size);
+
+ /*
+ * Get the original Datum from the stored datum. On leaf entries, the
+ * lower and upper bound are the same. We just grab the lower bound and
+ * return it.
+ */
+ switch (tinfo->t)
+ {
+ case gbt_t_int2:
+ datum = Int16GetDatum(*(int16 *) entry->key);
+ break;
+ case gbt_t_int4:
+ datum = Int32GetDatum(*(int32 *) entry->key);
+ break;
+ case gbt_t_int8:
+ datum = Int64GetDatum(*(int64 *) entry->key);
+ break;
+ case gbt_t_oid:
+ datum = ObjectIdGetDatum(*(Oid *) entry->key);
+ break;
+ case gbt_t_float4:
+ datum = Float4GetDatum(*(float4 *) entry->key);
+ break;
+ case gbt_t_float8:
+ datum = Float8GetDatum(*(float8 *) entry->key);
+ break;
+ case gbt_t_date:
+ datum = DateADTGetDatum(*(DateADT *) entry->key);
+ break;
+ case gbt_t_time:
+ datum = TimeADTGetDatum(*(TimeADT *) entry->key);
+ break;
+ case gbt_t_ts:
+ datum = TimestampGetDatum(*(Timestamp *) entry->key);
+ break;
+ case gbt_t_cash:
+ datum = CashGetDatum(*(Cash *) entry->key);
+ break;
+ default:
+ datum = PointerGetDatum(entry->key);
+ }
+
+ retval = palloc(sizeof(GISTENTRY));
+ gistentryinit(*retval, datum, entry->rel, entry->page, entry->offset,
+ FALSE);
+ return retval;
+}