fix_check_index_only_scan.patch
text/x-patch
Filename: fix_check_index_only_scan.patch
Type: text/x-patch
Part: 0
Patch
Same data as JSON:
GET /api/v1/attachments/:id/patch
the parsed metadata as JSON — format, series position, per-file stats; never the diff bytes.
API reference →
Format: unified
| File | + | − |
|---|---|---|
| src/backend/optimizer/path/indxpath.c | 6 | 2 |
| src/test/regress/expected/gist.out | 27 | 0 |
| src/test/regress/sql/gist.sql | 27 | 0 |
diff --git a/src/backend/optimizer/path/indxpath.c b/src/backend/optimizer/path/indxpath.c index 2a50272da6..8fd3df8d69 100644 --- a/src/backend/optimizer/path/indxpath.c +++ b/src/backend/optimizer/path/indxpath.c @@ -1960,8 +1960,12 @@ check_index_only(RelOptInfo *rel, IndexOptInfo *index) index_canreturn_attrs = bms_del_members(index_canreturn_attrs, index_cannotreturn_attrs); - /* Do we have all the necessary attributes? */ - result = bms_is_subset(attrs_used, index_canreturn_attrs); + if (index_canreturn_attrs == NULL) + /* We don't have indexes that can return attributes. */ + result = false; + else + /* Do we have all the necessary attributes? */ + result = bms_is_subset(attrs_used, index_canreturn_attrs); bms_free(attrs_used); bms_free(index_canreturn_attrs); diff --git a/src/test/regress/expected/gist.out b/src/test/regress/expected/gist.out index 90edb4061d..a1b9fea2c2 100644 --- a/src/test/regress/expected/gist.out +++ b/src/test/regress/expected/gist.out @@ -317,3 +317,30 @@ reset enable_seqscan; reset enable_bitmapscan; reset enable_indexonlyscan; drop table gist_tbl; +-- +-- Test Index-only plans on GiST indexes when columns needless query. +-- +create table gist_count_tbl (tsv tsvector); +insert into gist_count_tbl values (null); +create index gist_count_tbl_index on gist_count_tbl using gist (tsv); +vacuum analyze gist_count_tbl; +set enable_seqscan=off; +set enable_bitmapscan=off; +set enable_indexonlyscan=on; +-- Test that an index-only scan is not chosen, +-- when the query doesn't use specify columns. +-- Because the index has not data to return in this case. +explain (costs off) +select count(*) from gist_count_tbl; + QUERY PLAN +---------------------------------- + Aggregate + -> Seq Scan on gist_count_tbl +(2 rows) + +-- Clean up +reset enable_seqscan; +reset enable_bitmapscan; +reset enable_indexonlyscan; +drop index gist_count_tbl_index; +drop table gist_count_tbl; diff --git a/src/test/regress/sql/gist.sql b/src/test/regress/sql/gist.sql index b9d398ea94..09d4372a7f 100644 --- a/src/test/regress/sql/gist.sql +++ b/src/test/regress/sql/gist.sql @@ -148,3 +148,30 @@ reset enable_bitmapscan; reset enable_indexonlyscan; drop table gist_tbl; + +-- +-- Test Index-only plans on GiST indexes when columns needless query. +-- +create table gist_count_tbl (tsv tsvector); +insert into gist_count_tbl values (null); +create index gist_count_tbl_index on gist_count_tbl using gist (tsv); + +vacuum analyze gist_count_tbl; + +set enable_seqscan=off; +set enable_bitmapscan=off; +set enable_indexonlyscan=on; + +-- Test that an index-only scan is not chosen, +-- when the query doesn't use specify columns. +-- Because the index has not data to return in this case. +explain (costs off) +select count(*) from gist_count_tbl; + +-- Clean up +reset enable_seqscan; +reset enable_bitmapscan; +reset enable_indexonlyscan; + +drop index gist_count_tbl_index; +drop table gist_count_tbl;