Skip to content

Commit cdd1527

Browse files
committed
Merge with rum_arrays_v1.2
2 parents 6cc3a18 + 65aae99 commit cdd1527

File tree

9 files changed

+1327
-7
lines changed

9 files changed

+1327
-7
lines changed

Makefile

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ OBJS = src/rumsort.o src/rum_ts_utils.o src/rumtsquery.o \
55
src/rumbtree.o src/rumbulk.o src/rumdatapage.o \
66
src/rumentrypage.o src/rumget.o src/ruminsert.o \
77
src/rumscan.o src/rumutil.o src/rumvacuum.o src/rumvalidate.o \
8-
src/btree_rum.o $(WIN32RES)
8+
src/btree_rum.o src/rum_arr_utils.o $(WIN32RES)
99

1010
EXTENSION = rum
1111
EXTVERSION = 1.2
@@ -20,7 +20,7 @@ REGRESS = rum rum_hash ruminv timestamp orderby orderby_hash altorder \
2020
int2 int4 int8 float4 float8 money oid \
2121
time timetz date interval \
2222
macaddr inet cidr text varchar char bytea bit varbit \
23-
numeric
23+
numeric anyarray
2424

2525
LDFLAGS_SL += $(filter -lm, $(LIBS))
2626

@@ -44,6 +44,7 @@ all: rum--$(EXTVERSION).sql
4444
rum--$(EXTVERSION).sql: $(DATA) $(DATA_updates)
4545
cat $(DATA) $(DATA_updates) > rum--$(EXTVERSION).sql
4646

47+
# rule for updates, e.g. rum--1.0--1.1.sql
4748
rum--%.sql: gen_rum_sql--%.pl
4849
perl $< > $@
4950

