-- Check whether any of our opclasses fail amvalidate SELECT amname, opcname FROM pg_opclass opc LEFTJOIN pg_am am ON am.oid = opcmethod WHERE opc.oid >= 16384ANDNOT amvalidate(opc.oid);
SELECT str as"query_int",
pg_input_is_valid(str,'query_int') as ok,
errinfo.sql_error_code,
errinfo.message,
errinfo.detail,
errinfo.hint FROM (VALUES ('1&(2&(4&(5|6)))'),
('1#(2&(4&(5&6)))'),
('foo')) AS a(str),
LATERAL pg_input_error_info(a.str, 'query_int') as errinfo;
CREATETABLE test__int( a int[] );
\copy test__int from'data/test__int.data' ANALYZE test__int;
SELECT count(*) from test__int WHERE a && '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23|50'; SELECT count(*) from test__int WHERE a @> '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23&50'; SELECT count(*) from test__int WHERE a @> '{20,23}'; SELECT count(*) from test__int WHERE a <@ '{73,23,20}'; SELECT count(*) from test__int WHERE a = '{73,23,20}'; SELECT count(*) from test__int WHERE a @@ '50&68'; SELECT count(*) from test__int WHERE a @> '{20,23}'or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)';
SET enable_seqscan = off; -- not all of these would use index by default
CREATEINDEX text_idx on test__int using gist ( a gist__int_ops );
SELECT count(*) from test__int WHERE a && '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23|50'; SELECT count(*) from test__int WHERE a @> '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23&50'; SELECT count(*) from test__int WHERE a @> '{20,23}'; SELECT count(*) from test__int WHERE a <@ '{73,23,20}'; SELECT count(*) from test__int WHERE a = '{73,23,20}'; SELECT count(*) from test__int WHERE a @@ '50&68'; SELECT count(*) from test__int WHERE a @> '{20,23}'or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)';
INSERTINTO test__int SELECT array(SELECT x FROM generate_series(1, 1001) x); -- should fail
DROPINDEX text_idx; CREATEINDEX text_idx on test__int using gist (a gist__int_ops(numranges = 0)); CREATEINDEX text_idx on test__int using gist (a gist__int_ops(numranges = 253)); CREATEINDEX text_idx on test__int using gist (a gist__int_ops(numranges = 252));
SELECT count(*) from test__int WHERE a && '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23|50'; SELECT count(*) from test__int WHERE a @> '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23&50'; SELECT count(*) from test__int WHERE a @> '{20,23}'; SELECT count(*) from test__int WHERE a <@ '{73,23,20}'; SELECT count(*) from test__int WHERE a = '{73,23,20}'; SELECT count(*) from test__int WHERE a @@ '50&68'; SELECT count(*) from test__int WHERE a @> '{20,23}'or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)';
DROPINDEX text_idx; CREATEINDEX text_idx on test__int using gist (a gist__intbig_ops(siglen = 0)); CREATEINDEX text_idx on test__int using gist (a gist__intbig_ops(siglen = 2025)); CREATEINDEX text_idx on test__int using gist (a gist__intbig_ops(siglen = 2024));
SELECT count(*) from test__int WHERE a && '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23|50'; SELECT count(*) from test__int WHERE a @> '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23&50'; SELECT count(*) from test__int WHERE a @> '{20,23}'; SELECT count(*) from test__int WHERE a <@ '{73,23,20}'; SELECT count(*) from test__int WHERE a = '{73,23,20}'; SELECT count(*) from test__int WHERE a @@ '50&68'; SELECT count(*) from test__int WHERE a @> '{20,23}'or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)';
DROPINDEX text_idx; CREATEINDEX text_idx on test__int using gist ( a gist__intbig_ops );
SELECT count(*) from test__int WHERE a && '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23|50'; SELECT count(*) from test__int WHERE a @> '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23&50'; SELECT count(*) from test__int WHERE a @> '{20,23}'; SELECT count(*) from test__int WHERE a <@ '{73,23,20}'; SELECT count(*) from test__int WHERE a = '{73,23,20}'; SELECT count(*) from test__int WHERE a @@ '50&68'; SELECT count(*) from test__int WHERE a @> '{20,23}'or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)';
DROPINDEX text_idx; CREATEINDEX text_idx on test__int using gin ( a gin__int_ops );
SELECT count(*) from test__int WHERE a && '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23|50'; SELECT count(*) from test__int WHERE a @> '{23,50}'; SELECT count(*) from test__int WHERE a @@ '23&50'; SELECT count(*) from test__int WHERE a @> '{20,23}'; SELECT count(*) from test__int WHERE a <@ '{73,23,20}'; SELECT count(*) from test__int WHERE a = '{73,23,20}'; SELECT count(*) from test__int WHERE a @@ '50&68'; SELECT count(*) from test__int WHERE a @> '{20,23}'or a @> '{50,68}'; SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from test__int WHERE a @@ '20 | !21'; SELECT count(*) from test__int WHERE a @@ '!20 & !21'; SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)';
DROPINDEX text_idx;
-- Repeat the same queries with an extended data set. The data set is the -- same that we used before, except that each element in the array is -- repeated three times, offset by 1000 and 2000. For example, {1, 5} -- becomes {1, 1001, 2001, 5, 1005, 2005}. -- -- That has proven to be unreasonably effective at exercising codepaths in -- core GiST code related to splitting parent pages, which is not covered by -- other tests. This is a bit out-of-place as the point is to test core GiST -- code rather than this extension, but there is no suitable GiST opclass in -- core that would reach the same codepaths. CREATETABLE more__int ASSELECT -- Leave alone NULLs, empty arrays and the one row that we use to test -- equality; also skip INT_MAX CASEWHEN a ISNULLOR a = '{}'OR a = '{73,23,20}'THEN a ELSE
(select array_agg(u) || array_agg(u + 1000) || array_agg(u + 2000) from unnest(a) u where u < 2000000000)
END AS a, a as b FROM test__int; CREATEINDEXON more__int using gist (a gist__int_ops(numranges = 252));
SELECT count(*) from more__int WHERE a && '{23,50}'; SELECT count(*) from more__int WHERE a @@ '23|50'; SELECT count(*) from more__int WHERE a @> '{23,50}'; SELECT count(*) from more__int WHERE a @@ '23&50'; SELECT count(*) from more__int WHERE a @> '{20,23}'; SELECT count(*) from more__int WHERE a <@ '{73,23,20}'; SELECT count(*) from more__int WHERE a = '{73,23,20}'; SELECT count(*) from more__int WHERE a @@ '50&68'; SELECT count(*) from more__int WHERE a @> '{20,23}'or a @> '{50,68}'; SELECT count(*) from more__int WHERE a @@ '(20&23)|(50&68)'; SELECT count(*) from more__int WHERE a @@ '20 | !21'; SELECT count(*) from more__int WHERE a @@ '!20 & !21'; SELECT count(*) from test__int WHERE a @@ '!2733 & (2738 | 254)';
RESET enable_seqscan;
Messung V0.5 in Prozent
¤ Dauer der Verarbeitung: 0.14 Sekunden
(vorverarbeitet am 2026-08-08)
¤
Die Informationen auf dieser Webseite wurden
nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit,
noch Qualität der bereit gestellten Informationen zugesichert.
Bemerkung:
Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.