diff options
Diffstat (limited to 'src')
-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 f0bcff72cbc..1fe1ff73490 100644 --- a/src/backend/optimizer/plan/createplan.c +++ b/src/backend/optimizer/plan/createplan.c @@ -877,6 +877,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 df1f999829e..9db48110458 100644 --- a/src/test/regress/expected/gist.out +++ b/src/test/regress/expected/gist.out @@ -281,6 +281,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 2a49769ebd5..afe2f5c053a 100644 --- a/src/test/regress/sql/gist.sql +++ b/src/test/regress/sql/gist.sql @@ -143,6 +143,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; |