expected/anyarray.out

Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
set enable_seqscan=off;
2+
SET enable_bitmapscan=OFF;
3+
CREATE TABLE test_anyarray(
4+
i int[]
5+
);
6+
INSERT INTO test_anyarray
7+
SELECT ARRAY[1, x, x + 1] FROM generate_series(1, 10000) x;
8+
CREATE INDEX test_anyarray_idx ON test_anyarray USING rum (i);
9+
EXPLAIN (costs off)
10+
SELECT *, i <=> '{1}' FROM test_anyarray WHERE i % '{1}' ORDER BY i <=> '{1}' LIMIT 5;
11+
QUERY PLAN
12+
-----------------------------------------------------------
13+
Limit
14+
-> Index Scan using test_anyarray_idx on test_anyarray
15+
Index Cond: (i % '{1}'::integer[])
16+
Order By: (i <=> '{1}'::integer[])
17+
(4 rows)
18+
19+
SELECT *, i <=> '{1}' FROM test_anyarray WHERE i % '{1}' ORDER BY i <=> '{1}' LIMIT 5;
20+
i | ?column?
21+
---------+------------------
22+
{1,1,2} | 1.4142135623731
23+
{1,2,3} | 1.73205080756888
24+
{1,3,4} | 1.73205080756888
25+
{1,4,5} | 1.73205080756888
26+
{1,5,6} | 1.73205080756888
27+
(5 rows)
28+
29+
EXPLAIN (costs off)
30+
SELECT *, i <=> '{1}' FROM test_anyarray WHERE i @> '{1}' ORDER BY i <=> '{1}' LIMIT 5;
31+
QUERY PLAN
32+
-----------------------------------------------------------
33+
Limit
34+
-> Index Scan using test_anyarray_idx on test_anyarray
35+
Index Cond: (i @> '{1}'::integer[])
36+
Order By: (i <=> '{1}'::integer[])
37+
(4 rows)
38+
39+
SELECT *, i <=> '{1}' FROM test_anyarray WHERE i @> '{1}' ORDER BY i <=> '{1}' LIMIT 5;
40+
i | ?column?
41+
---------+------------------
42+
{1,1,2} | 1.4142135623731
43+
{1,2,3} | 1.73205080756888
44+
{1,3,4} | 1.73205080756888
45+
{1,4,5} | 1.73205080756888
46+
{1,5,6} | 1.73205080756888
47+
(5 rows)
48+
49+
EXPLAIN (costs off)
50+
SELECT *, i <=> '{1}' FROM test_anyarray WHERE i % '{1}' ORDER BY i <=> '{1}' LIMIT 5000;
51+
QUERY PLAN
52+
-----------------------------------------------------------
53+
Limit
54+
-> Index Scan using test_anyarray_idx on test_anyarray
55+
Index Cond: (i % '{1}'::integer[])
56+
Order By: (i <=> '{1}'::integer[])
57+
(4 rows)
58+
59+
CREATE TABLE test_anyarray_ts(
60+
i int[],
61+
d timestamp
62+
);
63+
INSERT INTO test_anyarray_ts VALUES
64+
( '{1,2,3}', '2004-10-26 03:55:08' ),
65+
( '{2,3,4}', '2004-10-26 04:55:08' ),
66+
( '{3,4,5}', '2004-10-26 05:55:08' ),
67+
( '{4,5,6}', '2004-10-26 08:55:08' ),
68+
( '{5,6,7}', '2004-10-26 09:55:08' ),
69+
( '{6,7,8}', '2004-10-26 10:55:08' )
70+
;
71+
CREATE INDEX test_anyarray_ts_idx ON test_anyarray_ts USING rum
72+
(i rum_anyarray_addon_ops, d)
73+
WITH (attach = 'd', to = 'i');
74+
EXPLAIN (costs off)
75+
SELECT *, d <=> '2004-10-26 08:00:00' FROM test_anyarray_ts WHERE i % '{3}' ORDER BY d <=> '2004-10-26 08:00:00' LIMIT 5;
76+
QUERY PLAN
77+
-----------------------------------------------------------------------------------
78+
Limit
79+
-> Index Scan using test_anyarray_ts_idx on test_anyarray_ts
80+
Order By: (d <=> 'Tue Oct 26 08:00:00 2004'::timestamp without time zone)
81+
Filter: (i % '{3}'::integer[])
82+
(4 rows)
83+
84+
SELECT *, d <=> '2004-10-26 08:00:00' FROM test_anyarray_ts WHERE i % '{3}' ORDER BY d <=> '2004-10-26 08:00:00' LIMIT 5;
85+
i | d | ?column?
86+
---------+--------------------------+----------
87+
{3,4,5} | Tue Oct 26 05:55:08 2004 | 7492
88+
{2,3,4} | Tue Oct 26 04:55:08 2004 | 11092
89+
{1,2,3} | Tue Oct 26 03:55:08 2004 | 14692
90+
(3 rows)
91+
92+
EXPLAIN (costs off)
93+
SELECT *, d <=> '2004-10-26 08:00:00' FROM test_anyarray_ts WHERE i @> '{3}' ORDER BY d <=> '2004-10-26 08:00:00' LIMIT 5;
94+
QUERY PLAN
95+
-----------------------------------------------------------------------------------
96+
Limit
97+
-> Index Scan using test_anyarray_ts_idx on test_anyarray_ts
98+
Index Cond: (i @> '{3}'::integer[])
99+
Order By: (d <=> 'Tue Oct 26 08:00:00 2004'::timestamp without time zone)
100+
(4 rows)
101+
102+
SELECT *, d <=> '2004-10-26 08:00:00' FROM test_anyarray_ts WHERE i @> '{3}' ORDER BY d <=> '2004-10-26 08:00:00' LIMIT 5;
103+
i | d | ?column?
104+
---------+--------------------------+----------
105+
{3,4,5} | Tue Oct 26 05:55:08 2004 | 7492
106+
{2,3,4} | Tue Oct 26 04:55:08 2004 | 11092
107+
{1,2,3} | Tue Oct 26 03:55:08 2004 | 14692
108+
(3 rows)
109+

