On 03/28/2015 09:36 PM, Andreas Karlsson wrote:
Thanks! Do you know if it is possible to add index-only scan support to range indexes? I have never looked at those and do not know if they are lossy.
Seems like range types are not compressed at all so implementing index-only scans was trivial. A patch is attached.
-- Andreas Karlsson
diff --git a/src/backend/utils/adt/rangetypes_gist.c b/src/backend/utils/adt/rangetypes_gist.c index c1ff471..dea8f04 100644 --- a/src/backend/utils/adt/rangetypes_gist.c +++ b/src/backend/utils/adt/rangetypes_gist.c @@ -216,7 +216,7 @@ range_gist_union(PG_FUNCTION_ARGS) PG_RETURN_RANGE(result_range); } -/* compress, decompress are no-ops */ +/* compress, decompress, fecth are no-ops */ Datum range_gist_compress(PG_FUNCTION_ARGS) { @@ -233,6 +233,14 @@ range_gist_decompress(PG_FUNCTION_ARGS) PG_RETURN_POINTER(entry); } +Datum +range_gist_fetch(PG_FUNCTION_ARGS) +{ + GISTENTRY *entry = (GISTENTRY *) PG_GETARG_POINTER(0); + + PG_RETURN_POINTER(entry); +} + /* * GiST page split penalty function. * diff --git a/src/include/catalog/pg_amproc.h b/src/include/catalog/pg_amproc.h index 037684c..e80c897 100644 --- a/src/include/catalog/pg_amproc.h +++ b/src/include/catalog/pg_amproc.h @@ -235,6 +235,7 @@ DATA(insert ( 3919 3831 3831 4 3878 )); DATA(insert ( 3919 3831 3831 5 3879 )); DATA(insert ( 3919 3831 3831 6 3880 )); DATA(insert ( 3919 3831 3831 7 3881 )); +DATA(insert ( 3919 3831 3831 9 3996 )); /* gin */ diff --git a/src/include/catalog/pg_proc.h b/src/include/catalog/pg_proc.h index a96d369..3cd7851 100644 --- a/src/include/catalog/pg_proc.h +++ b/src/include/catalog/pg_proc.h @@ -4951,6 +4951,8 @@ DATA(insert OID = 3877 ( range_gist_compress PGNSP PGUID 12 1 0 0 0 f f f f t f DESCR("GiST support"); DATA(insert OID = 3878 ( range_gist_decompress PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ range_gist_decompress _null_ _null_ _null_ )); DESCR("GiST support"); +DATA(insert OID = 3996 ( range_gist_fetch PGNSP PGUID 12 1 0 0 0 f f f f t f i 1 0 2281 "2281" _null_ _null_ _null_ _null_ range_gist_fetch _null_ _null_ _null_ )); +DESCR("GiST support"); DATA(insert OID = 3879 ( range_gist_penalty PGNSP PGUID 12 1 0 0 0 f f f f t f i 3 0 2281 "2281 2281 2281" _null_ _null_ _null_ _null_ range_gist_penalty _null_ _null_ _null_ )); DESCR("GiST support"); DATA(insert OID = 3880 ( range_gist_picksplit PGNSP PGUID 12 1 0 0 0 f f f f t f i 2 0 2281 "2281 2281" _null_ _null_ _null_ _null_ range_gist_picksplit _null_ _null_ _null_ )); diff --git a/src/include/utils/rangetypes.h b/src/include/utils/rangetypes.h index 173bf74..43c80f4 100644 --- a/src/include/utils/rangetypes.h +++ b/src/include/utils/rangetypes.h @@ -209,6 +209,7 @@ extern RangeType *make_empty_range(TypeCacheEntry *typcache); extern Datum range_gist_consistent(PG_FUNCTION_ARGS); extern Datum range_gist_compress(PG_FUNCTION_ARGS); extern Datum range_gist_decompress(PG_FUNCTION_ARGS); +extern Datum range_gist_fetch(PG_FUNCTION_ARGS); extern Datum range_gist_union(PG_FUNCTION_ARGS); extern Datum range_gist_penalty(PG_FUNCTION_ARGS); extern Datum range_gist_picksplit(PG_FUNCTION_ARGS); diff --git a/src/test/regress/expected/rangetypes.out b/src/test/regress/expected/rangetypes.out index 35d0dd3..8654e03 100644 --- a/src/test/regress/expected/rangetypes.out +++ b/src/test/regress/expected/rangetypes.out @@ -1072,6 +1072,25 @@ select count(*) from test_range_spgist where ir -|- int4range(100,500); 5 (1 row) +-- test index-only scans +explain (costs off) +select ir from test_range_spgist where ir -|- int4range(10,20) order by ir; + QUERY PLAN +------------------------------------------------------------------------ + Sort + Sort Key: ir + -> Index Only Scan using test_range_spgist_idx on test_range_spgist + Index Cond: (ir -|- '[10,20)'::int4range) +(4 rows) + +select ir from test_range_spgist where ir -|- int4range(10,20) order by ir; + ir +------------ + [20,30) + [20,30) + [20,10020) +(3 rows) + RESET enable_seqscan; RESET enable_indexscan; RESET enable_bitmapscan; diff --git a/src/test/regress/sql/rangetypes.sql b/src/test/regress/sql/rangetypes.sql index aa026ca..af13352 100644 --- a/src/test/regress/sql/rangetypes.sql +++ b/src/test/regress/sql/rangetypes.sql @@ -286,6 +286,11 @@ select count(*) from test_range_spgist where ir &< int4range(100,500); select count(*) from test_range_spgist where ir &> int4range(100,500); select count(*) from test_range_spgist where ir -|- int4range(100,500); +-- test index-only scans +explain (costs off) +select ir from test_range_spgist where ir -|- int4range(10,20) order by ir; +select ir from test_range_spgist where ir -|- int4range(10,20) order by ir; + RESET enable_seqscan; RESET enable_indexscan; RESET enable_bitmapscan;
-- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers