summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/backend/optimizer/path/indxpath.c10
-rw-r--r--src/test/regress/expected/hash_index.out21
-rw-r--r--src/test/regress/sql/hash_index.sql13
3 files changed, 44 insertions, 0 deletions
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c
index c62e3f87724..2654c59c4c6 100644
--- a/src/backend/optimizer/path/indxpath.c
+++ b/src/backend/optimizer/path/indxpath.c
@@ -4051,6 +4051,16 @@ check_index_predicates(PlannerInfo *root, RelOptInfo *rel)
if (is_target_rel)
continue;
+ /*
+ * If index is !amoptionalkey, also leave indrestrictinfo as set
+ * above. Otherwise we risk removing all quals for the first index
+ * key and then not being able to generate an indexscan at all. It
+ * would be better to be more selective, but we've not yet identified
+ * which if any of the quals match the first index key.
+ */
+ if (!index->amoptionalkey)
+ continue;
+
/* Else compute indrestrictinfo as the non-implied quals */
index->indrestrictinfo = NIL;
foreach(lcr, rel->baserestrictinfo)
diff --git a/src/test/regress/expected/hash_index.out b/src/test/regress/expected/hash_index.out
index 0d4bdb2adef..04035400f12 100644
--- a/src/test/regress/expected/hash_index.out
+++ b/src/test/regress/expected/hash_index.out
@@ -40,6 +40,8 @@ CREATE INDEX hash_name_index ON hash_name_heap USING hash (random name_ops);
CREATE INDEX hash_txt_index ON hash_txt_heap USING hash (random text_ops);
CREATE INDEX hash_f8_index ON hash_f8_heap USING hash (random float8_ops)
WITH (fillfactor=60);
+CREATE INDEX hash_i4_partial_index ON hash_i4_heap USING hash (seqno)
+ WHERE seqno = 9999;
--
-- Also try building functional, expressional, and partial indexes on
-- tables that already contain data.
@@ -132,6 +134,25 @@ SELECT * FROM hash_f8_heap
(0 rows)
--
+-- partial hash index
+--
+EXPLAIN (COSTS OFF)
+SELECT * FROM hash_i4_heap
+ WHERE seqno = 9999;
+ QUERY PLAN
+--------------------------------------------------------
+ Index Scan using hash_i4_partial_index on hash_i4_heap
+ Index Cond: (seqno = 9999)
+(2 rows)
+
+SELECT * FROM hash_i4_heap
+ WHERE seqno = 9999;
+ seqno | random
+-------+------------
+ 9999 | 1227676208
+(1 row)
+
+--
-- hash index
-- grep '^90[^0-9]' hashovfl.data
--
diff --git a/src/test/regress/sql/hash_index.sql b/src/test/regress/sql/hash_index.sql
index 219da829816..60571f6cdf1 100644
--- a/src/test/regress/sql/hash_index.sql
+++ b/src/test/regress/sql/hash_index.sql
@@ -53,6 +53,9 @@ CREATE INDEX hash_txt_index ON hash_txt_heap USING hash (random text_ops);
CREATE INDEX hash_f8_index ON hash_f8_heap USING hash (random float8_ops)
WITH (fillfactor=60);
+CREATE INDEX hash_i4_partial_index ON hash_i4_heap USING hash (seqno)
+ WHERE seqno = 9999;
+
--
-- Also try building functional, expressional, and partial indexes on
-- tables that already contain data.
@@ -118,6 +121,16 @@ SELECT * FROM hash_f8_heap
WHERE hash_f8_heap.random = '88888888'::float8;
--
+-- partial hash index
+--
+EXPLAIN (COSTS OFF)
+SELECT * FROM hash_i4_heap
+ WHERE seqno = 9999;
+
+SELECT * FROM hash_i4_heap
+ WHERE seqno = 9999;
+
+--
-- hash index
-- grep '^90[^0-9]' hashovfl.data
--