mirror of
https://git.postgresql.org/git/postgresql.git
synced 2026-02-23 14:57:03 +08:00
btree_gist's gist_inet_ops and gist_cidr_ops opclasses are fundamentally broken: they rely on an approximate representation of the inet values and hence sometimes miss rows they should return. We want to eventually get rid of them altogether, but as the first step on that journey, we should mark them not-opcdefault. To do that, roll up the preceding deltas since 1.2 into a new base script btree_gist--1.9.sql. This will allow installing 1.9 without going through a transient situation where gist_inet_ops and gist_cidr_ops are marked as opcdefault; trying to create them that way will fail if there's already a matching default opclass in the core system. Additionally provide btree_gist--1.8--1.9.sql, so that a database that's been pg_upgraded from an older version can be migrated to 1.9. I noted along the way that commit 57e3c5160 had missed marking the gist_bool_ops support functions as PARALLEL SAFE. While that probably has little harmful effect (since AFAIK we don't check that when calling index support functions), this seems like a good time to make things consistent. Readers will also note that I removed the former habit of installing some opclass operators/functions with ALTER OPERATOR FAMILY, instead just rolling them all into the CREATE OPERATOR CLASS steps. The comment in btree_gist--1.2.sql that it's necessary to use ALTER for pg_upgrade reproducibility has been obsolete since we invented the amadjustmembers infrastructure. Nowadays, gistadjustmembers will force all operators and non-required support functions to have "soft" opfamily dependencies, regardless of whether they are installed by CREATE or ALTER. Author: Tom Lane <tgl@sss.pgh.pa.us> Reviewed-by: Matthias van de Meent <boekewurm+postgres@gmail.com> Reviewed-by: Heikki Linnakangas <hlinnaka@iki.fi> Discussion: https://postgr.es/m/2483812.1754072263@sss.pgh.pa.us
50 lines
1.4 KiB
SQL
50 lines
1.4 KiB
SQL
-- inet check
|
|
|
|
CREATE TABLE inettmp (a inet);
|
|
|
|
\copy inettmp from 'data/inet.data'
|
|
|
|
SET enable_seqscan=on;
|
|
|
|
SELECT count(*) FROM inettmp WHERE a < '89.225.196.191';
|
|
|
|
SELECT count(*) FROM inettmp WHERE a <= '89.225.196.191';
|
|
|
|
SELECT count(*) FROM inettmp WHERE a = '89.225.196.191';
|
|
|
|
SELECT count(*) FROM inettmp WHERE a >= '89.225.196.191';
|
|
|
|
SELECT count(*) FROM inettmp WHERE a > '89.225.196.191';
|
|
|
|
CREATE INDEX inetidx ON inettmp USING gist ( a gist_inet_ops );
|
|
|
|
SET enable_seqscan=off;
|
|
|
|
SELECT count(*) FROM inettmp WHERE a < '89.225.196.191'::inet;
|
|
|
|
SELECT count(*) FROM inettmp WHERE a <= '89.225.196.191'::inet;
|
|
|
|
SELECT count(*) FROM inettmp WHERE a = '89.225.196.191'::inet;
|
|
|
|
SELECT count(*) FROM inettmp WHERE a >= '89.225.196.191'::inet;
|
|
|
|
SELECT count(*) FROM inettmp WHERE a > '89.225.196.191'::inet;
|
|
|
|
VACUUM ANALYZE inettmp;
|
|
|
|
-- gist_inet_ops lacks a fetch function, so this should not be index-only scan
|
|
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;
|
|
|
|
DROP INDEX inetidx;
|
|
|
|
CREATE INDEX ON inettmp USING gist (a gist_inet_ops, a inet_ops);
|
|
|
|
-- this can be an index-only scan, as long as the planner uses the right column
|
|
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;
|