mirror of
https://git.postgresql.org/git/postgresql.git
synced 2024-09-28 00:01:51 +02:00
Handle mixed returnable and non-returnable columns better in IOS.
We can revert the code changes of commitb5febc1d1
now, because commit9a3ddeb51
installed a real solution for the difficulty thatb5febc1d1
just dodged, namely that the planner might pick the wrong one of several index columns nominally containing the same value. It only matters which one we pick if we pick one that's not returnable, and that mistake is now foreclosed. Although both of the aforementioned commits were back-patched, I don't feel a need to take any risk by back-patching this one. The cases that it improves are very corner-ish. Discussion: https://postgr.es/m/3179992.1641150853@sss.pgh.pa.us
This commit is contained in:
parent
9a3ddeb519
commit
8a2e323f20
@ -83,13 +83,13 @@ SELECT count(*) FROM inettmp WHERE a = '89.225.196.191'::inet;
|
|||||||
|
|
||||||
DROP INDEX inetidx;
|
DROP INDEX inetidx;
|
||||||
CREATE INDEX ON inettmp USING gist (a gist_inet_ops, a inet_ops);
|
CREATE INDEX ON inettmp USING gist (a gist_inet_ops, a inet_ops);
|
||||||
-- likewise here (checks for core planner bug)
|
-- this can be an index-only scan, as long as the planner uses the right column
|
||||||
EXPLAIN (COSTS OFF)
|
EXPLAIN (COSTS OFF)
|
||||||
SELECT count(*) FROM inettmp WHERE a = '89.225.196.191'::inet;
|
SELECT count(*) FROM inettmp WHERE a = '89.225.196.191'::inet;
|
||||||
QUERY PLAN
|
QUERY PLAN
|
||||||
----------------------------------------------------
|
---------------------------------------------------------
|
||||||
Aggregate
|
Aggregate
|
||||||
-> Index Scan using inettmp_a_a1_idx on inettmp
|
-> Index Only Scan using inettmp_a_a1_idx on inettmp
|
||||||
Index Cond: (a = '89.225.196.191'::inet)
|
Index Cond: (a = '89.225.196.191'::inet)
|
||||||
(3 rows)
|
(3 rows)
|
||||||
|
|
||||||
|
@ -42,7 +42,7 @@ DROP INDEX inetidx;
|
|||||||
|
|
||||||
CREATE INDEX ON inettmp USING gist (a gist_inet_ops, a inet_ops);
|
CREATE INDEX ON inettmp USING gist (a gist_inet_ops, a inet_ops);
|
||||||
|
|
||||||
-- likewise here (checks for core planner bug)
|
-- this can be an index-only scan, as long as the planner uses the right column
|
||||||
EXPLAIN (COSTS OFF)
|
EXPLAIN (COSTS OFF)
|
||||||
SELECT count(*) FROM inettmp WHERE a = '89.225.196.191'::inet;
|
SELECT count(*) FROM inettmp WHERE a = '89.225.196.191'::inet;
|
||||||
|
|
||||||
|
@ -1807,7 +1807,6 @@ check_index_only(RelOptInfo *rel, IndexOptInfo *index)
|
|||||||
bool result;
|
bool result;
|
||||||
Bitmapset *attrs_used = NULL;
|
Bitmapset *attrs_used = NULL;
|
||||||
Bitmapset *index_canreturn_attrs = NULL;
|
Bitmapset *index_canreturn_attrs = NULL;
|
||||||
Bitmapset *index_cannotreturn_attrs = NULL;
|
|
||||||
ListCell *lc;
|
ListCell *lc;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
@ -1847,11 +1846,7 @@ check_index_only(RelOptInfo *rel, IndexOptInfo *index)
|
|||||||
|
|
||||||
/*
|
/*
|
||||||
* Construct a bitmapset of columns that the index can return back in an
|
* Construct a bitmapset of columns that the index can return back in an
|
||||||
* index-only scan. If there are multiple index columns containing the
|
* index-only scan.
|
||||||
* same attribute, all of them must be capable of returning the value,
|
|
||||||
* since we might recheck operators on any of them. (Potentially we could
|
|
||||||
* be smarter about that, but it's such a weird situation that it doesn't
|
|
||||||
* seem worth spending a lot of sweat on.)
|
|
||||||
*/
|
*/
|
||||||
for (i = 0; i < index->ncolumns; i++)
|
for (i = 0; i < index->ncolumns; i++)
|
||||||
{
|
{
|
||||||
@ -1868,21 +1863,13 @@ check_index_only(RelOptInfo *rel, IndexOptInfo *index)
|
|||||||
index_canreturn_attrs =
|
index_canreturn_attrs =
|
||||||
bms_add_member(index_canreturn_attrs,
|
bms_add_member(index_canreturn_attrs,
|
||||||
attno - FirstLowInvalidHeapAttributeNumber);
|
attno - FirstLowInvalidHeapAttributeNumber);
|
||||||
else
|
|
||||||
index_cannotreturn_attrs =
|
|
||||||
bms_add_member(index_cannotreturn_attrs,
|
|
||||||
attno - FirstLowInvalidHeapAttributeNumber);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
index_canreturn_attrs = bms_del_members(index_canreturn_attrs,
|
|
||||||
index_cannotreturn_attrs);
|
|
||||||
|
|
||||||
/* Do we have all the necessary attributes? */
|
/* Do we have all the necessary attributes? */
|
||||||
result = bms_is_subset(attrs_used, index_canreturn_attrs);
|
result = bms_is_subset(attrs_used, index_canreturn_attrs);
|
||||||
|
|
||||||
bms_free(attrs_used);
|
bms_free(attrs_used);
|
||||||
bms_free(index_canreturn_attrs);
|
bms_free(index_canreturn_attrs);
|
||||||
bms_free(index_cannotreturn_attrs);
|
|
||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user