diff options
-rw-r--r-- | src/backend/optimizer/plan/createplan.c | 16 | ||||
-rw-r--r-- | src/test/regress/expected/gist.out | 16 | ||||
-rw-r--r-- | src/test/regress/sql/gist.sql | 5 |
3 files changed, 37 insertions, 0 deletions
diff --git a/src/backend/optimizer/plan/createplan.c b/src/backend/optimizer/plan/createplan.c index cd6d72c7633..fa069a217c8 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -915,6 +915,22 @@ use_physical_tlist(PlannerInfo *root, Path *path, int flags) } /* + * For an index-only scan, the "physical tlist" is the index's indextlist. + * We can only return that without a projection if all the index's columns + * are returnable. + */ + if (path->pathtype == T_IndexOnlyScan) + { + IndexOptInfo *indexinfo = ((IndexPath *) path)->indexinfo; + + for (i = 0; i < indexinfo->ncolumns; i++) + { + if (!indexinfo->canreturn[i]) + return false; + } + } + + /* * Also, can't do it if CP_LABEL_TLIST is specified and path is requested * to emit any sort/group columns that are not simple Vars. (If they are * simple Vars, they should appear in the physical tlist, and diff --git a/src/test/regress/expected/gist.out b/src/test/regress/expected/gist.out index 4ba2e7f29e0..2393132ed67 100644 --- a/src/test/regress/expected/gist.out +++ b/src/test/regress/expected/gist.out @@ -357,6 +357,22 @@ select p from gist_tbl where circle(p,1) @> circle(point(0,0),0.95); (0,0) (1 row) +-- Also check that use_physical_tlist doesn't trigger in such cases. +explain (verbose, costs off) +select count(*) from gist_tbl; + QUERY PLAN +--------------------------------------------------------------------- + Aggregate + Output: count(*) + -> Index Only Scan using gist_tbl_multi_index on public.gist_tbl +(3 rows) + +select count(*) from gist_tbl; + count +------- + 10001 +(1 row) + -- This case isn't supported, but it should at least EXPLAIN correctly. explain (verbose, costs off) select p from gist_tbl order by circle(p,1) <-> point(0,0) limit 1; diff --git a/src/test/regress/sql/gist.sql b/src/test/regress/sql/gist.sql index cf1069c2072..d94a0bb2f75 100644 --- a/src/test/regress/sql/gist.sql +++ b/src/test/regress/sql/gist.sql @@ -159,6 +159,11 @@ explain (verbose, costs off) select p from gist_tbl where circle(p,1) @> circle(point(0,0),0.95); select p from gist_tbl where circle(p,1) @> circle(point(0,0),0.95); +-- Also check that use_physical_tlist doesn't trigger in such cases. +explain (verbose, costs off) +select count(*) from gist_tbl; +select count(*) from gist_tbl; + -- This case isn't supported, but it should at least EXPLAIN correctly. explain (verbose, costs off) select p from gist_tbl order by circle(p,1) <-> point(0,0) limit 1; |