]> granicus.if.org Git - postgresql/blob - contrib/rtree_gist/rtree_gist.sql.in
Restructure pg_opclass, pg_amop, and pg_amproc per previous discussions in
[postgresql] / contrib / rtree_gist / rtree_gist.sql.in
1 begin transaction;
2 --
3 --
4 --
5 -- BOX ops
6 --
7 --
8 --
9 -- define the GiST support methods
10 create function gbox_consistent(opaque,box,int4) returns bool as 'MODULE_PATHNAME' language 'C';
11
12 create function gbox_compress(opaque) returns opaque as 'MODULE_PATHNAME' language 'C';
13
14 create function rtree_decompress(opaque) returns opaque as 'MODULE_PATHNAME' language 'C';
15
16 create function gbox_penalty(opaque,opaque,opaque) returns opaque as 'MODULE_PATHNAME' language 'C' with (isstrict);
17
18 create function gbox_picksplit(opaque, opaque) returns opaque as 'MODULE_PATHNAME' language 'C';
19
20 create function gbox_union(bytea, opaque) returns box as 'MODULE_PATHNAME' language 'C';
21
22 create function gbox_same(box, box, opaque) returns opaque as 'MODULE_PATHNAME' language 'C';
23
24 -- add a new opclass (non-default)
25 INSERT INTO pg_opclass (opcamid, opcname, opcintype, opcdefault, opckeytype)
26     VALUES (
27         (SELECT oid FROM pg_am WHERE amname = 'gist'),
28         'gist_box_ops',
29         (SELECT oid FROM pg_type WHERE typname = 'box'),
30         false,
31         0);
32
33 -- get the comparators for boxes and store them in a tmp table
34 SELECT o.oid AS opoid, o.oprname
35 INTO TEMP TABLE rt_ops_tmp
36 FROM pg_operator o, pg_type t
37 WHERE o.oprleft = t.oid 
38    and t.typname = 'box';
39
40 -- using the tmp table, generate the amop entries 
41 -- box_left
42 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr) 
43    SELECT opcl.oid, 1, false, c.opoid
44    FROM pg_opclass opcl, rt_ops_tmp c
45    WHERE
46       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
47       and opcname = 'gist_box_ops' 
48       and c.oprname = '<<';
49
50 -- box_overleft
51 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr) 
52    SELECT opcl.oid, 2, false, c.opoid
53    FROM pg_opclass opcl, rt_ops_tmp c
54    WHERE
55       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
56       and opcname = 'gist_box_ops' 
57       and c.oprname = '&<';
58
59 -- box_overlap
60 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr) 
61    SELECT opcl.oid, 3, false, c.opoid
62    FROM pg_opclass opcl, rt_ops_tmp c
63    WHERE
64       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
65       and opcname = 'gist_box_ops' 
66       and c.oprname = '&&';
67
68 -- box_overright
69 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr) 
70    SELECT opcl.oid, 4, false, c.opoid
71    FROM pg_opclass opcl, rt_ops_tmp c
72    WHERE
73       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
74       and opcname = 'gist_box_ops' 
75       and c.oprname = '&>';
76
77 -- box_right
78 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
79    SELECT opcl.oid, 5, false, c.opoid
80    FROM pg_opclass opcl, rt_ops_tmp c
81    WHERE
82       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
83       and opcname = 'gist_box_ops' 
84       and c.oprname = '>>';
85
86 -- box_same
87 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr) 
88    SELECT opcl.oid, 6, false, c.opoid
89    FROM pg_opclass opcl, rt_ops_tmp c
90    WHERE
91       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
92       and opcname = 'gist_box_ops' 
93       and c.oprname = '~=';
94
95 -- box_contains
96 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
97    SELECT opcl.oid, 7, false, c.opoid
98    FROM pg_opclass opcl, rt_ops_tmp c
99    WHERE
100       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
101       and opcname = 'gist_box_ops' 
102       and c.oprname = '~';
103
104 -- box_contained
105 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
106    SELECT opcl.oid, 8, false, c.opoid
107    FROM pg_opclass opcl, rt_ops_tmp c
108    WHERE
109       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
110       and opcname = 'gist_box_ops' 
111       and c.oprname = '@';
112
113 DROP table rt_ops_tmp;
114
115 -- add the entries to amproc for the support methods
116 -- note the amprocnum numbers associated with each are specific!
117
118 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
119    SELECT opcl.oid, 1, pro.oid
120    FROM pg_opclass opcl, pg_proc pro
121    WHERE
122       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
123       and opcname = 'gist_box_ops'
124       and proname = 'gbox_consistent';
125
126 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
127    SELECT opcl.oid, 2, pro.oid
128    FROM pg_opclass opcl, pg_proc pro
129    WHERE
130       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
131       and opcname = 'gist_box_ops'
132       and proname = 'gbox_union';
133
134 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
135    SELECT opcl.oid, 3, pro.oid
136    FROM pg_opclass opcl, pg_proc pro
137    WHERE
138       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
139       and opcname = 'gist_box_ops'
140       and proname = 'gbox_compress';
141
142 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
143    SELECT opcl.oid, 4, pro.oid
144    FROM pg_opclass opcl, pg_proc pro
145    WHERE
146       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
147       and opcname = 'gist_box_ops'
148       and proname = 'rtree_decompress';
149
150 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
151    SELECT opcl.oid, 5, pro.oid
152    FROM pg_opclass opcl, pg_proc pro
153    WHERE
154       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
155       and opcname = 'gist_box_ops'
156       and proname = 'gbox_penalty';
157
158 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
159    SELECT opcl.oid, 6, pro.oid
160    FROM pg_opclass opcl, pg_proc pro
161    WHERE
162       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
163       and opcname = 'gist_box_ops'
164       and proname = 'gbox_picksplit';
165
166 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
167    SELECT opcl.oid, 7, 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_box_ops'
172       and proname = 'gbox_same';
173
174 --
175 --
176 --
177 -- POLYGON ops
178 --
179 --
180 --
181 -- define the GiST support methods
182 create function gpoly_consistent(opaque,polygon,int4) returns bool as 'MODULE_PATHNAME' language 'C';
183
184 create function gpoly_compress(opaque) returns opaque as 'MODULE_PATHNAME' language 'C';
185
186 create function gpoly_penalty(opaque,opaque,opaque) returns opaque as 'MODULE_PATHNAME' language 'C';
187
188 create function gpoly_picksplit(opaque, opaque) returns opaque as 'MODULE_PATHNAME' language 'C';
189
190 create function gpoly_union(bytea, opaque) returns opaque as 'MODULE_PATHNAME' language 'C';
191
192 create function gpoly_same(opaque, opaque, opaque) returns opaque as 'MODULE_PATHNAME' language 'C';
193
194 -- add a new opclass (non-default)
195 INSERT INTO pg_opclass (opcamid, opcname, opcintype, opcdefault, opckeytype)
196     VALUES (
197         (SELECT oid FROM pg_am WHERE amname = 'gist'),
198         'gist_poly_ops',
199         (SELECT oid FROM pg_type WHERE typname = 'polygon'),
200         false,
201         0);
202
203 -- get the comparators for polygons and store them in a tmp table
204 -- hack for 757 (poly_contain_pt) Teodor
205 SELECT o.oid AS opoid, o.oprname
206 INTO TEMP TABLE rt_ops_tmp
207 FROM pg_operator o, pg_type t
208 WHERE o.oprleft = t.oid and o.oid <> 757
209    and t.typname = 'polygon';
210
211 -- using the tmp table, generate the amop entries 
212 -- poly_left
213 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr) 
214    SELECT opcl.oid, 1, false, c.opoid
215    FROM pg_opclass opcl, rt_ops_tmp c
216    WHERE
217       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
218       and opcname = 'gist_poly_ops' 
219       and c.oprname = '<<';
220
221 -- poly_overleft
222 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr) 
223    SELECT opcl.oid, 2, false, c.opoid
224    FROM pg_opclass opcl, rt_ops_tmp c
225    WHERE
226       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
227       and opcname = 'gist_poly_ops' 
228       and c.oprname = '&<';
229
230 -- poly_overlap
231 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr) 
232    SELECT opcl.oid, 3, false, c.opoid
233    FROM pg_opclass opcl, rt_ops_tmp c
234    WHERE
235       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
236       and opcname = 'gist_poly_ops' 
237       and c.oprname = '&&';
238
239 -- poly_overright
240 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr) 
241    SELECT opcl.oid, 4, false, c.opoid
242    FROM pg_opclass opcl, rt_ops_tmp c
243    WHERE
244       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
245       and opcname = 'gist_poly_ops' 
246       and c.oprname = '&>';
247
248 -- poly_right
249 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
250    SELECT opcl.oid, 5, false, c.opoid
251    FROM pg_opclass opcl, rt_ops_tmp c
252    WHERE
253       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
254       and opcname = 'gist_poly_ops' 
255       and c.oprname = '>>';
256
257 -- poly_same
258 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr) 
259    SELECT opcl.oid, 6, false, c.opoid
260    FROM pg_opclass opcl, rt_ops_tmp c
261    WHERE
262       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
263       and opcname = 'gist_poly_ops' 
264       and c.oprname = '~=';
265
266 -- poly_contains
267 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
268    SELECT opcl.oid, 7, false, c.opoid
269    FROM pg_opclass opcl, rt_ops_tmp c
270    WHERE
271       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
272       and opcname = 'gist_poly_ops' 
273       and c.oprname = '~';
274
275 -- poly_contained
276 INSERT INTO pg_amop (amopclaid, amopstrategy, amopreqcheck, amopopr)
277    SELECT opcl.oid, 8, false, c.opoid
278    FROM pg_opclass opcl, rt_ops_tmp c
279    WHERE
280       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
281       and opcname = 'gist_poly_ops' 
282       and c.oprname = '@';
283
284 DROP table rt_ops_tmp;
285
286 -- add the entries to amproc for the support methods
287 -- note the amprocnum numbers associated with each are specific!
288
289 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
290    SELECT opcl.oid, 1, pro.oid
291    FROM pg_opclass opcl, pg_proc pro
292    WHERE
293       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
294       and opcname = 'gist_poly_ops'
295       and proname = 'gpoly_consistent';
296
297 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
298    SELECT opcl.oid, 2, pro.oid
299    FROM pg_opclass opcl, pg_proc pro
300    WHERE
301       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
302       and opcname = 'gist_poly_ops'
303       and proname = 'gpoly_union';
304
305 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
306    SELECT opcl.oid, 3, pro.oid
307    FROM pg_opclass opcl, pg_proc pro
308    WHERE
309       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
310       and opcname = 'gist_poly_ops'
311       and proname = 'gpoly_compress';
312
313 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
314    SELECT opcl.oid, 4, pro.oid
315    FROM pg_opclass opcl, pg_proc pro
316    WHERE
317       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
318       and opcname = 'gist_poly_ops'
319       and proname = 'rtree_decompress';
320
321 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
322    SELECT opcl.oid, 5, pro.oid
323    FROM pg_opclass opcl, pg_proc pro
324    WHERE
325       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
326       and opcname = 'gist_poly_ops'
327       and proname = 'gpoly_penalty';
328
329 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
330    SELECT opcl.oid, 6, pro.oid
331    FROM pg_opclass opcl, pg_proc pro
332    WHERE
333       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
334       and opcname = 'gist_poly_ops'
335       and proname = 'gpoly_picksplit';
336
337 INSERT INTO pg_amproc (amopclaid, amprocnum, amproc)
338    SELECT opcl.oid, 7, pro.oid
339    FROM pg_opclass opcl, pg_proc pro
340    WHERE
341       opcamid = (SELECT oid FROM pg_am WHERE amname = 'gist')
342       and opcname = 'gist_poly_ops'
343       and proname = 'gpoly_same';
344
345 end transaction;
346