1/* contrib/cube/cube--1.2.sql */
2
3-- complain if script is sourced in psql, rather than via CREATE EXTENSION
4\echo Use "CREATE EXTENSION cube" to load this file. \quit
5
6-- Create the user-defined type for N-dimensional boxes
7
8CREATE FUNCTION cube_in(cstring)
9RETURNS cube
10AS 'MODULE_PATHNAME'
11LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
12
13CREATE FUNCTION cube(float8[], float8[]) RETURNS cube
14AS 'MODULE_PATHNAME', 'cube_a_f8_f8'
15LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
16
17CREATE FUNCTION cube(float8[]) RETURNS cube
18AS 'MODULE_PATHNAME', 'cube_a_f8'
19LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
20
21CREATE FUNCTION cube_out(cube)
22RETURNS cstring
23AS 'MODULE_PATHNAME'
24LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
25
26CREATE TYPE cube (
27	INTERNALLENGTH = variable,
28	INPUT = cube_in,
29	OUTPUT = cube_out,
30	ALIGNMENT = double
31);
32
33COMMENT ON TYPE cube IS 'multi-dimensional cube ''(FLOAT-1, FLOAT-2, ..., FLOAT-N), (FLOAT-1, FLOAT-2, ..., FLOAT-N)''';
34
35--
36-- External C-functions for R-tree methods
37--
38
39-- Comparison methods
40
41CREATE FUNCTION cube_eq(cube, cube)
42RETURNS bool
43AS 'MODULE_PATHNAME'
44LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
45
46COMMENT ON FUNCTION cube_eq(cube, cube) IS 'same as';
47
48CREATE FUNCTION cube_ne(cube, cube)
49RETURNS bool
50AS 'MODULE_PATHNAME'
51LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
52
53COMMENT ON FUNCTION cube_ne(cube, cube) IS 'different';
54
55CREATE FUNCTION cube_lt(cube, cube)
56RETURNS bool
57AS 'MODULE_PATHNAME'
58LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
59
60COMMENT ON FUNCTION cube_lt(cube, cube) IS 'lower than';
61
62CREATE FUNCTION cube_gt(cube, cube)
63RETURNS bool
64AS 'MODULE_PATHNAME'
65LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
66
67COMMENT ON FUNCTION cube_gt(cube, cube) IS 'greater than';
68
69CREATE FUNCTION cube_le(cube, cube)
70RETURNS bool
71AS 'MODULE_PATHNAME'
72LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
73
74COMMENT ON FUNCTION cube_le(cube, cube) IS 'lower than or equal to';
75
76CREATE FUNCTION cube_ge(cube, cube)
77RETURNS bool
78AS 'MODULE_PATHNAME'
79LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
80
81COMMENT ON FUNCTION cube_ge(cube, cube) IS 'greater than or equal to';
82
83CREATE FUNCTION cube_cmp(cube, cube)
84RETURNS int4
85AS 'MODULE_PATHNAME'
86LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
87
88COMMENT ON FUNCTION cube_cmp(cube, cube) IS 'btree comparison function';
89
90CREATE FUNCTION cube_contains(cube, cube)
91RETURNS bool
92AS 'MODULE_PATHNAME'
93LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
94
95COMMENT ON FUNCTION cube_contains(cube, cube) IS 'contains';
96
97CREATE FUNCTION cube_contained(cube, cube)
98RETURNS bool
99AS 'MODULE_PATHNAME'
100LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
101
102COMMENT ON FUNCTION cube_contained(cube, cube) IS 'contained in';
103
104CREATE FUNCTION cube_overlap(cube, cube)
105RETURNS bool
106AS 'MODULE_PATHNAME'
107LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
108
109COMMENT ON FUNCTION cube_overlap(cube, cube) IS 'overlaps';
110
111-- support routines for indexing
112
113CREATE FUNCTION cube_union(cube, cube)
114RETURNS cube
115AS 'MODULE_PATHNAME'
116LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
117
118CREATE FUNCTION cube_inter(cube, cube)
119RETURNS cube
120AS 'MODULE_PATHNAME'
121LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
122
123CREATE FUNCTION cube_size(cube)
124RETURNS float8
125AS 'MODULE_PATHNAME'
126LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
127
128
129-- Misc N-dimensional functions
130
131CREATE FUNCTION cube_subset(cube, int4[])
132RETURNS cube
133AS 'MODULE_PATHNAME'
134LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
135
136-- proximity routines
137
138CREATE FUNCTION cube_distance(cube, cube)
139RETURNS float8
140AS 'MODULE_PATHNAME'
141LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
142
143CREATE FUNCTION distance_chebyshev(cube, cube)
144RETURNS float8
145AS 'MODULE_PATHNAME'
146LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
147
148CREATE FUNCTION distance_taxicab(cube, cube)
149RETURNS float8
150AS 'MODULE_PATHNAME'
151LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
152
153-- Extracting elements functions
154
155CREATE FUNCTION cube_dim(cube)
156RETURNS int4
157AS 'MODULE_PATHNAME'
158LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
159
160CREATE FUNCTION cube_ll_coord(cube, int4)
161RETURNS float8
162AS 'MODULE_PATHNAME'
163LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
164
165CREATE FUNCTION cube_ur_coord(cube, int4)
166RETURNS float8
167AS 'MODULE_PATHNAME'
168LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
169
170CREATE FUNCTION cube_coord(cube, int4)
171RETURNS float8
172AS 'MODULE_PATHNAME'
173LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
174
175CREATE FUNCTION cube_coord_llur(cube, int4)
176RETURNS float8
177AS 'MODULE_PATHNAME'
178LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
179
180CREATE FUNCTION cube(float8) RETURNS cube
181AS 'MODULE_PATHNAME', 'cube_f8'
182LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
183
184CREATE FUNCTION cube(float8, float8) RETURNS cube
185AS 'MODULE_PATHNAME', 'cube_f8_f8'
186LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
187
188CREATE FUNCTION cube(cube, float8) RETURNS cube
189AS 'MODULE_PATHNAME', 'cube_c_f8'
190LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
191
192CREATE FUNCTION cube(cube, float8, float8) RETURNS cube
193AS 'MODULE_PATHNAME', 'cube_c_f8_f8'
194LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
195
196-- Test if cube is also a point
197
198CREATE FUNCTION cube_is_point(cube)
199RETURNS bool
200AS 'MODULE_PATHNAME'
201LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
202
203-- Increasing the size of a cube by a radius in at least n dimensions
204
205CREATE FUNCTION cube_enlarge(cube, float8, int4)
206RETURNS cube
207AS 'MODULE_PATHNAME'
208LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
209
210--
211-- OPERATORS
212--
213
214CREATE OPERATOR < (
215	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_lt,
216	COMMUTATOR = '>', NEGATOR = '>=',
217	RESTRICT = scalarltsel, JOIN = scalarltjoinsel
218);
219
220CREATE OPERATOR > (
221	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_gt,
222	COMMUTATOR = '<', NEGATOR = '<=',
223	RESTRICT = scalargtsel, JOIN = scalargtjoinsel
224);
225
226CREATE OPERATOR <= (
227	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_le,
228	COMMUTATOR = '>=', NEGATOR = '>',
229	RESTRICT = scalarltsel, JOIN = scalarltjoinsel
230);
231
232CREATE OPERATOR >= (
233	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_ge,
234	COMMUTATOR = '<=', NEGATOR = '<',
235	RESTRICT = scalargtsel, JOIN = scalargtjoinsel
236);
237
238CREATE OPERATOR && (
239	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_overlap,
240	COMMUTATOR = '&&',
241	RESTRICT = areasel, JOIN = areajoinsel
242);
243
244CREATE OPERATOR = (
245	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_eq,
246	COMMUTATOR = '=', NEGATOR = '<>',
247	RESTRICT = eqsel, JOIN = eqjoinsel,
248	MERGES
249);
250
251CREATE OPERATOR <> (
252	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_ne,
253	COMMUTATOR = '<>', NEGATOR = '=',
254	RESTRICT = neqsel, JOIN = neqjoinsel
255);
256
257CREATE OPERATOR @> (
258	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_contains,
259	COMMUTATOR = '<@',
260	RESTRICT = contsel, JOIN = contjoinsel
261);
262
263CREATE OPERATOR <@ (
264	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_contained,
265	COMMUTATOR = '@>',
266	RESTRICT = contsel, JOIN = contjoinsel
267);
268
269CREATE OPERATOR -> (
270	LEFTARG = cube, RIGHTARG = int, PROCEDURE = cube_coord
271);
272
273CREATE OPERATOR ~> (
274	LEFTARG = cube, RIGHTARG = int, PROCEDURE = cube_coord_llur
275);
276
277CREATE OPERATOR <#> (
278	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = distance_taxicab,
279	COMMUTATOR = '<#>'
280);
281
282CREATE OPERATOR <-> (
283	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_distance,
284	COMMUTATOR = '<->'
285);
286
287CREATE OPERATOR <=> (
288	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = distance_chebyshev,
289	COMMUTATOR = '<=>'
290);
291
292-- these are obsolete/deprecated:
293CREATE OPERATOR @ (
294	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_contains,
295	COMMUTATOR = '~',
296	RESTRICT = contsel, JOIN = contjoinsel
297);
298
299CREATE OPERATOR ~ (
300	LEFTARG = cube, RIGHTARG = cube, PROCEDURE = cube_contained,
301	COMMUTATOR = '@',
302	RESTRICT = contsel, JOIN = contjoinsel
303);
304
305
306-- define the GiST support methods
307CREATE FUNCTION g_cube_consistent(internal,cube,smallint,oid,internal)
308RETURNS bool
309AS 'MODULE_PATHNAME'
310LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
311
312CREATE FUNCTION g_cube_compress(internal)
313RETURNS internal
314AS 'MODULE_PATHNAME'
315LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
316
317CREATE FUNCTION g_cube_decompress(internal)
318RETURNS internal
319AS 'MODULE_PATHNAME'
320LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
321
322CREATE FUNCTION g_cube_penalty(internal,internal,internal)
323RETURNS internal
324AS 'MODULE_PATHNAME'
325LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
326
327CREATE FUNCTION g_cube_picksplit(internal, internal)
328RETURNS internal
329AS 'MODULE_PATHNAME'
330LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
331
332CREATE FUNCTION g_cube_union(internal, internal)
333RETURNS cube
334AS 'MODULE_PATHNAME'
335LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
336
337CREATE FUNCTION g_cube_same(cube, cube, internal)
338RETURNS internal
339AS 'MODULE_PATHNAME'
340LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
341
342CREATE FUNCTION g_cube_distance (internal, cube, smallint, oid, internal)
343RETURNS float8
344AS 'MODULE_PATHNAME'
345LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
346
347-- Create the operator classes for indexing
348
349CREATE OPERATOR CLASS cube_ops
350    DEFAULT FOR TYPE cube USING btree AS
351        OPERATOR        1       < ,
352        OPERATOR        2       <= ,
353        OPERATOR        3       = ,
354        OPERATOR        4       >= ,
355        OPERATOR        5       > ,
356        FUNCTION        1       cube_cmp(cube, cube);
357
358CREATE OPERATOR CLASS gist_cube_ops
359    DEFAULT FOR TYPE cube USING gist AS
360	OPERATOR	3	&& ,
361	OPERATOR	6	= ,
362	OPERATOR	7	@> ,
363	OPERATOR	8	<@ ,
364	OPERATOR	13	@ ,
365	OPERATOR	14	~ ,
366	OPERATOR	15	~> (cube, int) FOR ORDER BY float_ops,
367	OPERATOR	16	<#> (cube, cube) FOR ORDER BY float_ops,
368	OPERATOR	17	<-> (cube, cube) FOR ORDER BY float_ops,
369	OPERATOR	18	<=> (cube, cube) FOR ORDER BY float_ops,
370
371	FUNCTION	1	g_cube_consistent (internal, cube, smallint, oid, internal),
372	FUNCTION	2	g_cube_union (internal, internal),
373	FUNCTION	3	g_cube_compress (internal),
374	FUNCTION	4	g_cube_decompress (internal),
375	FUNCTION	5	g_cube_penalty (internal, internal, internal),
376	FUNCTION	6	g_cube_picksplit (internal, internal),
377	FUNCTION	7	g_cube_same (cube, cube, internal),
378	FUNCTION	8	g_cube_distance (internal, cube, smallint, oid, internal);
379