Add index-only scan support to range type GiST opclass.
authorHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 30 Mar 2015 10:21:43 +0000 (13:21 +0300)
committerHeikki Linnakangas <heikki.linnakangas@iki.fi>
Mon, 30 Mar 2015 10:22:38 +0000 (13:22 +0300)
Andreas Karlsson

src/backend/utils/adt/rangetypes_gist.c
src/include/catalog/catversion.h
src/include/catalog/pg_amproc.h
src/include/catalog/pg_proc.h
src/include/utils/rangetypes.h
src/test/regress/expected/rangetypes.out
src/test/regress/sql/rangetypes.sql

index c1ff471e3019e49e29ff3bd22a564f65b9c349f2..ef841219d0067acbcc850ef2a02aafb7fefd60cb 100644 (file)
@@ -216,7 +216,7 @@ range_gist_union(PG_FUNCTION_ARGS)
    PG_RETURN_RANGE(result_range);
 }
 
-/* compress, decompress are no-ops */
+/* compress, decompress, fetch 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.
  *
index f3f148a8c52acaa448f414ad2f4ec3f950b32ca5..0fde1d6ec6d6244169e7d969cd553a6f85886e26 100644 (file)
@@ -53,6 +53,6 @@
  */
 
 /*                         yyyymmddN */
-#define CATALOG_VERSION_NO 201503281
+#define CATALOG_VERSION_NO 201503301
 
 #endif
index 037684c3f2ba560d0d11bf253ba5821570b8f359..8a43f64949774e471cd8ac6f9dd5b7f755fa6938 100644 (file)
@@ -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 */
index a96d3695dfc86545ba15b2d54e72ea233ed78f91..3cd7851c4ac13d5186ecd99d9a6f8853d29d20fc 100644 (file)
@@ -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_ ));
index 173bf749d7fb0a3d2848521daec5fc9ae0a7908a..43c80f493c8a817f131a9ca17c552f3feb7964a4 100644 (file)
@@ -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);
index 35d0dd3f677e5c4d136997f7f867c83663576203..8654e031dae40d49864e6919104be34faf8a05be 100644 (file)
@@ -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;
index aa026cad0abc2898ac5203f117d82b13e5da8c98..af1335264dc99939b8a807684ee2d301810c9dfc 100644 (file)
@@ -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;