aboutsummaryrefslogtreecommitdiff
path: root/contrib/btree_gist/btree_utils_num.c
diff options
context:
space:
mode:
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>2015-03-27 23:35:16 +0200
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>2015-03-27 23:35:16 +0200
commite09b48316c22fce727bce3c89fa64fc627787e6a (patch)
tree107a22f368efd340c6f545f0e6b7130b5063aa08 /contrib/btree_gist/btree_utils_num.c
parent735cd6128a6a401671126443a9af4324932a38d6 (diff)
downloadpostgresql-e09b48316c22fce727bce3c89fa64fc627787e6a.tar.gz
postgresql-e09b48316c22fce727bce3c89fa64fc627787e6a.zip
Add index-only scan support to btree_gist.
inet, cidr, and timetz indexes still cannot support index-only scans, because they don't store the original unmodified value in the index, but a derived approximate value.
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;
+}