gen_rum_sql--1.1--1.2.pl

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,8 @@
6464
* RUM version 1.2
6565
*/
6666
67+
/*--------------------tsvector-----------------------*/
68+
6769
DROP OPERATOR CLASS rum_tsvector_ops USING rum;
6870
DROP OPERATOR CLASS rum_tsvector_hash_ops USING rum;
6971
@@ -103,6 +105,93 @@
103105
FUNCTION 10 rum_ts_join_pos(internal, internal),
104106
STORAGE integer;
105107
108+
/*--------------------anyarray-----------------------*/
109+
110+
CREATE FUNCTION rum_anyarray_config(internal)
111+
RETURNS void
112+
AS 'MODULE_PATHNAME'
113+
LANGUAGE C IMMUTABLE STRICT;
114+
115+
116+
CREATE OR REPLACE FUNCTION rum_anyarray_similar(anyarray,anyarray)
117+
RETURNS bool
118+
AS 'MODULE_PATHNAME'
119+
LANGUAGE C STRICT STABLE;
120+
121+
CREATE OPERATOR % (
122+
PROCEDURE = rum_anyarray_similar,
123+
LEFTARG = anyarray,
124+
RIGHTARG = anyarray,
125+
COMMUTATOR = '%',
126+
RESTRICT = contsel,
127+
JOIN = contjoinsel
128+
);
129+
130+
131+
CREATE OR REPLACE FUNCTION rum_anyarray_distance(anyarray,anyarray)
132+
RETURNS float8
133+
AS 'MODULE_PATHNAME'
134+
LANGUAGE C STRICT STABLE;
135+
136+
CREATE OPERATOR <=> (
137+
PROCEDURE = rum_anyarray_distance,
138+
LEFTARG = anyarray,
139+
RIGHTARG = anyarray,
140+
COMMUTATOR = '<=>'
141+
);
142+
143+
144+
CREATE FUNCTION rum_extract_anyarray(anyarray,internal,internal,internal,internal)
145+
RETURNS internal
146+
AS 'MODULE_PATHNAME'
147+
LANGUAGE C IMMUTABLE STRICT;
148+
149+
CREATE FUNCTION rum_extract_anyarray_query(anyarray,internal,smallint,internal,internal,internal,internal)
150+
RETURNS internal
151+
AS 'MODULE_PATHNAME'
152+
LANGUAGE C IMMUTABLE STRICT;
153+
154+
CREATE FUNCTION rum_anyarray_consistent(internal, smallint, anyarray, integer, internal, internal, internal, internal)
155+
RETURNS bool
156+
AS 'MODULE_PATHNAME'
157+
LANGUAGE C IMMUTABLE STRICT;
158+
159+
CREATE FUNCTION rum_anyarray_ordering(internal,smallint,tsvector,int,internal,internal,internal,internal,internal)
160+
RETURNS float8
161+
AS 'MODULE_PATHNAME'
162+
LANGUAGE C IMMUTABLE STRICT;
163+
164+
165+
CREATE OPERATOR CLASS rum_anyarray_ops
166+
DEFAULT FOR TYPE anyarray USING rum
167+
AS
168+
OPERATOR 1 && (anyarray, anyarray),
169+
OPERATOR 2 @> (anyarray, anyarray),
170+
OPERATOR 3 <@ (anyarray, anyarray),
171+
OPERATOR 4 = (anyarray, anyarray),
172+
OPERATOR 5 % (anyarray, anyarray),
173+
OPERATOR 20 <=> (anyarray, anyarray) FOR ORDER BY pg_catalog.float_ops,
174+
--dispatch function 1 for concrete type
175+
FUNCTION 2 rum_extract_anyarray(anyarray,internal,internal,internal,internal),
176+
FUNCTION 3 rum_extract_anyarray_query(anyarray,internal,smallint,internal,internal,internal,internal),
177+
FUNCTION 4 rum_anyarray_consistent(internal,smallint,anyarray,integer,internal,internal,internal,internal),
178+
FUNCTION 6 rum_anyarray_config(internal),
179+
FUNCTION 8 rum_anyarray_ordering(internal,smallint,tsvector,int,internal,internal,internal,internal,internal),
180+
STORAGE anyelement;
181+
182+
CREATE OPERATOR CLASS rum_anyarray_addon_ops
183+
FOR TYPE anyarray USING rum
184+
AS
185+
OPERATOR 1 && (anyarray, anyarray),
186+
OPERATOR 2 @> (anyarray, anyarray),
187+
OPERATOR 3 <@ (anyarray, anyarray),
188+
OPERATOR 4 = (anyarray, anyarray),
189+
--dispatch function 1 for concrete type
190+
FUNCTION 2 ginarrayextract(anyarray,internal,internal),
191+
FUNCTION 3 ginqueryarrayextract(anyarray,internal,smallint,internal,internal,internal,internal),
192+
FUNCTION 4 ginarrayconsistent(internal,smallint,anyarray,integer,internal,internal,internal,internal),
193+
STORAGE anyelement;
194+
106195
EOT
107196

108197
foreach my $t (@opinfo)

rum--1.1--1.2.sql

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22
* RUM version 1.2
33
*/
44

5+
/*--------------------tsvector-----------------------*/
6+
57
DROP OPERATOR CLASS rum_tsvector_ops USING rum;
68
DROP OPERATOR CLASS rum_tsvector_hash_ops USING rum;
79

@@ -41,6 +43,93 @@ AS
4143
FUNCTION 10 rum_ts_join_pos(internal, internal),
4244
STORAGE integer;
4345

