1/* contrib/ltree/ltree--1.1.sql */
2
3-- complain if script is sourced in psql, rather than via CREATE EXTENSION
4\echo Use "CREATE EXTENSION ltree" to load this file. \quit
5
6CREATE FUNCTION ltree_in(cstring)
7RETURNS ltree
8AS 'MODULE_PATHNAME'
9LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
10
11CREATE FUNCTION ltree_out(ltree)
12RETURNS cstring
13AS 'MODULE_PATHNAME'
14LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
15
16CREATE TYPE ltree (
17	INTERNALLENGTH = -1,
18	INPUT = ltree_in,
19	OUTPUT = ltree_out,
20	STORAGE = extended
21);
22
23
24--Compare function for ltree
25CREATE FUNCTION ltree_cmp(ltree,ltree)
26RETURNS int4
27AS 'MODULE_PATHNAME'
28LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
29
30CREATE FUNCTION ltree_lt(ltree,ltree)
31RETURNS bool
32AS 'MODULE_PATHNAME'
33LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
34
35CREATE FUNCTION ltree_le(ltree,ltree)
36RETURNS bool
37AS 'MODULE_PATHNAME'
38LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
39
40CREATE FUNCTION ltree_eq(ltree,ltree)
41RETURNS bool
42AS 'MODULE_PATHNAME'
43LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
44
45CREATE FUNCTION ltree_ge(ltree,ltree)
46RETURNS bool
47AS 'MODULE_PATHNAME'
48LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
49
50CREATE FUNCTION ltree_gt(ltree,ltree)
51RETURNS bool
52AS 'MODULE_PATHNAME'
53LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
54
55CREATE FUNCTION ltree_ne(ltree,ltree)
56RETURNS bool
57AS 'MODULE_PATHNAME'
58LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
59
60
61CREATE OPERATOR < (
62        LEFTARG = ltree,
63	RIGHTARG = ltree,
64	PROCEDURE = ltree_lt,
65        COMMUTATOR = '>',
66	NEGATOR = '>=',
67        RESTRICT = contsel,
68	JOIN = contjoinsel
69);
70
71CREATE OPERATOR <= (
72        LEFTARG = ltree,
73	RIGHTARG = ltree,
74	PROCEDURE = ltree_le,
75        COMMUTATOR = '>=',
76	NEGATOR = '>',
77        RESTRICT = contsel,
78	JOIN = contjoinsel
79);
80
81CREATE OPERATOR >= (
82        LEFTARG = ltree,
83	RIGHTARG = ltree,
84	PROCEDURE = ltree_ge,
85        COMMUTATOR = '<=',
86	NEGATOR = '<',
87        RESTRICT = contsel,
88	JOIN = contjoinsel
89);
90
91CREATE OPERATOR > (
92        LEFTARG = ltree,
93	RIGHTARG = ltree,
94	PROCEDURE = ltree_gt,
95        COMMUTATOR = '<',
96	NEGATOR = '<=',
97        RESTRICT = contsel,
98	JOIN = contjoinsel
99);
100
101CREATE OPERATOR = (
102        LEFTARG = ltree,
103	RIGHTARG = ltree,
104	PROCEDURE = ltree_eq,
105        COMMUTATOR = '=',
106	NEGATOR = '<>',
107        RESTRICT = eqsel,
108	JOIN = eqjoinsel,
109        SORT1 = '<',
110	SORT2 = '<'
111);
112
113CREATE OPERATOR <> (
114        LEFTARG = ltree,
115	RIGHTARG = ltree,
116	PROCEDURE = ltree_ne,
117        COMMUTATOR = '<>',
118	NEGATOR = '=',
119        RESTRICT = neqsel,
120	JOIN = neqjoinsel
121);
122
123--util functions
124
125CREATE FUNCTION subltree(ltree,int4,int4)
126RETURNS ltree
127AS 'MODULE_PATHNAME'
128LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
129
130CREATE FUNCTION subpath(ltree,int4,int4)
131RETURNS ltree
132AS 'MODULE_PATHNAME'
133LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
134
135CREATE FUNCTION subpath(ltree,int4)
136RETURNS ltree
137AS 'MODULE_PATHNAME'
138LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
139
140CREATE FUNCTION index(ltree,ltree)
141RETURNS int4
142AS 'MODULE_PATHNAME', 'ltree_index'
143LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
144
145CREATE FUNCTION index(ltree,ltree,int4)
146RETURNS int4
147AS 'MODULE_PATHNAME', 'ltree_index'
148LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
149
150CREATE FUNCTION nlevel(ltree)
151RETURNS int4
152AS 'MODULE_PATHNAME'
153LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
154
155CREATE FUNCTION ltree2text(ltree)
156RETURNS text
157AS 'MODULE_PATHNAME'
158LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
159
160CREATE FUNCTION text2ltree(text)
161RETURNS ltree
162AS 'MODULE_PATHNAME'
163LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
164
165CREATE FUNCTION lca(_ltree)
166RETURNS ltree
167AS 'MODULE_PATHNAME','_lca'
168LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
169
170CREATE FUNCTION lca(ltree,ltree)
171RETURNS ltree
172AS 'MODULE_PATHNAME'
173LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
174
175CREATE FUNCTION lca(ltree,ltree,ltree)
176RETURNS ltree
177AS 'MODULE_PATHNAME'
178LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
179
180CREATE FUNCTION lca(ltree,ltree,ltree,ltree)
181RETURNS ltree
182AS 'MODULE_PATHNAME'
183LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
184
185CREATE FUNCTION lca(ltree,ltree,ltree,ltree,ltree)
186RETURNS ltree
187AS 'MODULE_PATHNAME'
188LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
189
190CREATE FUNCTION lca(ltree,ltree,ltree,ltree,ltree,ltree)
191RETURNS ltree
192AS 'MODULE_PATHNAME'
193LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
194
195CREATE FUNCTION lca(ltree,ltree,ltree,ltree,ltree,ltree,ltree)
196RETURNS ltree
197AS 'MODULE_PATHNAME'
198LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
199
200CREATE FUNCTION lca(ltree,ltree,ltree,ltree,ltree,ltree,ltree,ltree)
201RETURNS ltree
202AS 'MODULE_PATHNAME'
203LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
204
205CREATE FUNCTION ltree_isparent(ltree,ltree)
206RETURNS bool
207AS 'MODULE_PATHNAME'
208LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
209
210CREATE FUNCTION ltree_risparent(ltree,ltree)
211RETURNS bool
212AS 'MODULE_PATHNAME'
213LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
214
215CREATE FUNCTION ltree_addltree(ltree,ltree)
216RETURNS ltree
217AS 'MODULE_PATHNAME'
218LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
219
220CREATE FUNCTION ltree_addtext(ltree,text)
221RETURNS ltree
222AS 'MODULE_PATHNAME'
223LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
224
225CREATE FUNCTION ltree_textadd(text,ltree)
226RETURNS ltree
227AS 'MODULE_PATHNAME'
228LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
229
230CREATE FUNCTION ltreeparentsel(internal, oid, internal, integer)
231RETURNS float8
232AS 'MODULE_PATHNAME'
233LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
234
235CREATE OPERATOR @> (
236        LEFTARG = ltree,
237	RIGHTARG = ltree,
238	PROCEDURE = ltree_isparent,
239        COMMUTATOR = '<@',
240        RESTRICT = ltreeparentsel,
241	JOIN = contjoinsel
242);
243
244CREATE OPERATOR ^@> (
245        LEFTARG = ltree,
246	RIGHTARG = ltree,
247	PROCEDURE = ltree_isparent,
248        COMMUTATOR = '^<@',
249        RESTRICT = contsel,
250	JOIN = contjoinsel
251);
252
253CREATE OPERATOR <@ (
254        LEFTARG = ltree,
255	RIGHTARG = ltree,
256	PROCEDURE = ltree_risparent,
257        COMMUTATOR = '@>',
258        RESTRICT = ltreeparentsel,
259	JOIN = contjoinsel
260);
261
262CREATE OPERATOR ^<@ (
263        LEFTARG = ltree,
264	RIGHTARG = ltree,
265	PROCEDURE = ltree_risparent,
266        COMMUTATOR = '^@>',
267        RESTRICT = contsel,
268	JOIN = contjoinsel
269);
270
271CREATE OPERATOR || (
272        LEFTARG = ltree,
273	RIGHTARG = ltree,
274	PROCEDURE = ltree_addltree
275);
276
277CREATE OPERATOR || (
278        LEFTARG = ltree,
279	RIGHTARG = text,
280	PROCEDURE = ltree_addtext
281);
282
283CREATE OPERATOR || (
284        LEFTARG = text,
285	RIGHTARG = ltree,
286	PROCEDURE = ltree_textadd
287);
288
289
290-- B-tree support
291
292CREATE OPERATOR CLASS ltree_ops
293    DEFAULT FOR TYPE ltree USING btree AS
294        OPERATOR        1       < ,
295        OPERATOR        2       <= ,
296        OPERATOR        3       = ,
297        OPERATOR        4       >= ,
298        OPERATOR        5       > ,
299        FUNCTION        1       ltree_cmp(ltree, ltree);
300
301
302--lquery type
303CREATE FUNCTION lquery_in(cstring)
304RETURNS lquery
305AS 'MODULE_PATHNAME'
306LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
307
308CREATE FUNCTION lquery_out(lquery)
309RETURNS cstring
310AS 'MODULE_PATHNAME'
311LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
312
313CREATE TYPE lquery (
314	INTERNALLENGTH = -1,
315	INPUT = lquery_in,
316	OUTPUT = lquery_out,
317	STORAGE = extended
318);
319
320CREATE FUNCTION ltq_regex(ltree,lquery)
321RETURNS bool
322AS 'MODULE_PATHNAME'
323LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
324
325CREATE FUNCTION ltq_rregex(lquery,ltree)
326RETURNS bool
327AS 'MODULE_PATHNAME'
328LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
329
330CREATE OPERATOR ~ (
331        LEFTARG = ltree,
332	RIGHTARG = lquery,
333	PROCEDURE = ltq_regex,
334	COMMUTATOR = '~',
335	RESTRICT = contsel,
336	JOIN = contjoinsel
337);
338
339CREATE OPERATOR ~ (
340        LEFTARG = lquery,
341	RIGHTARG = ltree,
342	PROCEDURE = ltq_rregex,
343	COMMUTATOR = '~',
344	RESTRICT = contsel,
345	JOIN = contjoinsel
346);
347
348--not-indexed
349CREATE OPERATOR ^~ (
350        LEFTARG = ltree,
351	RIGHTARG = lquery,
352	PROCEDURE = ltq_regex,
353	COMMUTATOR = '^~',
354	RESTRICT = contsel,
355	JOIN = contjoinsel
356);
357
358CREATE OPERATOR ^~ (
359        LEFTARG = lquery,
360	RIGHTARG = ltree,
361	PROCEDURE = ltq_rregex,
362	COMMUTATOR = '^~',
363	RESTRICT = contsel,
364	JOIN = contjoinsel
365);
366
367CREATE FUNCTION lt_q_regex(ltree,_lquery)
368RETURNS bool
369AS 'MODULE_PATHNAME'
370LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
371
372CREATE FUNCTION lt_q_rregex(_lquery,ltree)
373RETURNS bool
374AS 'MODULE_PATHNAME'
375LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
376
377CREATE OPERATOR ? (
378        LEFTARG = ltree,
379	RIGHTARG = _lquery,
380	PROCEDURE = lt_q_regex,
381	COMMUTATOR = '?',
382	RESTRICT = contsel,
383	JOIN = contjoinsel
384);
385
386CREATE OPERATOR ? (
387        LEFTARG = _lquery,
388	RIGHTARG = ltree,
389	PROCEDURE = lt_q_rregex,
390	COMMUTATOR = '?',
391	RESTRICT = contsel,
392	JOIN = contjoinsel
393);
394
395--not-indexed
396CREATE OPERATOR ^? (
397        LEFTARG = ltree,
398	RIGHTARG = _lquery,
399	PROCEDURE = lt_q_regex,
400	COMMUTATOR = '^?',
401	RESTRICT = contsel,
402	JOIN = contjoinsel
403);
404
405CREATE OPERATOR ^? (
406        LEFTARG = _lquery,
407	RIGHTARG = ltree,
408	PROCEDURE = lt_q_rregex,
409	COMMUTATOR = '^?',
410	RESTRICT = contsel,
411	JOIN = contjoinsel
412);
413
414CREATE FUNCTION ltxtq_in(cstring)
415RETURNS ltxtquery
416AS 'MODULE_PATHNAME'
417LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
418
419CREATE FUNCTION ltxtq_out(ltxtquery)
420RETURNS cstring
421AS 'MODULE_PATHNAME'
422LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
423
424CREATE TYPE ltxtquery (
425	INTERNALLENGTH = -1,
426	INPUT = ltxtq_in,
427	OUTPUT = ltxtq_out,
428	STORAGE = extended
429);
430
431-- operations WITH ltxtquery
432
433CREATE FUNCTION ltxtq_exec(ltree, ltxtquery)
434RETURNS bool
435AS 'MODULE_PATHNAME'
436LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
437
438CREATE FUNCTION ltxtq_rexec(ltxtquery, ltree)
439RETURNS bool
440AS 'MODULE_PATHNAME'
441LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
442
443CREATE OPERATOR @ (
444        LEFTARG = ltree,
445	RIGHTARG = ltxtquery,
446	PROCEDURE = ltxtq_exec,
447	COMMUTATOR = '@',
448	RESTRICT = contsel,
449	JOIN = contjoinsel
450);
451
452CREATE OPERATOR @ (
453        LEFTARG = ltxtquery,
454	RIGHTARG = ltree,
455	PROCEDURE = ltxtq_rexec,
456	COMMUTATOR = '@',
457	RESTRICT = contsel,
458	JOIN = contjoinsel
459);
460
461--not-indexed
462CREATE OPERATOR ^@ (
463        LEFTARG = ltree,
464	RIGHTARG = ltxtquery,
465	PROCEDURE = ltxtq_exec,
466	COMMUTATOR = '^@',
467	RESTRICT = contsel,
468	JOIN = contjoinsel
469);
470
471CREATE OPERATOR ^@ (
472        LEFTARG = ltxtquery,
473	RIGHTARG = ltree,
474	PROCEDURE = ltxtq_rexec,
475	COMMUTATOR = '^@',
476	RESTRICT = contsel,
477	JOIN = contjoinsel
478);
479
480--GiST support for ltree
481CREATE FUNCTION ltree_gist_in(cstring)
482RETURNS ltree_gist
483AS 'MODULE_PATHNAME'
484LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
485
486CREATE FUNCTION ltree_gist_out(ltree_gist)
487RETURNS cstring
488AS 'MODULE_PATHNAME'
489LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
490
491CREATE TYPE ltree_gist (
492	internallength = -1,
493	input = ltree_gist_in,
494	output = ltree_gist_out,
495	storage = plain
496);
497
498
499CREATE FUNCTION ltree_consistent(internal,ltree,int2,oid,internal)
500RETURNS bool as 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
501
502CREATE FUNCTION ltree_compress(internal)
503RETURNS internal as 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
504
505CREATE FUNCTION ltree_decompress(internal)
506RETURNS internal as 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
507
508CREATE FUNCTION ltree_penalty(internal,internal,internal)
509RETURNS internal as 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
510
511CREATE FUNCTION ltree_picksplit(internal, internal)
512RETURNS internal as 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
513
514CREATE FUNCTION ltree_union(internal, internal)
515RETURNS ltree_gist as 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
516
517CREATE FUNCTION ltree_same(ltree_gist, ltree_gist, internal)
518RETURNS internal as 'MODULE_PATHNAME' LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
519
520CREATE OPERATOR CLASS gist_ltree_ops
521    DEFAULT FOR TYPE ltree USING gist AS
522	OPERATOR	1	< ,
523	OPERATOR	2	<= ,
524	OPERATOR	3	= ,
525	OPERATOR	4	>= ,
526	OPERATOR	5	> ,
527	OPERATOR	10	@> ,
528	OPERATOR	11	<@ ,
529	OPERATOR	12	~ (ltree, lquery) ,
530	OPERATOR	13	~ (lquery, ltree) ,
531	OPERATOR	14	@ (ltree, ltxtquery) ,
532	OPERATOR	15	@ (ltxtquery, ltree) ,
533	OPERATOR	16	? (ltree, _lquery) ,
534	OPERATOR	17	? (_lquery, ltree) ,
535	FUNCTION	1	ltree_consistent (internal, ltree, int2, oid, internal),
536	FUNCTION	2	ltree_union (internal, internal),
537	FUNCTION	3	ltree_compress (internal),
538	FUNCTION	4	ltree_decompress (internal),
539	FUNCTION	5	ltree_penalty (internal, internal, internal),
540	FUNCTION	6	ltree_picksplit (internal, internal),
541	FUNCTION	7	ltree_same (ltree_gist, ltree_gist, internal),
542	STORAGE		ltree_gist;
543
544
545-- arrays of ltree
546
547CREATE FUNCTION _ltree_isparent(_ltree,ltree)
548RETURNS bool
549AS 'MODULE_PATHNAME'
550LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
551
552CREATE FUNCTION _ltree_r_isparent(ltree,_ltree)
553RETURNS bool
554AS 'MODULE_PATHNAME'
555LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
556
557CREATE FUNCTION _ltree_risparent(_ltree,ltree)
558RETURNS bool
559AS 'MODULE_PATHNAME'
560LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
561
562CREATE FUNCTION _ltree_r_risparent(ltree,_ltree)
563RETURNS bool
564AS 'MODULE_PATHNAME'
565LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
566
567CREATE FUNCTION _ltq_regex(_ltree,lquery)
568RETURNS bool
569AS 'MODULE_PATHNAME'
570LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
571
572CREATE FUNCTION _ltq_rregex(lquery,_ltree)
573RETURNS bool
574AS 'MODULE_PATHNAME'
575LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
576
577CREATE FUNCTION _lt_q_regex(_ltree,_lquery)
578RETURNS bool
579AS 'MODULE_PATHNAME'
580LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
581
582CREATE FUNCTION _lt_q_rregex(_lquery,_ltree)
583RETURNS bool
584AS 'MODULE_PATHNAME'
585LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
586
587CREATE FUNCTION _ltxtq_exec(_ltree, ltxtquery)
588RETURNS bool
589AS 'MODULE_PATHNAME'
590LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
591
592CREATE FUNCTION _ltxtq_rexec(ltxtquery, _ltree)
593RETURNS bool
594AS 'MODULE_PATHNAME'
595LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
596
597CREATE OPERATOR @> (
598        LEFTARG = _ltree,
599	RIGHTARG = ltree,
600	PROCEDURE = _ltree_isparent,
601        COMMUTATOR = '<@',
602        RESTRICT = contsel,
603	JOIN = contjoinsel
604);
605
606CREATE OPERATOR <@ (
607        LEFTARG = ltree,
608	RIGHTARG = _ltree,
609	PROCEDURE = _ltree_r_isparent,
610        COMMUTATOR = '@>',
611        RESTRICT = contsel,
612	JOIN = contjoinsel
613);
614
615CREATE OPERATOR <@ (
616        LEFTARG = _ltree,
617	RIGHTARG = ltree,
618	PROCEDURE = _ltree_risparent,
619        COMMUTATOR = '@>',
620        RESTRICT = contsel,
621	JOIN = contjoinsel
622);
623
624CREATE OPERATOR @> (
625        LEFTARG = ltree,
626	RIGHTARG = _ltree,
627	PROCEDURE = _ltree_r_risparent,
628        COMMUTATOR = '<@',
629        RESTRICT = contsel,
630	JOIN = contjoinsel
631);
632
633CREATE OPERATOR ~ (
634        LEFTARG = _ltree,
635	RIGHTARG = lquery,
636	PROCEDURE = _ltq_regex,
637        COMMUTATOR = '~',
638        RESTRICT = contsel,
639	JOIN = contjoinsel
640);
641
642CREATE OPERATOR ~ (
643        LEFTARG = lquery,
644	RIGHTARG = _ltree,
645	PROCEDURE = _ltq_rregex,
646        COMMUTATOR = '~',
647        RESTRICT = contsel,
648	JOIN = contjoinsel
649);
650
651CREATE OPERATOR ? (
652        LEFTARG = _ltree,
653	RIGHTARG = _lquery,
654	PROCEDURE = _lt_q_regex,
655        COMMUTATOR = '?',
656        RESTRICT = contsel,
657	JOIN = contjoinsel
658);
659
660CREATE OPERATOR ? (
661        LEFTARG = _lquery,
662	RIGHTARG = _ltree,
663	PROCEDURE = _lt_q_rregex,
664        COMMUTATOR = '?',
665        RESTRICT = contsel,
666	JOIN = contjoinsel
667);
668
669CREATE OPERATOR @ (
670        LEFTARG = _ltree,
671	RIGHTARG = ltxtquery,
672	PROCEDURE = _ltxtq_exec,
673        COMMUTATOR = '@',
674        RESTRICT = contsel,
675	JOIN = contjoinsel
676);
677
678CREATE OPERATOR @ (
679        LEFTARG = ltxtquery,
680	RIGHTARG = _ltree,
681	PROCEDURE = _ltxtq_rexec,
682        COMMUTATOR = '@',
683        RESTRICT = contsel,
684	JOIN = contjoinsel
685);
686
687
688--not indexed
689CREATE OPERATOR ^@> (
690        LEFTARG = _ltree,
691	RIGHTARG = ltree,
692	PROCEDURE = _ltree_isparent,
693        COMMUTATOR = '^<@',
694        RESTRICT = contsel,
695	JOIN = contjoinsel
696);
697
698CREATE OPERATOR ^<@ (
699        LEFTARG = ltree,
700	RIGHTARG = _ltree,
701	PROCEDURE = _ltree_r_isparent,
702        COMMUTATOR = '^@>',
703        RESTRICT = contsel,
704	JOIN = contjoinsel
705);
706
707CREATE OPERATOR ^<@ (
708        LEFTARG = _ltree,
709	RIGHTARG = ltree,
710	PROCEDURE = _ltree_risparent,
711        COMMUTATOR = '^@>',
712        RESTRICT = contsel,
713	JOIN = contjoinsel
714);
715
716CREATE OPERATOR ^@> (
717        LEFTARG = ltree,
718	RIGHTARG = _ltree,
719	PROCEDURE = _ltree_r_risparent,
720        COMMUTATOR = '^<@',
721        RESTRICT = contsel,
722	JOIN = contjoinsel
723);
724
725CREATE OPERATOR ^~ (
726        LEFTARG = _ltree,
727	RIGHTARG = lquery,
728	PROCEDURE = _ltq_regex,
729        COMMUTATOR = '^~',
730        RESTRICT = contsel,
731	JOIN = contjoinsel
732);
733
734CREATE OPERATOR ^~ (
735        LEFTARG = lquery,
736	RIGHTARG = _ltree,
737	PROCEDURE = _ltq_rregex,
738        COMMUTATOR = '^~',
739        RESTRICT = contsel,
740	JOIN = contjoinsel
741);
742
743CREATE OPERATOR ^? (
744        LEFTARG = _ltree,
745	RIGHTARG = _lquery,
746	PROCEDURE = _lt_q_regex,
747        COMMUTATOR = '^?',
748        RESTRICT = contsel,
749	JOIN = contjoinsel
750);
751
752CREATE OPERATOR ^? (
753        LEFTARG = _lquery,
754	RIGHTARG = _ltree,
755	PROCEDURE = _lt_q_rregex,
756        COMMUTATOR = '^?',
757        RESTRICT = contsel,
758	JOIN = contjoinsel
759);
760
761CREATE OPERATOR ^@ (
762        LEFTARG = _ltree,
763	RIGHTARG = ltxtquery,
764	PROCEDURE = _ltxtq_exec,
765        COMMUTATOR = '^@',
766        RESTRICT = contsel,
767	JOIN = contjoinsel
768);
769
770CREATE OPERATOR ^@ (
771        LEFTARG = ltxtquery,
772	RIGHTARG = _ltree,
773	PROCEDURE = _ltxtq_rexec,
774        COMMUTATOR = '^@',
775        RESTRICT = contsel,
776	JOIN = contjoinsel
777);
778
779--extractors
780CREATE FUNCTION _ltree_extract_isparent(_ltree,ltree)
781RETURNS ltree
782AS 'MODULE_PATHNAME'
783LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
784
785CREATE OPERATOR ?@> (
786        LEFTARG = _ltree,
787	RIGHTARG = ltree,
788	PROCEDURE = _ltree_extract_isparent
789);
790
791CREATE FUNCTION _ltree_extract_risparent(_ltree,ltree)
792RETURNS ltree
793AS 'MODULE_PATHNAME'
794LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
795
796CREATE OPERATOR ?<@ (
797        LEFTARG = _ltree,
798	RIGHTARG = ltree,
799	PROCEDURE = _ltree_extract_risparent
800);
801
802CREATE FUNCTION _ltq_extract_regex(_ltree,lquery)
803RETURNS ltree
804AS 'MODULE_PATHNAME'
805LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
806
807CREATE OPERATOR ?~ (
808        LEFTARG = _ltree,
809	RIGHTARG = lquery,
810	PROCEDURE = _ltq_extract_regex
811);
812
813CREATE FUNCTION _ltxtq_extract_exec(_ltree,ltxtquery)
814RETURNS ltree
815AS 'MODULE_PATHNAME'
816LANGUAGE C STRICT IMMUTABLE PARALLEL SAFE;
817
818CREATE OPERATOR ?@ (
819        LEFTARG = _ltree,
820	RIGHTARG = ltxtquery,
821	PROCEDURE = _ltxtq_extract_exec
822);
823
824--GiST support for ltree[]
825CREATE FUNCTION _ltree_consistent(internal,_ltree,int2,oid,internal)
826RETURNS bool
827AS 'MODULE_PATHNAME'
828LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
829
830CREATE FUNCTION _ltree_compress(internal)
831RETURNS internal
832AS 'MODULE_PATHNAME'
833LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
834
835CREATE FUNCTION _ltree_penalty(internal,internal,internal)
836RETURNS internal
837AS 'MODULE_PATHNAME'
838LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
839
840CREATE FUNCTION _ltree_picksplit(internal, internal)
841RETURNS internal
842AS 'MODULE_PATHNAME'
843LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
844
845CREATE FUNCTION _ltree_union(internal, internal)
846RETURNS ltree_gist
847AS 'MODULE_PATHNAME'
848LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
849
850CREATE FUNCTION _ltree_same(ltree_gist, ltree_gist, internal)
851RETURNS internal
852AS 'MODULE_PATHNAME'
853LANGUAGE C IMMUTABLE STRICT PARALLEL SAFE;
854
855CREATE OPERATOR CLASS gist__ltree_ops
856    DEFAULT FOR TYPE _ltree USING gist AS
857	OPERATOR	10	<@ (_ltree, ltree),
858	OPERATOR	11	@> (ltree, _ltree),
859	OPERATOR	12	~ (_ltree, lquery),
860	OPERATOR	13	~ (lquery, _ltree),
861	OPERATOR	14	@ (_ltree, ltxtquery),
862	OPERATOR	15	@ (ltxtquery, _ltree),
863	OPERATOR	16	? (_ltree, _lquery),
864	OPERATOR	17	? (_lquery, _ltree),
865	FUNCTION	1	_ltree_consistent (internal, _ltree, int2, oid, internal),
866	FUNCTION	2	_ltree_union (internal, internal),
867	FUNCTION	3	_ltree_compress (internal),
868	FUNCTION	4	ltree_decompress (internal),
869	FUNCTION	5	_ltree_penalty (internal, internal, internal),
870	FUNCTION	6	_ltree_picksplit (internal, internal),
871	FUNCTION	7	_ltree_same (ltree_gist, ltree_gist, internal),
872	STORAGE		ltree_gist;
873