Skip to content

Commit 2f067cd

Browse files
committed
implement dummy opclass for anyarray, fix dispatch of function 1
1 parent 089a1bb commit 2f067cd

8 files changed

+213
-2624
lines changed

.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,3 +11,4 @@ bin
1111
include
1212
lib
1313
pip-selfcheck.json
14+
rum--*.sql

Makefile

Lines changed: 9 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,9 @@ OBJS = src/rumsort.o src/rum_ts_utils.o src/rumtsquery.o \
88
src/btree_rum.o $(WIN32RES)
99

1010
EXTENSION = rum
11-
DATA = rum--1.0.sql rum--1.0--1.1.sql rum--1.1.sql
11+
EXTVERSION = 1.2
12+
DATA = rum--1.0.sql
13+
DATA_built = rum--$(EXTVERSION).sql rum--1.0--1.1.sql rum--1.1--1.2.sql
1214
PGFILEDESC = "RUM index access method"
1315
INCLUDES = src/rum.h src/rumsort.h
1416

@@ -35,15 +37,18 @@ endif
3537
wal-check: temp-install
3638
$(prove_check)
3739

38-
all: rum--1.1.sql
40+
all: rum--$(EXTVERSION).sql
3941

4042
#9.6 requires 1.1 file but 10.0 could live with 1.0 + 1.0-1.1 files
41-
rum--1.1.sql: rum--1.0.sql rum--1.0--1.1.sql
42-
cat rum--1.0.sql rum--1.0--1.1.sql > rum--1.1.sql
43+
rum--$(EXTVERSION).sql: rum--1.0.sql rum--1.0--1.1.sql rum--1.1--1.2.sql
44+
cat rum--1.0.sql rum--1.0--1.1.sql rum--1.1--1.2.sql > rum--$(EXTVERSION).sql
4345

4446
rum--1.0--1.1.sql: Makefile gen_rum_sql--1.0--1.1.pl
4547
perl gen_rum_sql--1.0--1.1.pl > rum--1.0--1.1.sql
4648

49+
rum--1.1--1.2.sql: Makefile gen_rum_sql--1.1--1.2.pl
50+
perl gen_rum_sql--1.1--1.2.pl > rum--1.1--1.2.sql
51+
4752
install: installincludes
4853

4954
installincludes:

gen_rum_sql--1.1--1.2.pl

Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
use strict;
2+
use warnings;
3+
4+
my $func_base_template=<<EOT;
5+
CREATE FUNCTION rum_TYPEIDENT_extract_value(TYPENAME, internal)
6+
RETURNS internal
7+
AS 'MODULE_PATHNAME'
8+
LANGUAGE C STRICT IMMUTABLE;
9+
10+
CREATE FUNCTION rum_TYPEIDENT_compare_prefix(TYPENAME, TYPENAME, int2, internal)
11+
RETURNS int4
12+
AS 'MODULE_PATHNAME'
13+
LANGUAGE C STRICT IMMUTABLE;
14+
15+
CREATE FUNCTION rum_TYPEIDENT_extract_query(TYPENAME, internal, int2, internal, internal)
16+
RETURNS internal
17+
AS 'MODULE_PATHNAME'
18+
LANGUAGE C STRICT IMMUTABLE;
19+
20+
EOT
21+
22+
my $func_distance_template=<<EOT;
23+
$func_base_template
24+
25+
CREATE FUNCTION rum_TYPEIDENT_distance(TYPENAME, TYPENAME)
26+
RETURNS float8
27+
AS 'MODULE_PATHNAME'
28+
LANGUAGE C IMMUTABLE STRICT;
29+
30+
CREATE OPERATOR <=> (
31+
PROCEDURE = rum_TYPEIDENT_distance,
32+
LEFTARG = TYPENAME,
33+
RIGHTARG = TYPENAME,
34+
COMMUTATOR = <=>
35+
);
36+
37+
CREATE FUNCTION rum_TYPEIDENT_left_distance(TYPENAME, TYPENAME)
38+
RETURNS float8
39+
AS 'MODULE_PATHNAME'
40+
LANGUAGE C IMMUTABLE STRICT;
41+
42+
CREATE OPERATOR <=| (
43+
PROCEDURE = rum_TYPEIDENT_left_distance,
44+
LEFTARG = TYPENAME,
45+
RIGHTARG = TYPENAME,
46+
COMMUTATOR = |=>
47+
);
48+
49+
CREATE FUNCTION rum_TYPEIDENT_right_distance(TYPENAME, TYPENAME)
50+
RETURNS float8
51+
AS 'MODULE_PATHNAME'
52+
LANGUAGE C IMMUTABLE STRICT;
53+
54+
CREATE OPERATOR |=> (
55+
PROCEDURE = rum_TYPEIDENT_right_distance,
56+
LEFTARG = TYPENAME,
57+
RIGHTARG = TYPENAME,
58+
COMMUTATOR = <=|
59+
);
60+
61+
CREATE FUNCTION rum_TYPEIDENT_outer_distance(TYPENAME, TYPENAME, smallint)
62+
RETURNS float8
63+
AS 'MODULE_PATHNAME'
64+
LANGUAGE C STRICT IMMUTABLE;
65+
66+
CREATE FUNCTION rum_TYPEIDENT_config(internal)
67+
RETURNS void
68+
AS 'MODULE_PATHNAME'
69+
LANGUAGE C IMMUTABLE STRICT;
70+
71+
72+
EOT
73+
74+
my $opclass_base_template=<<EOT;
75+
76+
CREATE OPERATOR CLASS rum_TYPEIDENT_ops
77+
DEFAULT FOR TYPE TYPENAME USING rum
78+
AS
79+
OPERATOR 1 < TYPESOPARG,
80+
OPERATOR 2 <= TYPESOPARG,
81+
OPERATOR 3 = TYPESOPARG,
82+
OPERATOR 4 >= TYPESOPARG,
83+
OPERATOR 5 > TYPESOPARG,
84+
FUNCTION 1 TYPECMPFUNC(TYPECMPTYPE,TYPECMPTYPE),
85+
FUNCTION 2 rum_TYPESUBIDENT_extract_value(TYPESUBNAME, internal),
86+
FUNCTION 3 rum_TYPESUBIDENT_extract_query(TYPESUBNAME, internal, int2, internal, internal),
87+
FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal),
88+
FUNCTION 5 rum_TYPESUBIDENT_compare_prefix(TYPESUBNAME,TYPESUBNAME,int2, internal),
89+
STORAGE TYPENAME;
90+
91+
EOT
92+
93+
my $opclass_distance_template=<<EOT;
94+
95+
CREATE OPERATOR CLASS rum_TYPEIDENT_ops
96+
DEFAULT FOR TYPE TYPENAME USING rum
97+
AS
98+
OPERATOR 1 < TYPESOPARG,
99+
OPERATOR 2 <= TYPESOPARG,
100+
OPERATOR 3 = TYPESOPARG,
101+
OPERATOR 4 >= TYPESOPARG,
102+
OPERATOR 5 > TYPESOPARG,
103+
OPERATOR 20 <=> (TYPENAME,TYPENAME) FOR ORDER BY pg_catalog.float_ops,
104+
OPERATOR 21 <=| (TYPENAME,TYPENAME) FOR ORDER BY pg_catalog.float_ops,
105+
OPERATOR 22 |=> (TYPENAME,TYPENAME) FOR ORDER BY pg_catalog.float_ops,
106+
FUNCTION 1 TYPECMPFUNC(TYPECMPTYPE,TYPECMPTYPE),
107+
FUNCTION 2 rum_TYPESUBIDENT_extract_value(TYPESUBNAME, internal),
108+
FUNCTION 3 rum_TYPESUBIDENT_extract_query(TYPESUBNAME, internal, int2, internal, internal),
109+
FUNCTION 4 rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal),
110+
FUNCTION 5 rum_TYPESUBIDENT_compare_prefix(TYPESUBNAME,TYPESUBNAME,int2, internal),
111+
-- support to TYPEIDENT distance in rum_tsvector_addon_ops
112+
FUNCTION 6 rum_TYPEIDENT_config(internal),
113+
FUNCTION 9 rum_TYPEIDENT_outer_distance(TYPENAME, TYPENAME, smallint),
114+
STORAGE TYPENAME;
115+
116+
EOT
117+
118+
my @opinfo = map {
119+
$_->{TYPEIDENT} = $_->{TYPENAME} if ! exists $_->{TYPEIDENT};
120+
$_->{TYPECMPTYPE} = $_->{TYPENAME} if !exists $_->{TYPECMPTYPE};
121+
$_->{TYPESUBNAME} = $_->{TYPENAME} if !exists $_->{TYPESUBNAME};
122+
$_->{TYPESUBIDENT}= $_->{TYPEIDENT} if ! exists $_->{TYPESUBIDENT};
123+
$_->{TYPESOPARG}= '' if ! exists $_->{TYPESOPARG};
124+
$_
125+
} (
126+
# timestamp/tz aren't here: they are in rum--1.0.sql
127+
);
128+
129+
##############Generate!!!
130+
131+
print <<EOT;
132+
CREATE OPERATOR CLASS rum_anyarray_ops
133+
DEFAULT FOR TYPE anyarray USING rum
134+
AS
135+
OPERATOR 1 && (anyarray, anyarray),
136+
OPERATOR 2 @> (anyarray, anyarray),
137+
OPERATOR 3 <@ (anyarray, anyarray),
138+
OPERATOR 4 = (anyarray, anyarray),
139+
--dispatch function 1 for concrete type
140+
FUNCTION 2 ginarrayextract(anyarray,internal,internal),
141+
FUNCTION 3 ginqueryarrayextract(anyarray,internal,smallint,internal,internal,internal,internal),
142+
FUNCTION 4 ginarrayconsistent(internal,smallint,anyarray,integer,internal,internal,internal,internal),
143+
STORAGE anyelement;
144+
145+
EOT
146+
147+
foreach my $t (@opinfo)
148+
{
149+
print "/*--------------------$t->{TYPENAME}-----------------------*/\n\n";
150+
151+
for my $v (qw(func_tmpl opclass_tmpl))
152+
{
153+
next if !exists $t->{$v};
154+
155+
my $x = ${$t->{$v}};
156+
157+
for my $k (grep {uc($_) eq $_} keys %$t)
158+
{
159+
$x=~s/$k/$t->{$k}/g;
160+
}
161+
162+
print $x;
163+
}
164+
}
165+
166+
# Drop doesn't work
167+
#print <<EOT;
168+
#ALTER OPERATOR FAMILY rum_timestamp_ops USING rum DROP FUNCTION 4
169+
# (timestamp, timestamp); -- strange definition
170+
#ALTER OPERATOR FAMILY rum_timestamp_ops USING rum ADD FUNCTION 4
171+
# rum_btree_consistent(internal,smallint,internal,int,internal,internal,internal,internal);
172+
#EOT

0 commit comments

Comments
 (0)