46+
/*--------------------anyarray-----------------------*/
47+
48+
CREATE FUNCTION rum_anyarray_config(internal)
49+
RETURNS void
50+
AS 'MODULE_PATHNAME'
51+
LANGUAGE C IMMUTABLE STRICT;
52+
53+
54+
CREATE OR REPLACE FUNCTION rum_anyarray_similar(anyarray,anyarray)
55+
RETURNS bool
56+
AS 'MODULE_PATHNAME'
57+
LANGUAGE C STRICT STABLE;
58+
59+
CREATE OPERATOR % (
60+
PROCEDURE = rum_anyarray_similar,
61+
LEFTARG = anyarray,
62+
RIGHTARG = anyarray,
63+
COMMUTATOR = '%',
64+
RESTRICT = contsel,
65+
JOIN = contjoinsel
66+
);
67+
68+
69+
CREATE OR REPLACE FUNCTION rum_anyarray_distance(anyarray,anyarray)
70+
RETURNS float8
71+
AS 'MODULE_PATHNAME'
72+
LANGUAGE C STRICT STABLE;
73+
74+
CREATE OPERATOR <=> (
75+
PROCEDURE = rum_anyarray_distance,
76+
LEFTARG = anyarray,
77+
RIGHTARG = anyarray,
78+
COMMUTATOR = '<=>'
79+
);
80+
81+
82+
CREATE FUNCTION rum_extract_anyarray(anyarray,internal,internal,internal,internal)
83+
RETURNS internal
84+
AS 'MODULE_PATHNAME'
85+
LANGUAGE C IMMUTABLE STRICT;
86+
87+
CREATE FUNCTION rum_extract_anyarray_query(anyarray,internal,smallint,internal,internal,internal,internal)
88+
RETURNS internal
89+
AS 'MODULE_PATHNAME'
90+
LANGUAGE C IMMUTABLE STRICT;
91+
92+
CREATE FUNCTION rum_anyarray_consistent(internal, smallint, anyarray, integer, internal, internal, internal, internal)
93+
RETURNS bool
94+
AS 'MODULE_PATHNAME'
95+
LANGUAGE C IMMUTABLE STRICT;
96+
97+
CREATE FUNCTION rum_anyarray_ordering(internal,smallint,tsvector,int,internal,internal,internal,internal,internal)
98+
RETURNS float8
99+
AS 'MODULE_PATHNAME'
100+
LANGUAGE C IMMUTABLE STRICT;
101+
102+
103+
CREATE OPERATOR CLASS rum_anyarray_ops
104+
DEFAULT FOR TYPE anyarray USING rum
105+
AS
106+
OPERATOR 1 && (anyarray, anyarray),
107+
OPERATOR 2 @> (anyarray, anyarray),
108+
OPERATOR 3 <@ (anyarray, anyarray),
109+
OPERATOR 4 = (anyarray, anyarray),
110+
OPERATOR 5 % (anyarray, anyarray),
111+
OPERATOR 20 <=> (anyarray, anyarray) FOR ORDER BY pg_catalog.float_ops,
112+
--dispatch function 1 for concrete type
113+
FUNCTION 2 rum_extract_anyarray(anyarray,internal,internal,internal,internal),
114+
FUNCTION 3 rum_extract_anyarray_query(anyarray,internal,smallint,internal,internal,internal,internal),
115+
FUNCTION 4 rum_anyarray_consistent(internal,smallint,anyarray,integer,internal,internal,internal,internal),
116+
FUNCTION 6 rum_anyarray_config(internal),
117+
FUNCTION 8 rum_anyarray_ordering(internal,smallint,tsvector,int,internal,internal,internal,internal,internal),
118+
STORAGE anyelement;
119+
120+
CREATE OPERATOR CLASS rum_anyarray_addon_ops
121+
FOR TYPE anyarray USING rum
122+
AS
123+
OPERATOR 1 && (anyarray, anyarray),
124+
OPERATOR 2 @> (anyarray, anyarray),
125+
OPERATOR 3 <@ (anyarray, anyarray),
126+
OPERATOR 4 = (anyarray, anyarray),
127+
--dispatch function 1 for concrete type
128+
FUNCTION 2 ginarrayextract(anyarray,internal,internal),
129+
FUNCTION 3 ginqueryarrayextract(anyarray,internal,smallint,internal,internal,internal,internal),
130+
FUNCTION 4 ginarrayconsistent(internal,smallint,anyarray,integer,internal,internal,internal,internal),
131+
STORAGE anyelement;
132+
44133
/*--------------------int2-----------------------*/
45134

46135
CREATE FUNCTION rum_int2_key_distance(internal,smallint,int2,smallint,tsvector,int,internal,internal,internal,internal,internal,internal)

0 commit comments

Comments
 (0)