mirror of
https://github.com/postgres/postgres.git
synced 2025-07-27 12:41:57 +03:00
please apply attached patch to current CVS.
Changes: 1. Added support for boolean queries (indexable operator @@, looks like a @@ '1|(2&3)' 2. Some code cleanup and optimization Regards, Oleg
This commit is contained in:
@ -3,6 +3,229 @@
|
||||
-- does not depend on contents of seg.sql.
|
||||
--
|
||||
\set ECHO none
|
||||
--test query_int
|
||||
select '1'::query_int;
|
||||
?column?
|
||||
----------
|
||||
1
|
||||
(1 row)
|
||||
|
||||
select ' 1'::query_int;
|
||||
?column?
|
||||
----------
|
||||
1
|
||||
(1 row)
|
||||
|
||||
select '1 '::query_int;
|
||||
?column?
|
||||
----------
|
||||
1
|
||||
(1 row)
|
||||
|
||||
select ' 1 '::query_int;
|
||||
?column?
|
||||
----------
|
||||
1
|
||||
(1 row)
|
||||
|
||||
select ' ! 1 '::query_int;
|
||||
?column?
|
||||
----------
|
||||
!1
|
||||
(1 row)
|
||||
|
||||
select '!1'::query_int;
|
||||
?column?
|
||||
----------
|
||||
!1
|
||||
(1 row)
|
||||
|
||||
select '1|2'::query_int;
|
||||
?column?
|
||||
----------
|
||||
1 | 2
|
||||
(1 row)
|
||||
|
||||
select '1|!2'::query_int;
|
||||
?column?
|
||||
----------
|
||||
1 | !2
|
||||
(1 row)
|
||||
|
||||
select '!1|2'::query_int;
|
||||
?column?
|
||||
----------
|
||||
!1 | 2
|
||||
(1 row)
|
||||
|
||||
select '!1|!2'::query_int;
|
||||
?column?
|
||||
----------
|
||||
!1 | !2
|
||||
(1 row)
|
||||
|
||||
select '!(!1|!2)'::query_int;
|
||||
?column?
|
||||
--------------
|
||||
!( !1 | !2 )
|
||||
(1 row)
|
||||
|
||||
select '!(!1|2)'::query_int;
|
||||
?column?
|
||||
-------------
|
||||
!( !1 | 2 )
|
||||
(1 row)
|
||||
|
||||
select '!(1|!2)'::query_int;
|
||||
?column?
|
||||
-------------
|
||||
!( 1 | !2 )
|
||||
(1 row)
|
||||
|
||||
select '!(1|2)'::query_int;
|
||||
?column?
|
||||
------------
|
||||
!( 1 | 2 )
|
||||
(1 row)
|
||||
|
||||
select '1&2'::query_int;
|
||||
?column?
|
||||
----------
|
||||
1 & 2
|
||||
(1 row)
|
||||
|
||||
select '!1&2'::query_int;
|
||||
?column?
|
||||
----------
|
||||
!1 & 2
|
||||
(1 row)
|
||||
|
||||
select '1&!2'::query_int;
|
||||
?column?
|
||||
----------
|
||||
1 & !2
|
||||
(1 row)
|
||||
|
||||
select '!1&!2'::query_int;
|
||||
?column?
|
||||
----------
|
||||
!1 & !2
|
||||
(1 row)
|
||||
|
||||
select '(1&2)'::query_int;
|
||||
?column?
|
||||
----------
|
||||
1 & 2
|
||||
(1 row)
|
||||
|
||||
select '1&(2)'::query_int;
|
||||
?column?
|
||||
----------
|
||||
1 & 2
|
||||
(1 row)
|
||||
|
||||
select '!(1)&2'::query_int;
|
||||
?column?
|
||||
----------
|
||||
!1 & 2
|
||||
(1 row)
|
||||
|
||||
select '!(1&2)'::query_int;
|
||||
?column?
|
||||
------------
|
||||
!( 1 & 2 )
|
||||
(1 row)
|
||||
|
||||
select '1|2&3'::query_int;
|
||||
?column?
|
||||
-----------
|
||||
1 | 2 & 3
|
||||
(1 row)
|
||||
|
||||
select '1|(2&3)'::query_int;
|
||||
?column?
|
||||
-----------
|
||||
1 | 2 & 3
|
||||
(1 row)
|
||||
|
||||
select '(1|2)&3'::query_int;
|
||||
?column?
|
||||
---------------
|
||||
( 1 | 2 ) & 3
|
||||
(1 row)
|
||||
|
||||
select '1|2&!3'::query_int;
|
||||
?column?
|
||||
------------
|
||||
1 | 2 & !3
|
||||
(1 row)
|
||||
|
||||
select '1|!2&3'::query_int;
|
||||
?column?
|
||||
------------
|
||||
1 | !2 & 3
|
||||
(1 row)
|
||||
|
||||
select '!1|2&3'::query_int;
|
||||
?column?
|
||||
------------
|
||||
!1 | 2 & 3
|
||||
(1 row)
|
||||
|
||||
select '!1|(2&3)'::query_int;
|
||||
?column?
|
||||
------------
|
||||
!1 | 2 & 3
|
||||
(1 row)
|
||||
|
||||
select '!(1|2)&3'::query_int;
|
||||
?column?
|
||||
----------------
|
||||
!( 1 | 2 ) & 3
|
||||
(1 row)
|
||||
|
||||
select '(!1|2)&3'::query_int;
|
||||
?column?
|
||||
----------------
|
||||
( !1 | 2 ) & 3
|
||||
(1 row)
|
||||
|
||||
select '1|(2|(4|(5|6)))'::query_int;
|
||||
?column?
|
||||
-------------------------------
|
||||
1 | ( 2 | ( 4 | ( 5 | 6 ) ) )
|
||||
(1 row)
|
||||
|
||||
select '1|2|4|5|6'::query_int;
|
||||
?column?
|
||||
-------------------------------
|
||||
( ( ( 1 | 2 ) | 4 ) | 5 ) | 6
|
||||
(1 row)
|
||||
|
||||
select '1&(2&(4&(5&6)))'::query_int;
|
||||
?column?
|
||||
-------------------
|
||||
1 & 2 & 4 & 5 & 6
|
||||
(1 row)
|
||||
|
||||
select '1&2&4&5&6'::query_int;
|
||||
?column?
|
||||
-------------------
|
||||
1 & 2 & 4 & 5 & 6
|
||||
(1 row)
|
||||
|
||||
select '1&(2&(4&(5|6)))'::query_int;
|
||||
?column?
|
||||
-----------------------
|
||||
1 & 2 & 4 & ( 5 | 6 )
|
||||
(1 row)
|
||||
|
||||
select '1&(2&(4&(5|!6)))'::query_int;
|
||||
?column?
|
||||
------------------------
|
||||
1 & 2 & 4 & ( 5 | !6 )
|
||||
(1 row)
|
||||
|
||||
CREATE TABLE test__int( a int[] );
|
||||
\copy test__int from 'data/test__int.data'
|
||||
SELECT count(*) from test__int WHERE a && '{23,50}';
|
||||
@ -11,12 +234,48 @@ SELECT count(*) from test__int WHERE a && '{23,50}';
|
||||
403
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '23|50';
|
||||
count
|
||||
-------
|
||||
403
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @ '{23,50}';
|
||||
count
|
||||
-------
|
||||
12
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '23&50';
|
||||
count
|
||||
-------
|
||||
12
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @ '{20,23}';
|
||||
count
|
||||
-------
|
||||
12
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '50&68';
|
||||
count
|
||||
-------
|
||||
9
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @ '{20,23}' or a @ '{50,68}';
|
||||
count
|
||||
-------
|
||||
21
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)';
|
||||
count
|
||||
-------
|
||||
21
|
||||
(1 row)
|
||||
|
||||
CREATE INDEX text_idx on test__int using gist ( a gist__int_ops );
|
||||
SELECT count(*) from test__int WHERE a && '{23,50}';
|
||||
count
|
||||
@ -24,12 +283,48 @@ SELECT count(*) from test__int WHERE a && '{23,50}';
|
||||
403
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '23|50';
|
||||
count
|
||||
-------
|
||||
403
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @ '{23,50}';
|
||||
count
|
||||
-------
|
||||
12
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '23&50';
|
||||
count
|
||||
-------
|
||||
12
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @ '{20,23}';
|
||||
count
|
||||
-------
|
||||
12
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '50&68';
|
||||
count
|
||||
-------
|
||||
9
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @ '{20,23}' or a @ '{50,68}';
|
||||
count
|
||||
-------
|
||||
21
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)';
|
||||
count
|
||||
-------
|
||||
21
|
||||
(1 row)
|
||||
|
||||
drop index text_idx;
|
||||
CREATE INDEX text_idx on test__int using gist ( a gist__intbig_ops );
|
||||
SELECT count(*) from test__int WHERE a && '{23,50}';
|
||||
@ -38,9 +333,45 @@ SELECT count(*) from test__int WHERE a && '{23,50}';
|
||||
403
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '23|50';
|
||||
count
|
||||
-------
|
||||
403
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @ '{23,50}';
|
||||
count
|
||||
-------
|
||||
12
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '23&50';
|
||||
count
|
||||
-------
|
||||
12
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @ '{20,23}';
|
||||
count
|
||||
-------
|
||||
12
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '50&68';
|
||||
count
|
||||
-------
|
||||
9
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @ '{20,23}' or a @ '{50,68}';
|
||||
count
|
||||
-------
|
||||
21
|
||||
(1 row)
|
||||
|
||||
SELECT count(*) from test__int WHERE a @@ '(20&23)|(50&68)';
|
||||
count
|
||||
-------
|
||||
21
|
||||
(1 row)
|
||||
|
||||
|
Reference in New Issue
Block a user