]> granicus.if.org Git - postgresql/blob - contrib/intarray/_int.sql.in
Restructure pg_opclass, pg_amop, and pg_amproc per previous discussions in
[postgresql] / contrib / intarray / _int.sql.in
1 -- Create the user-defined type for the 1-D integer arrays (_int4)
2 -- 
3 BEGIN TRANSACTION;
4
5 --
6 -- External C-functions for R-tree methods
7 --
8
9 -- Comparison methods
10
11 CREATE FUNCTION _int_contains(_int4, _int4) RETURNS bool
12         AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
13
14 COMMENT ON FUNCTION _int_contains(_int4, _int4) IS 'contains';
15
16 CREATE FUNCTION _int_contained(_int4, _int4) RETURNS bool
17         AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
18
19 COMMENT ON FUNCTION _int_contained(_int4, _int4) IS 'contained in';
20
21 CREATE FUNCTION _int_overlap(_int4, _int4) RETURNS bool
22         AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
23
24 COMMENT ON FUNCTION _int_overlap(_int4, _int4) IS 'overlaps';
25
26 CREATE FUNCTION _int_same(_int4, _int4) RETURNS bool
27         AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
28
29 COMMENT ON FUNCTION _int_same(_int4, _int4) IS 'same as';
30
31 CREATE FUNCTION _int_different(_int4, _int4) RETURNS bool
32         AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
33
34 COMMENT ON FUNCTION _int_different(_int4, _int4) IS 'different';
35
36 -- support routines for indexing
37
38 CREATE FUNCTION _int_union(_int4, _int4) RETURNS _int4
39         AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
40
41 CREATE FUNCTION _int_inter(_int4, _int4) RETURNS _int4
42         AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
43
44 --
45 -- OPERATORS
46 --
47
48 CREATE OPERATOR && (
49    LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_overlap,
50    COMMUTATOR = '&&',
51    RESTRICT = contsel, JOIN = contjoinsel
52 );
53
54 --CREATE OPERATOR = (
55 --   LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_same,
56 --   COMMUTATOR = '=', NEGATOR = '<>',
57 --   RESTRICT = eqsel, JOIN = eqjoinsel,
58 --   SORT1 = '<', SORT2 = '<'
59 --);
60
61 CREATE OPERATOR <> (
62    LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_different,
63    COMMUTATOR = '<>', NEGATOR = '=',
64    RESTRICT = neqsel, JOIN = neqjoinsel
65 );
66
67 CREATE OPERATOR @ (
68    LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_contains,
69    COMMUTATOR = '~', RESTRICT = contsel, JOIN = contjoinsel
70 );
71
72 CREATE OPERATOR ~ (
73    LEFTARG = _int4, RIGHTARG = _int4, PROCEDURE = _int_contained,
74    COMMUTATOR = '@', RESTRICT = contsel, JOIN = contjoinsel
75 );
76
77
78 -- define the GiST support methods
79 CREATE FUNCTION g_int_consistent(opaque,_int4,int4) RETURNS bool
80         AS 'MODULE_PATHNAME' LANGUAGE 'c';
81
82 CREATE FUNCTION g_int_compress(opaque) RETURNS opaque 
83         AS 'MODULE_PATHNAME' LANGUAGE 'c';
84
85 CREATE FUNCTION g_int_decompress(opaque) RETURNS opaque 
86         AS 'MODULE_PATHNAME' LANGUAGE 'c';
87
88 CREATE FUNCTION g_int_penalty(opaque,opaque,opaque) RETURNS opaque
89         AS 'MODULE_PATHNAME' LANGUAGE 'c';
90
91 CREATE FUNCTION g_int_picksplit(opaque, opaque) RETURNS opaque
92         AS 'MODULE_PATHNAME' LANGUAGE 'c';
93
94 CREATE FUNCTION g_int_union(bytea, opaque) RETURNS _int4 
95         AS 'MODULE_PATHNAME' LANGUAGE 'c';
96
97 CREATE FUNCTION g_int_same(_int4, _int4, opaque) RETURNS opaque 
98         AS 'MODULE_PATHNAME' LANGUAGE 'c';
99
100
101 -- register the default opclass for indexing
102 INSERT INTO pg_opclass (opcamid, opcname, opcintype, opcdefault, opckeytype)
103     VALUES (
104         (SELECT oid FROM pg_am WHERE amname = 'gist'),
105         'gist__int_ops',
106         (SELECT oid FROM pg_type WHERE typname = '_int4'),
107         true,
108         (SELECT oid FROM pg_type WHERE typname = '_int4'));
109
110
111 -- get the comparators for _intments and store them in a tmp table
112 SELECT o.oid AS opoid, o.oprname
113 INTO TEMP TABLE _int_ops_tmp
114 FROM pg_operator o, pg_type t
115 WHERE o.oprleft = t.oid and o.oprright = t.oid
116    and t.typname = '_int4';
117
118 -- make sure we have the right operators
119 -- SELECT * from _int_ops_tmp;
120
121 -- using the tmp table, generate the amop entries 
122 -- note: these operators are all lossy
123
124 -- _int_overlap
125 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
126    SELECT opcl.oid, 3, true, c.opoid
127    FROM pg_opclass opcl, _int_ops_tmp c
128    WHERE
129       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
130       and opcname = 'gist__int_ops' 
131       and c.oprname = '&&';
132
133 -- _int_same
134 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
135    SELECT opcl.oid, 6, true, c.opoid
136    FROM pg_opclass opcl, _int_ops_tmp c
137    WHERE
138       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
139       and opcname = 'gist__int_ops' 
140       and c.oprname = '=';
141
142 -- _int_contains
143 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
144    SELECT opcl.oid, 7, true, c.opoid
145    FROM pg_opclass opcl, _int_ops_tmp c
146    WHERE
147       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
148       and opcname = 'gist__int_ops' 
149       and c.oprname = '@';
150
151 -- _int_contained
152 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
153    SELECT opcl.oid, 8, true, c.opoid
154    FROM pg_opclass opcl, _int_ops_tmp c
155    WHERE
156       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
157       and opcname = 'gist__int_ops' 
158       and c.oprname = '~';
159
160 DROP TABLE _int_ops_tmp;
161
162
163 -- add the entries to amproc for the support methods
164 -- note the amprocnum numbers associated with each are specific!
165
166 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
167    SELECT opcl.oid, 1, pro.oid
168    FROM pg_opclass opcl, pg_proc pro
169    WHERE
170       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
171       and opcname = 'gist__int_ops'
172       and proname = 'g_int_consistent';
173
174 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
175    SELECT opcl.oid, 2, pro.oid
176    FROM pg_opclass opcl, pg_proc pro
177    WHERE
178       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
179       and opcname = 'gist__int_ops'
180       and proname = 'g_int_union';
181
182 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
183    SELECT opcl.oid, 3, pro.oid
184    FROM pg_opclass opcl, pg_proc pro
185    WHERE
186       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
187       and opcname = 'gist__int_ops'
188       and proname = 'g_int_compress';
189
190 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
191    SELECT opcl.oid, 4, pro.oid
192    FROM pg_opclass opcl, pg_proc pro
193    WHERE
194       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
195       and opcname = 'gist__int_ops'
196       and proname = 'g_int_decompress';
197
198 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
199    SELECT opcl.oid, 5, pro.oid
200    FROM pg_opclass opcl, pg_proc pro
201    WHERE
202       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
203       and opcname = 'gist__int_ops'
204       and proname = 'g_int_penalty';
205
206 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
207    SELECT opcl.oid, 6, pro.oid
208    FROM pg_opclass opcl, pg_proc pro
209    WHERE
210       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
211       and opcname = 'gist__int_ops'
212       and proname = 'g_int_picksplit';
213
214 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
215    SELECT opcl.oid, 7, pro.oid
216    FROM pg_opclass opcl, pg_proc pro
217    WHERE
218       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
219       and opcname = 'gist__int_ops'
220       and proname = 'g_int_same';
221
222
223 ---------------------------------------------
224 -- intbig
225 ---------------------------------------------
226 -- define the GiST support methods
227 CREATE FUNCTION g_intbig_consistent(opaque,_int4,int4) RETURNS bool
228         AS 'MODULE_PATHNAME' LANGUAGE 'c';
229
230 CREATE FUNCTION g_intbig_compress(opaque) RETURNS opaque 
231         AS 'MODULE_PATHNAME' LANGUAGE 'c';
232
233 CREATE FUNCTION g_intbig_decompress(opaque) RETURNS opaque 
234         AS 'MODULE_PATHNAME' LANGUAGE 'c';
235
236 CREATE FUNCTION g_intbig_penalty(opaque,opaque,opaque) RETURNS opaque
237         AS 'MODULE_PATHNAME' LANGUAGE 'c' with (isstrict);
238
239 CREATE FUNCTION g_intbig_picksplit(opaque, opaque) RETURNS opaque
240         AS 'MODULE_PATHNAME' LANGUAGE 'c';
241
242 CREATE FUNCTION g_intbig_union(bytea, opaque) RETURNS _int4 
243         AS 'MODULE_PATHNAME' LANGUAGE 'c';
244
245 CREATE FUNCTION g_intbig_same(_int4, _int4, opaque) RETURNS opaque 
246         AS 'MODULE_PATHNAME' LANGUAGE 'c';
247
248 -- register the opclass for indexing (not as default)
249 INSERT INTO pg_opclass (opcamid, opcname, opcintype, opcdefault, opckeytype)
250     VALUES (
251         (SELECT oid FROM pg_am WHERE amname = 'gist'),
252         'gist__intbig_ops',
253         (SELECT oid FROM pg_type WHERE typname = '_int4'),
254         false,
255         (SELECT oid FROM pg_type WHERE typname = '_int4'));
256
257
258 -- get the comparators for _intments and store them in a tmp table
259 SELECT o.oid AS opoid, o.oprname
260 INTO TEMP TABLE _int_ops_tmp
261 FROM pg_operator o, pg_type t
262 WHERE o.oprleft = t.oid and o.oprright = t.oid
263    and t.typname = '_int4';
264
265 -- make sure we have the right operators
266 -- SELECT * from _int_ops_tmp;
267
268 -- using the tmp table, generate the amop entries 
269 -- note: these operators are all lossy
270
271 -- _int_overlap
272 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
273    SELECT opcl.oid, 3, true, c.opoid
274    FROM pg_opclass opcl, _int_ops_tmp c
275    WHERE
276       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
277       and opcname = 'gist__intbig_ops' 
278       and c.oprname = '&&';
279
280 -- _int_contains
281 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
282    SELECT opcl.oid, 7, true, c.opoid
283    FROM pg_opclass opcl, _int_ops_tmp c
284    WHERE
285       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
286       and opcname = 'gist__intbig_ops' 
287       and c.oprname = '@';
288
289 -- _int_contained
290 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
291    SELECT opcl.oid, 8, true, c.opoid
292    FROM pg_opclass opcl, _int_ops_tmp c
293    WHERE
294       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
295       and opcname = 'gist__intbig_ops' 
296       and c.oprname = '~';
297
298 DROP TABLE _int_ops_tmp;
299
300
301 -- add the entries to amproc for the support methods
302 -- note the amprocnum numbers associated with each are specific!
303
304 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
305    SELECT opcl.oid, 1, pro.oid
306    FROM pg_opclass opcl, pg_proc pro
307    WHERE
308       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
309       and opcname = 'gist__intbig_ops'
310       and proname = 'g_intbig_consistent';
311
312 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
313    SELECT opcl.oid, 2, pro.oid
314    FROM pg_opclass opcl, pg_proc pro
315    WHERE
316       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
317       and opcname = 'gist__intbig_ops'
318       and proname = 'g_intbig_union';
319
320 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
321    SELECT opcl.oid, 3, pro.oid
322    FROM pg_opclass opcl, pg_proc pro
323    WHERE
324       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
325       and opcname = 'gist__intbig_ops'
326       and proname = 'g_intbig_compress';
327
328 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
329    SELECT opcl.oid, 4, pro.oid
330    FROM pg_opclass opcl, pg_proc pro
331    WHERE
332       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
333       and opcname = 'gist__intbig_ops'
334       and proname = 'g_intbig_decompress';
335
336 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
337    SELECT opcl.oid, 5, pro.oid
338    FROM pg_opclass opcl, pg_proc pro
339    WHERE
340       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
341       and opcname = 'gist__intbig_ops'
342       and proname = 'g_intbig_penalty';
343
344 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
345    SELECT opcl.oid, 6, pro.oid
346    FROM pg_opclass opcl, pg_proc pro
347    WHERE
348       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
349       and opcname = 'gist__intbig_ops'
350       and proname = 'g_intbig_picksplit';
351
352 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
353    SELECT opcl.oid, 7, pro.oid
354    FROM pg_opclass opcl, pg_proc pro
355    WHERE
356       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
357       and opcname = 'gist__intbig_ops'
358       and proname = 'g_intbig_same';
359
360 END TRANSACTION;