~ubuntu-branches/ubuntu/oneiric/postgresql-9.1/oneiric-security

« back to all changes in this revision

Viewing changes to doc/src/sgml/html/ltree.html

  • Committer: Bazaar Package Importer
  • Author(s): Martin Pitt
  • Date: 2011-05-11 10:41:53 UTC
  • Revision ID: james.westby@ubuntu.com-20110511104153-psbh2o58553fv1m0
Tags: upstream-9.1~beta1
ImportĀ upstreamĀ versionĀ 9.1~beta1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
 
2
<HTML
 
3
><HEAD
 
4
><TITLE
 
5
>ltree</TITLE
 
6
><META
 
7
NAME="GENERATOR"
 
8
CONTENT="Modular DocBook HTML Stylesheet Version 1.79"><LINK
 
9
REV="MADE"
 
10
HREF="mailto:pgsql-docs@postgresql.org"><LINK
 
11
REL="HOME"
 
12
TITLE="PostgreSQL 9.1beta1 Documentation"
 
13
HREF="index.html"><LINK
 
14
REL="UP"
 
15
TITLE="Additional Supplied Modules"
 
16
HREF="contrib.html"><LINK
 
17
REL="PREVIOUS"
 
18
TITLE="lo"
 
19
HREF="lo.html"><LINK
 
20
REL="NEXT"
 
21
TITLE="oid2name"
 
22
HREF="oid2name.html"><LINK
 
23
REL="STYLESHEET"
 
24
TYPE="text/css"
 
25
HREF="stylesheet.css"><META
 
26
HTTP-EQUIV="Content-Type"
 
27
CONTENT="text/html; charset=ISO-8859-1"><META
 
28
NAME="creation"
 
29
CONTENT="2011-04-27T21:20:33"></HEAD
 
30
><BODY
 
31
CLASS="SECT1"
 
32
><DIV
 
33
CLASS="NAVHEADER"
 
34
><TABLE
 
35
SUMMARY="Header navigation table"
 
36
WIDTH="100%"
 
37
BORDER="0"
 
38
CELLPADDING="0"
 
39
CELLSPACING="0"
 
40
><TR
 
41
><TH
 
42
COLSPAN="5"
 
43
ALIGN="center"
 
44
VALIGN="bottom"
 
45
><A
 
46
HREF="index.html"
 
47
>PostgreSQL 9.1beta1 Documentation</A
 
48
></TH
 
49
></TR
 
50
><TR
 
51
><TD
 
52
WIDTH="10%"
 
53
ALIGN="left"
 
54
VALIGN="top"
 
55
><A
 
56
TITLE="lo"
 
57
HREF="lo.html"
 
58
ACCESSKEY="P"
 
59
>Prev</A
 
60
></TD
 
61
><TD
 
62
WIDTH="10%"
 
63
ALIGN="left"
 
64
VALIGN="top"
 
65
><A
 
66
TITLE="Additional Supplied Modules"
 
67
HREF="contrib.html"
 
68
>Fast Backward</A
 
69
></TD
 
70
><TD
 
71
WIDTH="60%"
 
72
ALIGN="center"
 
73
VALIGN="bottom"
 
74
>Appendix F. Additional Supplied Modules</TD
 
75
><TD
 
76
WIDTH="10%"
 
77
ALIGN="right"
 
78
VALIGN="top"
 
79
><A
 
80
TITLE="Additional Supplied Modules"
 
81
HREF="contrib.html"
 
82
>Fast Forward</A
 
83
></TD
 
84
><TD
 
85
WIDTH="10%"
 
86
ALIGN="right"
 
87
VALIGN="top"
 
88
><A
 
89
TITLE="oid2name"
 
90
HREF="oid2name.html"
 
91
ACCESSKEY="N"
 
92
>Next</A
 
93
></TD
 
94
></TR
 
95
></TABLE
 
96
><HR
 
97
ALIGN="LEFT"
 
98
WIDTH="100%"></DIV
 
99
><DIV
 
100
CLASS="SECT1"
 
101
><H1
 
102
CLASS="SECT1"
 
103
><A
 
104
NAME="LTREE"
 
105
>F.21. ltree</A
 
106
></H1
 
107
><P
 
108
>  This module implements a data type <TT
 
109
CLASS="TYPE"
 
110
>ltree</TT
 
111
> for representing
 
112
  labels of data stored in a hierarchical tree-like structure.
 
113
  Extensive facilities for searching through label trees are provided.
 
114
 </P
 
115
><DIV
 
116
CLASS="SECT2"
 
117
><H2
 
118
CLASS="SECT2"
 
119
><A
 
120
NAME="AEN131199"
 
121
>F.21.1. Definitions</A
 
122
></H2
 
123
><P
 
124
>   A <I
 
125
CLASS="FIRSTTERM"
 
126
>label</I
 
127
> is a sequence of alphanumeric characters
 
128
   and underscores (for example, in C locale the characters
 
129
   <TT
 
130
CLASS="LITERAL"
 
131
>A-Za-z0-9_</TT
 
132
> are allowed).  Labels must be less than 256 bytes
 
133
   long.
 
134
  </P
 
135
><P
 
136
>   Examples: <TT
 
137
CLASS="LITERAL"
 
138
>42</TT
 
139
>, <TT
 
140
CLASS="LITERAL"
 
141
>Personal_Services</TT
 
142
>
 
143
  </P
 
144
><P
 
145
>   A <I
 
146
CLASS="FIRSTTERM"
 
147
>label path</I
 
148
> is a sequence of zero or more
 
149
   labels separated by dots, for example <TT
 
150
CLASS="LITERAL"
 
151
>L1.L2.L3</TT
 
152
>, representing
 
153
   a path from the root of a hierarchical tree to a particular node.  The
 
154
   length of a label path must be less than 65Kb, but keeping it under 2Kb is
 
155
   preferable.  In practice this is not a major limitation; for example,
 
156
   the longest label path in the DMOZ catalogue (<A
 
157
HREF="http://www.dmoz.org"
 
158
TARGET="_top"
 
159
>http://www.dmoz.org</A
 
160
>) is about 240 bytes.
 
161
  </P
 
162
><P
 
163
>   Example: <TT
 
164
CLASS="LITERAL"
 
165
>Top.Countries.Europe.Russia</TT
 
166
>
 
167
  </P
 
168
><P
 
169
>   The <TT
 
170
CLASS="FILENAME"
 
171
>ltree</TT
 
172
> module provides several data types:
 
173
  </P
 
174
><P
 
175
></P
 
176
><UL
 
177
><LI
 
178
><P
 
179
>     <TT
 
180
CLASS="TYPE"
 
181
>ltree</TT
 
182
> stores a label path.
 
183
    </P
 
184
></LI
 
185
><LI
 
186
><P
 
187
>     <TT
 
188
CLASS="TYPE"
 
189
>lquery</TT
 
190
> represents a regular-expression-like pattern
 
191
     for matching <TT
 
192
CLASS="TYPE"
 
193
>ltree</TT
 
194
> values.  A simple word matches that
 
195
     label within a path.  A star symbol (<TT
 
196
CLASS="LITERAL"
 
197
>*</TT
 
198
>) matches zero
 
199
     or more labels.  For example:
 
200
</P><PRE
 
201
CLASS="SYNOPSIS"
 
202
>foo         <I
 
203
CLASS="LINEANNOTATION"
 
204
>Match the exact label path <TT
 
205
CLASS="LITERAL"
 
206
>foo</TT
 
207
></I
 
208
>
 
209
*.foo.*     <I
 
210
CLASS="LINEANNOTATION"
 
211
>Match any label path containing the label <TT
 
212
CLASS="LITERAL"
 
213
>foo</TT
 
214
></I
 
215
>
 
216
*.foo       <I
 
217
CLASS="LINEANNOTATION"
 
218
>Match any label path whose last label is <TT
 
219
CLASS="LITERAL"
 
220
>foo</TT
 
221
></I
 
222
></PRE
 
223
><P>
 
224
    </P
 
225
><P
 
226
>     Star symbols can also be quantified to restrict how many labels
 
227
     they can match:
 
228
</P><PRE
 
229
CLASS="SYNOPSIS"
 
230
>*{<TT
 
231
CLASS="REPLACEABLE"
 
232
><I
 
233
>n</I
 
234
></TT
 
235
>}        <I
 
236
CLASS="LINEANNOTATION"
 
237
>Match exactly <TT
 
238
CLASS="REPLACEABLE"
 
239
><I
 
240
>n</I
 
241
></TT
 
242
> labels</I
 
243
>
 
244
*{<TT
 
245
CLASS="REPLACEABLE"
 
246
><I
 
247
>n</I
 
248
></TT
 
249
>,}       <I
 
250
CLASS="LINEANNOTATION"
 
251
>Match at least <TT
 
252
CLASS="REPLACEABLE"
 
253
><I
 
254
>n</I
 
255
></TT
 
256
> labels</I
 
257
>
 
258
*{<TT
 
259
CLASS="REPLACEABLE"
 
260
><I
 
261
>n</I
 
262
></TT
 
263
>,<TT
 
264
CLASS="REPLACEABLE"
 
265
><I
 
266
>m</I
 
267
></TT
 
268
>}      <I
 
269
CLASS="LINEANNOTATION"
 
270
>Match at least <TT
 
271
CLASS="REPLACEABLE"
 
272
><I
 
273
>n</I
 
274
></TT
 
275
> but not more than <TT
 
276
CLASS="REPLACEABLE"
 
277
><I
 
278
>m</I
 
279
></TT
 
280
> labels</I
 
281
>
 
282
*{,<TT
 
283
CLASS="REPLACEABLE"
 
284
><I
 
285
>m</I
 
286
></TT
 
287
>}       <I
 
288
CLASS="LINEANNOTATION"
 
289
>Match at most <TT
 
290
CLASS="REPLACEABLE"
 
291
><I
 
292
>m</I
 
293
></TT
 
294
> labels &mdash; same as </I
 
295
> *{0,<TT
 
296
CLASS="REPLACEABLE"
 
297
><I
 
298
>m</I
 
299
></TT
 
300
>}</PRE
 
301
><P>
 
302
    </P
 
303
><P
 
304
>     There are several modifiers that can be put at the end of a non-star
 
305
     label in <TT
 
306
CLASS="TYPE"
 
307
>lquery</TT
 
308
> to make it match more than just the exact match:
 
309
</P><PRE
 
310
CLASS="SYNOPSIS"
 
311
>@           <I
 
312
CLASS="LINEANNOTATION"
 
313
>Match case-insensitively, for example <TT
 
314
CLASS="LITERAL"
 
315
>a@</TT
 
316
> matches <TT
 
317
CLASS="LITERAL"
 
318
>A</TT
 
319
></I
 
320
>
 
321
*           <I
 
322
CLASS="LINEANNOTATION"
 
323
>Match any label with this prefix, for example <TT
 
324
CLASS="LITERAL"
 
325
>foo*</TT
 
326
> matches <TT
 
327
CLASS="LITERAL"
 
328
>foobar</TT
 
329
></I
 
330
>
 
331
%           <I
 
332
CLASS="LINEANNOTATION"
 
333
>Match initial underscore-separated words</I
 
334
></PRE
 
335
><P>
 
336
     The behavior of <TT
 
337
CLASS="LITERAL"
 
338
>%</TT
 
339
> is a bit complicated.  It tries to match
 
340
     words rather than the entire label.  For example
 
341
     <TT
 
342
CLASS="LITERAL"
 
343
>foo_bar%</TT
 
344
> matches <TT
 
345
CLASS="LITERAL"
 
346
>foo_bar_baz</TT
 
347
> but not
 
348
     <TT
 
349
CLASS="LITERAL"
 
350
>foo_barbaz</TT
 
351
>.  If combined with <TT
 
352
CLASS="LITERAL"
 
353
>*</TT
 
354
>, prefix
 
355
     matching applies to each word separately, for example
 
356
     <TT
 
357
CLASS="LITERAL"
 
358
>foo_bar%*</TT
 
359
> matches <TT
 
360
CLASS="LITERAL"
 
361
>foo1_bar2_baz</TT
 
362
> but
 
363
     not <TT
 
364
CLASS="LITERAL"
 
365
>foo1_br2_baz</TT
 
366
>.
 
367
    </P
 
368
><P
 
369
>     Also, you can write several possibly-modified labels separated with
 
370
     <TT
 
371
CLASS="LITERAL"
 
372
>|</TT
 
373
> (OR) to match any of those labels, and you can put
 
374
     <TT
 
375
CLASS="LITERAL"
 
376
>!</TT
 
377
> (NOT) at the start to match any label that doesn't
 
378
     match any of the alternatives.
 
379
    </P
 
380
><P
 
381
>     Here's an annotated example of <TT
 
382
CLASS="TYPE"
 
383
>lquery</TT
 
384
>:
 
385
</P><PRE
 
386
CLASS="PROGRAMLISTING"
 
387
>Top.*{0,2}.sport*@.!football|tennis.Russ*|Spain
 
388
a.  b.     c.      d.               e.</PRE
 
389
><P>
 
390
     This query will match any label path that:
 
391
    </P
 
392
><P
 
393
></P
 
394
><OL
 
395
TYPE="a"
 
396
><LI
 
397
><P
 
398
>       begins with the label <TT
 
399
CLASS="LITERAL"
 
400
>Top</TT
 
401
>
 
402
      </P
 
403
></LI
 
404
><LI
 
405
><P
 
406
>       and next has zero to two labels before
 
407
      </P
 
408
></LI
 
409
><LI
 
410
><P
 
411
>       a label beginning with the case-insensitive prefix <TT
 
412
CLASS="LITERAL"
 
413
>sport</TT
 
414
>
 
415
      </P
 
416
></LI
 
417
><LI
 
418
><P
 
419
>       then a label not matching <TT
 
420
CLASS="LITERAL"
 
421
>football</TT
 
422
> nor
 
423
       <TT
 
424
CLASS="LITERAL"
 
425
>tennis</TT
 
426
>
 
427
      </P
 
428
></LI
 
429
><LI
 
430
><P
 
431
>       and then ends with a label beginning with <TT
 
432
CLASS="LITERAL"
 
433
>Russ</TT
 
434
> or
 
435
       exactly matching <TT
 
436
CLASS="LITERAL"
 
437
>Spain</TT
 
438
>.
 
439
      </P
 
440
></LI
 
441
></OL
 
442
></LI
 
443
><LI
 
444
><P
 
445
><TT
 
446
CLASS="TYPE"
 
447
>ltxtquery</TT
 
448
> represents a full-text-search-like
 
449
    pattern for matching <TT
 
450
CLASS="TYPE"
 
451
>ltree</TT
 
452
> values.  An
 
453
    <TT
 
454
CLASS="TYPE"
 
455
>ltxtquery</TT
 
456
> value contains words, possibly with the
 
457
    modifiers <TT
 
458
CLASS="LITERAL"
 
459
>@</TT
 
460
>, <TT
 
461
CLASS="LITERAL"
 
462
>*</TT
 
463
>, <TT
 
464
CLASS="LITERAL"
 
465
>%</TT
 
466
> at the end;
 
467
    the modifiers have the same meanings as in <TT
 
468
CLASS="TYPE"
 
469
>lquery</TT
 
470
>.
 
471
    Words can be combined with <TT
 
472
CLASS="LITERAL"
 
473
>&amp;</TT
 
474
> (AND),
 
475
    <TT
 
476
CLASS="LITERAL"
 
477
>|</TT
 
478
> (OR), <TT
 
479
CLASS="LITERAL"
 
480
>!</TT
 
481
> (NOT), and parentheses.
 
482
    The key difference from
 
483
    <TT
 
484
CLASS="TYPE"
 
485
>lquery</TT
 
486
> is that <TT
 
487
CLASS="TYPE"
 
488
>ltxtquery</TT
 
489
> matches words without
 
490
    regard to their position in the label path.
 
491
    </P
 
492
><P
 
493
>     Here's an example <TT
 
494
CLASS="TYPE"
 
495
>ltxtquery</TT
 
496
>:
 
497
</P><PRE
 
498
CLASS="PROGRAMLISTING"
 
499
>Europe &amp; Russia*@ &amp; !Transportation</PRE
 
500
><P>
 
501
     This will match paths that contain the label <TT
 
502
CLASS="LITERAL"
 
503
>Europe</TT
 
504
> and
 
505
     any label beginning with <TT
 
506
CLASS="LITERAL"
 
507
>Russia</TT
 
508
> (case-insensitive),
 
509
     but not paths containing the label <TT
 
510
CLASS="LITERAL"
 
511
>Transportation</TT
 
512
>.
 
513
     The location of these words within the path is not important.
 
514
     Also, when <TT
 
515
CLASS="LITERAL"
 
516
>%</TT
 
517
> is used, the word can be matched to any
 
518
     underscore-separated word within a label, regardless of position.
 
519
    </P
 
520
></LI
 
521
></UL
 
522
><P
 
523
>   Note: <TT
 
524
CLASS="TYPE"
 
525
>ltxtquery</TT
 
526
> allows whitespace between symbols, but
 
527
   <TT
 
528
CLASS="TYPE"
 
529
>ltree</TT
 
530
> and <TT
 
531
CLASS="TYPE"
 
532
>lquery</TT
 
533
> do not.
 
534
  </P
 
535
></DIV
 
536
><DIV
 
537
CLASS="SECT2"
 
538
><H2
 
539
CLASS="SECT2"
 
540
><A
 
541
NAME="AEN131314"
 
542
>F.21.2. Operators and Functions</A
 
543
></H2
 
544
><P
 
545
>   Type <TT
 
546
CLASS="TYPE"
 
547
>ltree</TT
 
548
> has the usual comparison operators
 
549
   <TT
 
550
CLASS="LITERAL"
 
551
>=</TT
 
552
>, <TT
 
553
CLASS="LITERAL"
 
554
>&lt;&gt;</TT
 
555
>,
 
556
   <TT
 
557
CLASS="LITERAL"
 
558
>&lt;</TT
 
559
>, <TT
 
560
CLASS="LITERAL"
 
561
>&gt;</TT
 
562
>, <TT
 
563
CLASS="LITERAL"
 
564
>&lt;=</TT
 
565
>, <TT
 
566
CLASS="LITERAL"
 
567
>&gt;=</TT
 
568
>.
 
569
   Comparison sorts in the order of a tree traversal, with the children
 
570
   of a node sorted by label text.  In addition, there are the following
 
571
   specialized operators:
 
572
  </P
 
573
><DIV
 
574
CLASS="TABLE"
 
575
><A
 
576
NAME="LTREE-OP-TABLE"
 
577
></A
 
578
><P
 
579
><B
 
580
>Table F-12. <TT
 
581
CLASS="TYPE"
 
582
>ltree</TT
 
583
> Operators</B
 
584
></P
 
585
><TABLE
 
586
BORDER="1"
 
587
CLASS="CALSTABLE"
 
588
><COL><COL><COL><THEAD
 
589
><TR
 
590
><TH
 
591
>Operator</TH
 
592
><TH
 
593
>Returns</TH
 
594
><TH
 
595
>Description</TH
 
596
></TR
 
597
></THEAD
 
598
><TBODY
 
599
><TR
 
600
><TD
 
601
><TT
 
602
CLASS="TYPE"
 
603
>ltree</TT
 
604
> <TT
 
605
CLASS="LITERAL"
 
606
>@&gt;</TT
 
607
> <TT
 
608
CLASS="TYPE"
 
609
>ltree</TT
 
610
></TD
 
611
><TD
 
612
><TT
 
613
CLASS="TYPE"
 
614
>boolean</TT
 
615
></TD
 
616
><TD
 
617
>is left argument an ancestor of right (or equal)?</TD
 
618
></TR
 
619
><TR
 
620
><TD
 
621
><TT
 
622
CLASS="TYPE"
 
623
>ltree</TT
 
624
> <TT
 
625
CLASS="LITERAL"
 
626
>&lt;@</TT
 
627
> <TT
 
628
CLASS="TYPE"
 
629
>ltree</TT
 
630
></TD
 
631
><TD
 
632
><TT
 
633
CLASS="TYPE"
 
634
>boolean</TT
 
635
></TD
 
636
><TD
 
637
>is left argument a descendant of right (or equal)?</TD
 
638
></TR
 
639
><TR
 
640
><TD
 
641
><TT
 
642
CLASS="TYPE"
 
643
>ltree</TT
 
644
> <TT
 
645
CLASS="LITERAL"
 
646
>~</TT
 
647
> <TT
 
648
CLASS="TYPE"
 
649
>lquery</TT
 
650
></TD
 
651
><TD
 
652
><TT
 
653
CLASS="TYPE"
 
654
>boolean</TT
 
655
></TD
 
656
><TD
 
657
>does <TT
 
658
CLASS="TYPE"
 
659
>ltree</TT
 
660
> match <TT
 
661
CLASS="TYPE"
 
662
>lquery</TT
 
663
>?</TD
 
664
></TR
 
665
><TR
 
666
><TD
 
667
><TT
 
668
CLASS="TYPE"
 
669
>lquery</TT
 
670
> <TT
 
671
CLASS="LITERAL"
 
672
>~</TT
 
673
> <TT
 
674
CLASS="TYPE"
 
675
>ltree</TT
 
676
></TD
 
677
><TD
 
678
><TT
 
679
CLASS="TYPE"
 
680
>boolean</TT
 
681
></TD
 
682
><TD
 
683
>does <TT
 
684
CLASS="TYPE"
 
685
>ltree</TT
 
686
> match <TT
 
687
CLASS="TYPE"
 
688
>lquery</TT
 
689
>?</TD
 
690
></TR
 
691
><TR
 
692
><TD
 
693
><TT
 
694
CLASS="TYPE"
 
695
>ltree</TT
 
696
> <TT
 
697
CLASS="LITERAL"
 
698
>?</TT
 
699
> <TT
 
700
CLASS="TYPE"
 
701
>lquery[]</TT
 
702
></TD
 
703
><TD
 
704
><TT
 
705
CLASS="TYPE"
 
706
>boolean</TT
 
707
></TD
 
708
><TD
 
709
>does <TT
 
710
CLASS="TYPE"
 
711
>ltree</TT
 
712
> match any <TT
 
713
CLASS="TYPE"
 
714
>lquery</TT
 
715
> in array?</TD
 
716
></TR
 
717
><TR
 
718
><TD
 
719
><TT
 
720
CLASS="TYPE"
 
721
>lquery[]</TT
 
722
> <TT
 
723
CLASS="LITERAL"
 
724
>?</TT
 
725
> <TT
 
726
CLASS="TYPE"
 
727
>ltree</TT
 
728
></TD
 
729
><TD
 
730
><TT
 
731
CLASS="TYPE"
 
732
>boolean</TT
 
733
></TD
 
734
><TD
 
735
>does <TT
 
736
CLASS="TYPE"
 
737
>ltree</TT
 
738
> match any <TT
 
739
CLASS="TYPE"
 
740
>lquery</TT
 
741
> in array?</TD
 
742
></TR
 
743
><TR
 
744
><TD
 
745
><TT
 
746
CLASS="TYPE"
 
747
>ltree</TT
 
748
> <TT
 
749
CLASS="LITERAL"
 
750
>@</TT
 
751
> <TT
 
752
CLASS="TYPE"
 
753
>ltxtquery</TT
 
754
></TD
 
755
><TD
 
756
><TT
 
757
CLASS="TYPE"
 
758
>boolean</TT
 
759
></TD
 
760
><TD
 
761
>does <TT
 
762
CLASS="TYPE"
 
763
>ltree</TT
 
764
> match <TT
 
765
CLASS="TYPE"
 
766
>ltxtquery</TT
 
767
>?</TD
 
768
></TR
 
769
><TR
 
770
><TD
 
771
><TT
 
772
CLASS="TYPE"
 
773
>ltxtquery</TT
 
774
> <TT
 
775
CLASS="LITERAL"
 
776
>@</TT
 
777
> <TT
 
778
CLASS="TYPE"
 
779
>ltree</TT
 
780
></TD
 
781
><TD
 
782
><TT
 
783
CLASS="TYPE"
 
784
>boolean</TT
 
785
></TD
 
786
><TD
 
787
>does <TT
 
788
CLASS="TYPE"
 
789
>ltree</TT
 
790
> match <TT
 
791
CLASS="TYPE"
 
792
>ltxtquery</TT
 
793
>?</TD
 
794
></TR
 
795
><TR
 
796
><TD
 
797
><TT
 
798
CLASS="TYPE"
 
799
>ltree</TT
 
800
> <TT
 
801
CLASS="LITERAL"
 
802
>||</TT
 
803
> <TT
 
804
CLASS="TYPE"
 
805
>ltree</TT
 
806
></TD
 
807
><TD
 
808
><TT
 
809
CLASS="TYPE"
 
810
>ltree</TT
 
811
></TD
 
812
><TD
 
813
>concatenate <TT
 
814
CLASS="TYPE"
 
815
>ltree</TT
 
816
> paths</TD
 
817
></TR
 
818
><TR
 
819
><TD
 
820
><TT
 
821
CLASS="TYPE"
 
822
>ltree</TT
 
823
> <TT
 
824
CLASS="LITERAL"
 
825
>||</TT
 
826
> <TT
 
827
CLASS="TYPE"
 
828
>text</TT
 
829
></TD
 
830
><TD
 
831
><TT
 
832
CLASS="TYPE"
 
833
>ltree</TT
 
834
></TD
 
835
><TD
 
836
>convert text to <TT
 
837
CLASS="TYPE"
 
838
>ltree</TT
 
839
> and concatenate</TD
 
840
></TR
 
841
><TR
 
842
><TD
 
843
><TT
 
844
CLASS="TYPE"
 
845
>text</TT
 
846
> <TT
 
847
CLASS="LITERAL"
 
848
>||</TT
 
849
> <TT
 
850
CLASS="TYPE"
 
851
>ltree</TT
 
852
></TD
 
853
><TD
 
854
><TT
 
855
CLASS="TYPE"
 
856
>ltree</TT
 
857
></TD
 
858
><TD
 
859
>convert text to <TT
 
860
CLASS="TYPE"
 
861
>ltree</TT
 
862
> and concatenate</TD
 
863
></TR
 
864
><TR
 
865
><TD
 
866
><TT
 
867
CLASS="TYPE"
 
868
>ltree[]</TT
 
869
> <TT
 
870
CLASS="LITERAL"
 
871
>@&gt;</TT
 
872
> <TT
 
873
CLASS="TYPE"
 
874
>ltree</TT
 
875
></TD
 
876
><TD
 
877
><TT
 
878
CLASS="TYPE"
 
879
>boolean</TT
 
880
></TD
 
881
><TD
 
882
>does array contain an ancestor of <TT
 
883
CLASS="TYPE"
 
884
>ltree</TT
 
885
>?</TD
 
886
></TR
 
887
><TR
 
888
><TD
 
889
><TT
 
890
CLASS="TYPE"
 
891
>ltree</TT
 
892
> <TT
 
893
CLASS="LITERAL"
 
894
>&lt;@</TT
 
895
> <TT
 
896
CLASS="TYPE"
 
897
>ltree[]</TT
 
898
></TD
 
899
><TD
 
900
><TT
 
901
CLASS="TYPE"
 
902
>boolean</TT
 
903
></TD
 
904
><TD
 
905
>does array contain an ancestor of <TT
 
906
CLASS="TYPE"
 
907
>ltree</TT
 
908
>?</TD
 
909
></TR
 
910
><TR
 
911
><TD
 
912
><TT
 
913
CLASS="TYPE"
 
914
>ltree[]</TT
 
915
> <TT
 
916
CLASS="LITERAL"
 
917
>&lt;@</TT
 
918
> <TT
 
919
CLASS="TYPE"
 
920
>ltree</TT
 
921
></TD
 
922
><TD
 
923
><TT
 
924
CLASS="TYPE"
 
925
>boolean</TT
 
926
></TD
 
927
><TD
 
928
>does array contain a descendant of <TT
 
929
CLASS="TYPE"
 
930
>ltree</TT
 
931
>?</TD
 
932
></TR
 
933
><TR
 
934
><TD
 
935
><TT
 
936
CLASS="TYPE"
 
937
>ltree</TT
 
938
> <TT
 
939
CLASS="LITERAL"
 
940
>@&gt;</TT
 
941
> <TT
 
942
CLASS="TYPE"
 
943
>ltree[]</TT
 
944
></TD
 
945
><TD
 
946
><TT
 
947
CLASS="TYPE"
 
948
>boolean</TT
 
949
></TD
 
950
><TD
 
951
>does array contain a descendant of <TT
 
952
CLASS="TYPE"
 
953
>ltree</TT
 
954
>?</TD
 
955
></TR
 
956
><TR
 
957
><TD
 
958
><TT
 
959
CLASS="TYPE"
 
960
>ltree[]</TT
 
961
> <TT
 
962
CLASS="LITERAL"
 
963
>~</TT
 
964
> <TT
 
965
CLASS="TYPE"
 
966
>lquery</TT
 
967
></TD
 
968
><TD
 
969
><TT
 
970
CLASS="TYPE"
 
971
>boolean</TT
 
972
></TD
 
973
><TD
 
974
>does array contain any path matching <TT
 
975
CLASS="TYPE"
 
976
>lquery</TT
 
977
>?</TD
 
978
></TR
 
979
><TR
 
980
><TD
 
981
><TT
 
982
CLASS="TYPE"
 
983
>lquery</TT
 
984
> <TT
 
985
CLASS="LITERAL"
 
986
>~</TT
 
987
> <TT
 
988
CLASS="TYPE"
 
989
>ltree[]</TT
 
990
></TD
 
991
><TD
 
992
><TT
 
993
CLASS="TYPE"
 
994
>boolean</TT
 
995
></TD
 
996
><TD
 
997
>does array contain any path matching <TT
 
998
CLASS="TYPE"
 
999
>lquery</TT
 
1000
>?</TD
 
1001
></TR
 
1002
><TR
 
1003
><TD
 
1004
><TT
 
1005
CLASS="TYPE"
 
1006
>ltree[]</TT
 
1007
> <TT
 
1008
CLASS="LITERAL"
 
1009
>?</TT
 
1010
> <TT
 
1011
CLASS="TYPE"
 
1012
>lquery[]</TT
 
1013
></TD
 
1014
><TD
 
1015
><TT
 
1016
CLASS="TYPE"
 
1017
>boolean</TT
 
1018
></TD
 
1019
><TD
 
1020
>does <TT
 
1021
CLASS="TYPE"
 
1022
>ltree</TT
 
1023
> array contain any path matching any <TT
 
1024
CLASS="TYPE"
 
1025
>lquery</TT
 
1026
>?</TD
 
1027
></TR
 
1028
><TR
 
1029
><TD
 
1030
><TT
 
1031
CLASS="TYPE"
 
1032
>lquery[]</TT
 
1033
> <TT
 
1034
CLASS="LITERAL"
 
1035
>?</TT
 
1036
> <TT
 
1037
CLASS="TYPE"
 
1038
>ltree[]</TT
 
1039
></TD
 
1040
><TD
 
1041
><TT
 
1042
CLASS="TYPE"
 
1043
>boolean</TT
 
1044
></TD
 
1045
><TD
 
1046
>does <TT
 
1047
CLASS="TYPE"
 
1048
>ltree</TT
 
1049
> array contain any path matching any <TT
 
1050
CLASS="TYPE"
 
1051
>lquery</TT
 
1052
>?</TD
 
1053
></TR
 
1054
><TR
 
1055
><TD
 
1056
><TT
 
1057
CLASS="TYPE"
 
1058
>ltree[]</TT
 
1059
> <TT
 
1060
CLASS="LITERAL"
 
1061
>@</TT
 
1062
> <TT
 
1063
CLASS="TYPE"
 
1064
>ltxtquery</TT
 
1065
></TD
 
1066
><TD
 
1067
><TT
 
1068
CLASS="TYPE"
 
1069
>boolean</TT
 
1070
></TD
 
1071
><TD
 
1072
>does array contain any path matching <TT
 
1073
CLASS="TYPE"
 
1074
>ltxtquery</TT
 
1075
>?</TD
 
1076
></TR
 
1077
><TR
 
1078
><TD
 
1079
><TT
 
1080
CLASS="TYPE"
 
1081
>ltxtquery</TT
 
1082
> <TT
 
1083
CLASS="LITERAL"
 
1084
>@</TT
 
1085
> <TT
 
1086
CLASS="TYPE"
 
1087
>ltree[]</TT
 
1088
></TD
 
1089
><TD
 
1090
><TT
 
1091
CLASS="TYPE"
 
1092
>boolean</TT
 
1093
></TD
 
1094
><TD
 
1095
>does array contain any path matching <TT
 
1096
CLASS="TYPE"
 
1097
>ltxtquery</TT
 
1098
>?</TD
 
1099
></TR
 
1100
><TR
 
1101
><TD
 
1102
><TT
 
1103
CLASS="TYPE"
 
1104
>ltree[]</TT
 
1105
> <TT
 
1106
CLASS="LITERAL"
 
1107
>?@&gt;</TT
 
1108
> <TT
 
1109
CLASS="TYPE"
 
1110
>ltree</TT
 
1111
></TD
 
1112
><TD
 
1113
><TT
 
1114
CLASS="TYPE"
 
1115
>ltree</TT
 
1116
></TD
 
1117
><TD
 
1118
>first array entry that is an ancestor of <TT
 
1119
CLASS="TYPE"
 
1120
>ltree</TT
 
1121
>; NULL if none</TD
 
1122
></TR
 
1123
><TR
 
1124
><TD
 
1125
><TT
 
1126
CLASS="TYPE"
 
1127
>ltree[]</TT
 
1128
> <TT
 
1129
CLASS="LITERAL"
 
1130
>?&lt;@</TT
 
1131
> <TT
 
1132
CLASS="TYPE"
 
1133
>ltree</TT
 
1134
></TD
 
1135
><TD
 
1136
><TT
 
1137
CLASS="TYPE"
 
1138
>ltree</TT
 
1139
></TD
 
1140
><TD
 
1141
>first array entry that is a descendant of <TT
 
1142
CLASS="TYPE"
 
1143
>ltree</TT
 
1144
>; NULL if none</TD
 
1145
></TR
 
1146
><TR
 
1147
><TD
 
1148
><TT
 
1149
CLASS="TYPE"
 
1150
>ltree[]</TT
 
1151
> <TT
 
1152
CLASS="LITERAL"
 
1153
>?~</TT
 
1154
> <TT
 
1155
CLASS="TYPE"
 
1156
>lquery</TT
 
1157
></TD
 
1158
><TD
 
1159
><TT
 
1160
CLASS="TYPE"
 
1161
>ltree</TT
 
1162
></TD
 
1163
><TD
 
1164
>first array entry that matches <TT
 
1165
CLASS="TYPE"
 
1166
>lquery</TT
 
1167
>; NULL if none</TD
 
1168
></TR
 
1169
><TR
 
1170
><TD
 
1171
><TT
 
1172
CLASS="TYPE"
 
1173
>ltree[]</TT
 
1174
> <TT
 
1175
CLASS="LITERAL"
 
1176
>?@</TT
 
1177
> <TT
 
1178
CLASS="TYPE"
 
1179
>ltxtquery</TT
 
1180
></TD
 
1181
><TD
 
1182
><TT
 
1183
CLASS="TYPE"
 
1184
>ltree</TT
 
1185
></TD
 
1186
><TD
 
1187
>first array entry that matches <TT
 
1188
CLASS="TYPE"
 
1189
>ltxtquery</TT
 
1190
>; NULL if none</TD
 
1191
></TR
 
1192
></TBODY
 
1193
></TABLE
 
1194
></DIV
 
1195
><P
 
1196
>   The operators <TT
 
1197
CLASS="LITERAL"
 
1198
>&lt;@</TT
 
1199
>, <TT
 
1200
CLASS="LITERAL"
 
1201
>@&gt;</TT
 
1202
>,
 
1203
   <TT
 
1204
CLASS="LITERAL"
 
1205
>@</TT
 
1206
> and <TT
 
1207
CLASS="LITERAL"
 
1208
>~</TT
 
1209
> have analogues
 
1210
   <TT
 
1211
CLASS="LITERAL"
 
1212
>^&lt;@</TT
 
1213
>, <TT
 
1214
CLASS="LITERAL"
 
1215
>^@&gt;</TT
 
1216
>, <TT
 
1217
CLASS="LITERAL"
 
1218
>^@</TT
 
1219
>,
 
1220
   <TT
 
1221
CLASS="LITERAL"
 
1222
>^~</TT
 
1223
>, which are the same except they do not use
 
1224
   indexes.  These are useful only for testing purposes.
 
1225
  </P
 
1226
><P
 
1227
>   The following functions are available:
 
1228
  </P
 
1229
><DIV
 
1230
CLASS="TABLE"
 
1231
><A
 
1232
NAME="LTREE-FUNC-TABLE"
 
1233
></A
 
1234
><P
 
1235
><B
 
1236
>Table F-13. <TT
 
1237
CLASS="TYPE"
 
1238
>ltree</TT
 
1239
> Functions</B
 
1240
></P
 
1241
><TABLE
 
1242
BORDER="1"
 
1243
CLASS="CALSTABLE"
 
1244
><COL><COL><COL><COL><COL><THEAD
 
1245
><TR
 
1246
><TH
 
1247
>Function</TH
 
1248
><TH
 
1249
>Return Type</TH
 
1250
><TH
 
1251
>Description</TH
 
1252
><TH
 
1253
>Example</TH
 
1254
><TH
 
1255
>Result</TH
 
1256
></TR
 
1257
></THEAD
 
1258
><TBODY
 
1259
><TR
 
1260
><TD
 
1261
><CODE
 
1262
CLASS="FUNCTION"
 
1263
>subltree(ltree, int start, int end)</CODE
 
1264
></TD
 
1265
><TD
 
1266
><TT
 
1267
CLASS="TYPE"
 
1268
>ltree</TT
 
1269
></TD
 
1270
><TD
 
1271
>subpath of <TT
 
1272
CLASS="TYPE"
 
1273
>ltree</TT
 
1274
> from position <TT
 
1275
CLASS="PARAMETER"
 
1276
>start</TT
 
1277
> to
 
1278
       position <TT
 
1279
CLASS="PARAMETER"
 
1280
>end</TT
 
1281
>-1 (counting from 0)</TD
 
1282
><TD
 
1283
><TT
 
1284
CLASS="LITERAL"
 
1285
>subltree('Top.Child1.Child2',1,2)</TT
 
1286
></TD
 
1287
><TD
 
1288
><TT
 
1289
CLASS="LITERAL"
 
1290
>Child1</TT
 
1291
></TD
 
1292
></TR
 
1293
><TR
 
1294
><TD
 
1295
><CODE
 
1296
CLASS="FUNCTION"
 
1297
>subpath(ltree, int offset, int len)</CODE
 
1298
></TD
 
1299
><TD
 
1300
><TT
 
1301
CLASS="TYPE"
 
1302
>ltree</TT
 
1303
></TD
 
1304
><TD
 
1305
>subpath of <TT
 
1306
CLASS="TYPE"
 
1307
>ltree</TT
 
1308
> starting at position
 
1309
       <TT
 
1310
CLASS="PARAMETER"
 
1311
>offset</TT
 
1312
>, length <TT
 
1313
CLASS="PARAMETER"
 
1314
>len</TT
 
1315
>.
 
1316
       If <TT
 
1317
CLASS="PARAMETER"
 
1318
>offset</TT
 
1319
> is negative, subpath starts that far from the
 
1320
       end of the path.  If <TT
 
1321
CLASS="PARAMETER"
 
1322
>len</TT
 
1323
> is negative, leaves that many
 
1324
       labels off the end of the path.</TD
 
1325
><TD
 
1326
><TT
 
1327
CLASS="LITERAL"
 
1328
>subpath('Top.Child1.Child2',0,2)</TT
 
1329
></TD
 
1330
><TD
 
1331
><TT
 
1332
CLASS="LITERAL"
 
1333
>Top.Child1</TT
 
1334
></TD
 
1335
></TR
 
1336
><TR
 
1337
><TD
 
1338
><CODE
 
1339
CLASS="FUNCTION"
 
1340
>subpath(ltree, int offset)</CODE
 
1341
></TD
 
1342
><TD
 
1343
><TT
 
1344
CLASS="TYPE"
 
1345
>ltree</TT
 
1346
></TD
 
1347
><TD
 
1348
>subpath of <TT
 
1349
CLASS="TYPE"
 
1350
>ltree</TT
 
1351
> starting at position
 
1352
       <TT
 
1353
CLASS="PARAMETER"
 
1354
>offset</TT
 
1355
>, extending to end of path.
 
1356
       If <TT
 
1357
CLASS="PARAMETER"
 
1358
>offset</TT
 
1359
> is negative, subpath starts that far from the
 
1360
       end of the path.</TD
 
1361
><TD
 
1362
><TT
 
1363
CLASS="LITERAL"
 
1364
>subpath('Top.Child1.Child2',1)</TT
 
1365
></TD
 
1366
><TD
 
1367
><TT
 
1368
CLASS="LITERAL"
 
1369
>Child1.Child2</TT
 
1370
></TD
 
1371
></TR
 
1372
><TR
 
1373
><TD
 
1374
><CODE
 
1375
CLASS="FUNCTION"
 
1376
>nlevel(ltree)</CODE
 
1377
></TD
 
1378
><TD
 
1379
><TT
 
1380
CLASS="TYPE"
 
1381
>integer</TT
 
1382
></TD
 
1383
><TD
 
1384
>number of labels in path</TD
 
1385
><TD
 
1386
><TT
 
1387
CLASS="LITERAL"
 
1388
>nlevel('Top.Child1.Child2')</TT
 
1389
></TD
 
1390
><TD
 
1391
><TT
 
1392
CLASS="LITERAL"
 
1393
>3</TT
 
1394
></TD
 
1395
></TR
 
1396
><TR
 
1397
><TD
 
1398
><CODE
 
1399
CLASS="FUNCTION"
 
1400
>index(ltree a, ltree b)</CODE
 
1401
></TD
 
1402
><TD
 
1403
><TT
 
1404
CLASS="TYPE"
 
1405
>integer</TT
 
1406
></TD
 
1407
><TD
 
1408
>position of first occurrence of <TT
 
1409
CLASS="PARAMETER"
 
1410
>b</TT
 
1411
> in
 
1412
       <TT
 
1413
CLASS="PARAMETER"
 
1414
>a</TT
 
1415
>; -1 if not found</TD
 
1416
><TD
 
1417
><TT
 
1418
CLASS="LITERAL"
 
1419
>index('0.1.2.3.5.4.5.6.8.5.6.8','5.6')</TT
 
1420
></TD
 
1421
><TD
 
1422
><TT
 
1423
CLASS="LITERAL"
 
1424
>6</TT
 
1425
></TD
 
1426
></TR
 
1427
><TR
 
1428
><TD
 
1429
><CODE
 
1430
CLASS="FUNCTION"
 
1431
>index(ltree a, ltree b, int offset)</CODE
 
1432
></TD
 
1433
><TD
 
1434
><TT
 
1435
CLASS="TYPE"
 
1436
>integer</TT
 
1437
></TD
 
1438
><TD
 
1439
>position of first occurrence of <TT
 
1440
CLASS="PARAMETER"
 
1441
>b</TT
 
1442
> in
 
1443
       <TT
 
1444
CLASS="PARAMETER"
 
1445
>a</TT
 
1446
>, searching starting at <TT
 
1447
CLASS="PARAMETER"
 
1448
>offset</TT
 
1449
>;
 
1450
       negative <TT
 
1451
CLASS="PARAMETER"
 
1452
>offset</TT
 
1453
> means start <TT
 
1454
CLASS="PARAMETER"
 
1455
>-offset</TT
 
1456
>
 
1457
       labels from the end of the path</TD
 
1458
><TD
 
1459
><TT
 
1460
CLASS="LITERAL"
 
1461
>index('0.1.2.3.5.4.5.6.8.5.6.8','5.6',-4)</TT
 
1462
></TD
 
1463
><TD
 
1464
><TT
 
1465
CLASS="LITERAL"
 
1466
>9</TT
 
1467
></TD
 
1468
></TR
 
1469
><TR
 
1470
><TD
 
1471
><CODE
 
1472
CLASS="FUNCTION"
 
1473
>text2ltree(text)</CODE
 
1474
></TD
 
1475
><TD
 
1476
><TT
 
1477
CLASS="TYPE"
 
1478
>ltree</TT
 
1479
></TD
 
1480
><TD
 
1481
>cast <TT
 
1482
CLASS="TYPE"
 
1483
>text</TT
 
1484
> to <TT
 
1485
CLASS="TYPE"
 
1486
>ltree</TT
 
1487
></TD
 
1488
><TD
 
1489
><TT
 
1490
CLASS="LITERAL"
 
1491
></TT
 
1492
></TD
 
1493
><TD
 
1494
><TT
 
1495
CLASS="LITERAL"
 
1496
></TT
 
1497
></TD
 
1498
></TR
 
1499
><TR
 
1500
><TD
 
1501
><CODE
 
1502
CLASS="FUNCTION"
 
1503
>ltree2text(ltree)</CODE
 
1504
></TD
 
1505
><TD
 
1506
><TT
 
1507
CLASS="TYPE"
 
1508
>text</TT
 
1509
></TD
 
1510
><TD
 
1511
>cast <TT
 
1512
CLASS="TYPE"
 
1513
>ltree</TT
 
1514
> to <TT
 
1515
CLASS="TYPE"
 
1516
>text</TT
 
1517
></TD
 
1518
><TD
 
1519
><TT
 
1520
CLASS="LITERAL"
 
1521
></TT
 
1522
></TD
 
1523
><TD
 
1524
><TT
 
1525
CLASS="LITERAL"
 
1526
></TT
 
1527
></TD
 
1528
></TR
 
1529
><TR
 
1530
><TD
 
1531
><CODE
 
1532
CLASS="FUNCTION"
 
1533
>lca(ltree, ltree, ...)</CODE
 
1534
></TD
 
1535
><TD
 
1536
><TT
 
1537
CLASS="TYPE"
 
1538
>ltree</TT
 
1539
></TD
 
1540
><TD
 
1541
>lowest common ancestor, i.e., longest common prefix of paths
 
1542
       (up to 8 arguments supported)</TD
 
1543
><TD
 
1544
><TT
 
1545
CLASS="LITERAL"
 
1546
>lca('1.2.2.3','1.2.3.4.5.6')</TT
 
1547
></TD
 
1548
><TD
 
1549
><TT
 
1550
CLASS="LITERAL"
 
1551
>1.2</TT
 
1552
></TD
 
1553
></TR
 
1554
><TR
 
1555
><TD
 
1556
><CODE
 
1557
CLASS="FUNCTION"
 
1558
>lca(ltree[])</CODE
 
1559
></TD
 
1560
><TD
 
1561
><TT
 
1562
CLASS="TYPE"
 
1563
>ltree</TT
 
1564
></TD
 
1565
><TD
 
1566
>lowest common ancestor, i.e., longest common prefix of paths</TD
 
1567
><TD
 
1568
><TT
 
1569
CLASS="LITERAL"
 
1570
>lca(array['1.2.2.3'::ltree,'1.2.3'])</TT
 
1571
></TD
 
1572
><TD
 
1573
><TT
 
1574
CLASS="LITERAL"
 
1575
>1.2</TT
 
1576
></TD
 
1577
></TR
 
1578
></TBODY
 
1579
></TABLE
 
1580
></DIV
 
1581
></DIV
 
1582
><DIV
 
1583
CLASS="SECT2"
 
1584
><H2
 
1585
CLASS="SECT2"
 
1586
><A
 
1587
NAME="AEN131709"
 
1588
>F.21.3. Indexes</A
 
1589
></H2
 
1590
><P
 
1591
>   <TT
 
1592
CLASS="FILENAME"
 
1593
>ltree</TT
 
1594
> supports several types of indexes that can speed
 
1595
   up the indicated operators:
 
1596
  </P
 
1597
><P
 
1598
></P
 
1599
><UL
 
1600
><LI
 
1601
><P
 
1602
>     B-tree index over <TT
 
1603
CLASS="TYPE"
 
1604
>ltree</TT
 
1605
>:
 
1606
     <TT
 
1607
CLASS="LITERAL"
 
1608
>&lt;</TT
 
1609
>, <TT
 
1610
CLASS="LITERAL"
 
1611
>&lt;=</TT
 
1612
>, <TT
 
1613
CLASS="LITERAL"
 
1614
>=</TT
 
1615
>,
 
1616
     <TT
 
1617
CLASS="LITERAL"
 
1618
>&gt;=</TT
 
1619
>, <TT
 
1620
CLASS="LITERAL"
 
1621
>&gt;</TT
 
1622
>
 
1623
    </P
 
1624
></LI
 
1625
><LI
 
1626
><P
 
1627
>     GiST index over <TT
 
1628
CLASS="TYPE"
 
1629
>ltree</TT
 
1630
>:
 
1631
     <TT
 
1632
CLASS="LITERAL"
 
1633
>&lt;</TT
 
1634
>, <TT
 
1635
CLASS="LITERAL"
 
1636
>&lt;=</TT
 
1637
>, <TT
 
1638
CLASS="LITERAL"
 
1639
>=</TT
 
1640
>,
 
1641
     <TT
 
1642
CLASS="LITERAL"
 
1643
>&gt;=</TT
 
1644
>, <TT
 
1645
CLASS="LITERAL"
 
1646
>&gt;</TT
 
1647
>,
 
1648
     <TT
 
1649
CLASS="LITERAL"
 
1650
>@&gt;</TT
 
1651
>, <TT
 
1652
CLASS="LITERAL"
 
1653
>&lt;@</TT
 
1654
>,
 
1655
     <TT
 
1656
CLASS="LITERAL"
 
1657
>@</TT
 
1658
>, <TT
 
1659
CLASS="LITERAL"
 
1660
>~</TT
 
1661
>, <TT
 
1662
CLASS="LITERAL"
 
1663
>?</TT
 
1664
>
 
1665
    </P
 
1666
><P
 
1667
>     Example of creating such an index:
 
1668
    </P
 
1669
><PRE
 
1670
CLASS="PROGRAMLISTING"
 
1671
>CREATE INDEX path_gist_idx ON test USING GIST (path);</PRE
 
1672
></LI
 
1673
><LI
 
1674
><P
 
1675
>     GiST index over <TT
 
1676
CLASS="TYPE"
 
1677
>ltree[]</TT
 
1678
>:
 
1679
     <TT
 
1680
CLASS="LITERAL"
 
1681
>ltree[] &lt;@ ltree</TT
 
1682
>, <TT
 
1683
CLASS="LITERAL"
 
1684
>ltree @&gt; ltree[]</TT
 
1685
>,
 
1686
     <TT
 
1687
CLASS="LITERAL"
 
1688
>@</TT
 
1689
>, <TT
 
1690
CLASS="LITERAL"
 
1691
>~</TT
 
1692
>, <TT
 
1693
CLASS="LITERAL"
 
1694
>?</TT
 
1695
>
 
1696
    </P
 
1697
><P
 
1698
>     Example of creating such an index:
 
1699
    </P
 
1700
><PRE
 
1701
CLASS="PROGRAMLISTING"
 
1702
>CREATE INDEX path_gist_idx ON test USING GIST (array_path);</PRE
 
1703
><P
 
1704
>     Note: This index type is lossy.
 
1705
    </P
 
1706
></LI
 
1707
></UL
 
1708
></DIV
 
1709
><DIV
 
1710
CLASS="SECT2"
 
1711
><H2
 
1712
CLASS="SECT2"
 
1713
><A
 
1714
NAME="AEN131748"
 
1715
>F.21.4. Example</A
 
1716
></H2
 
1717
><P
 
1718
>   This example uses the following data (also available in file
 
1719
   <TT
 
1720
CLASS="FILENAME"
 
1721
>contrib/ltree/ltreetest.sql</TT
 
1722
> in the source distribution):
 
1723
  </P
 
1724
><PRE
 
1725
CLASS="PROGRAMLISTING"
 
1726
>CREATE TABLE test (path ltree);
 
1727
INSERT INTO test VALUES ('Top');
 
1728
INSERT INTO test VALUES ('Top.Science');
 
1729
INSERT INTO test VALUES ('Top.Science.Astronomy');
 
1730
INSERT INTO test VALUES ('Top.Science.Astronomy.Astrophysics');
 
1731
INSERT INTO test VALUES ('Top.Science.Astronomy.Cosmology');
 
1732
INSERT INTO test VALUES ('Top.Hobbies');
 
1733
INSERT INTO test VALUES ('Top.Hobbies.Amateurs_Astronomy');
 
1734
INSERT INTO test VALUES ('Top.Collections');
 
1735
INSERT INTO test VALUES ('Top.Collections.Pictures');
 
1736
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy');
 
1737
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Stars');
 
1738
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Galaxies');
 
1739
INSERT INTO test VALUES ('Top.Collections.Pictures.Astronomy.Astronauts');
 
1740
CREATE INDEX path_gist_idx ON test USING gist(path);
 
1741
CREATE INDEX path_idx ON test USING btree(path);</PRE
 
1742
><P
 
1743
>   Now, we have a table <TT
 
1744
CLASS="STRUCTNAME"
 
1745
>test</TT
 
1746
> populated with data describing
 
1747
   the hierarchy shown below:
 
1748
  </P
 
1749
><PRE
 
1750
CLASS="LITERALLAYOUT"
 
1751
>                        Top
 
1752
                     /   |  \
 
1753
             Science Hobbies Collections
 
1754
                 /       |              \
 
1755
        Astronomy   Amateurs_Astronomy Pictures
 
1756
           /  \                            |
 
1757
Astrophysics  Cosmology                Astronomy
 
1758
                                        /  |    \
 
1759
                                 Galaxies Stars Astronauts</PRE
 
1760
><P
 
1761
>   We can do inheritance:
 
1762
</P><PRE
 
1763
CLASS="SCREEN"
 
1764
>ltreetest=&gt; SELECT path FROM test WHERE path &lt;@ 'Top.Science';
 
1765
                path
 
1766
------------------------------------
 
1767
 Top.Science
 
1768
 Top.Science.Astronomy
 
1769
 Top.Science.Astronomy.Astrophysics
 
1770
 Top.Science.Astronomy.Cosmology
 
1771
(4 rows)</PRE
 
1772
><P>
 
1773
  </P
 
1774
><P
 
1775
>   Here are some examples of path matching:
 
1776
</P><PRE
 
1777
CLASS="SCREEN"
 
1778
>ltreetest=&gt; SELECT path FROM test WHERE path ~ '*.Astronomy.*';
 
1779
                     path
 
1780
-----------------------------------------------
 
1781
 Top.Science.Astronomy
 
1782
 Top.Science.Astronomy.Astrophysics
 
1783
 Top.Science.Astronomy.Cosmology
 
1784
 Top.Collections.Pictures.Astronomy
 
1785
 Top.Collections.Pictures.Astronomy.Stars
 
1786
 Top.Collections.Pictures.Astronomy.Galaxies
 
1787
 Top.Collections.Pictures.Astronomy.Astronauts
 
1788
(7 rows)
 
1789
 
 
1790
ltreetest=&gt; SELECT path FROM test WHERE path ~ '*.!pictures@.*.Astronomy.*';
 
1791
                path
 
1792
------------------------------------
 
1793
 Top.Science.Astronomy
 
1794
 Top.Science.Astronomy.Astrophysics
 
1795
 Top.Science.Astronomy.Cosmology
 
1796
(3 rows)</PRE
 
1797
><P>
 
1798
  </P
 
1799
><P
 
1800
>   Here are some examples of full text search:
 
1801
</P><PRE
 
1802
CLASS="SCREEN"
 
1803
>ltreetest=&gt; SELECT path FROM test WHERE path @ 'Astro*% &amp; !pictures@';
 
1804
                path
 
1805
------------------------------------
 
1806
 Top.Science.Astronomy
 
1807
 Top.Science.Astronomy.Astrophysics
 
1808
 Top.Science.Astronomy.Cosmology
 
1809
 Top.Hobbies.Amateurs_Astronomy
 
1810
(4 rows)
 
1811
 
 
1812
ltreetest=&gt; SELECT path FROM test WHERE path @ 'Astro* &amp; !pictures@';
 
1813
                path
 
1814
------------------------------------
 
1815
 Top.Science.Astronomy
 
1816
 Top.Science.Astronomy.Astrophysics
 
1817
 Top.Science.Astronomy.Cosmology
 
1818
(3 rows)</PRE
 
1819
><P>
 
1820
  </P
 
1821
><P
 
1822
>   Path construction using functions:
 
1823
</P><PRE
 
1824
CLASS="SCREEN"
 
1825
>ltreetest=&gt; SELECT subpath(path,0,2)||'Space'||subpath(path,2) FROM test WHERE path &lt;@ 'Top.Science.Astronomy';
 
1826
                 ?column?
 
1827
------------------------------------------
 
1828
 Top.Science.Space.Astronomy
 
1829
 Top.Science.Space.Astronomy.Astrophysics
 
1830
 Top.Science.Space.Astronomy.Cosmology
 
1831
(3 rows)</PRE
 
1832
><P>
 
1833
  </P
 
1834
><P
 
1835
>   We could simplify this by creating a SQL function that inserts a label
 
1836
   at a specified position in a path:
 
1837
</P><PRE
 
1838
CLASS="SCREEN"
 
1839
>CREATE FUNCTION ins_label(ltree, int, text) RETURNS ltree
 
1840
    AS 'select subpath($1,0,$2) || $3 || subpath($1,$2);'
 
1841
    LANGUAGE SQL IMMUTABLE;
 
1842
 
 
1843
ltreetest=&gt; SELECT ins_label(path,2,'Space') FROM test WHERE path &lt;@ 'Top.Science.Astronomy';
 
1844
                ins_label
 
1845
------------------------------------------
 
1846
 Top.Science.Space.Astronomy
 
1847
 Top.Science.Space.Astronomy.Astrophysics
 
1848
 Top.Science.Space.Astronomy.Cosmology
 
1849
(3 rows)</PRE
 
1850
><P>
 
1851
  </P
 
1852
></DIV
 
1853
><DIV
 
1854
CLASS="SECT2"
 
1855
><H2
 
1856
CLASS="SECT2"
 
1857
><A
 
1858
NAME="AEN131766"
 
1859
>F.21.5. Authors</A
 
1860
></H2
 
1861
><P
 
1862
>   All work was done by Teodor Sigaev (<CODE
 
1863
CLASS="EMAIL"
 
1864
>&#60;<A
 
1865
HREF="mailto:teodor@stack.net"
 
1866
>teodor@stack.net</A
 
1867
>&#62;</CODE
 
1868
>) and
 
1869
   Oleg Bartunov (<CODE
 
1870
CLASS="EMAIL"
 
1871
>&#60;<A
 
1872
HREF="mailto:oleg@sai.msu.su"
 
1873
>oleg@sai.msu.su</A
 
1874
>&#62;</CODE
 
1875
>). See
 
1876
   <A
 
1877
HREF="http://www.sai.msu.su/~megera/postgres/gist/"
 
1878
TARGET="_top"
 
1879
>http://www.sai.msu.su/~megera/postgres/gist/</A
 
1880
> for
 
1881
   additional information. Authors would like to thank Eugeny Rodichev for
 
1882
   helpful discussions. Comments and bug reports are welcome.
 
1883
  </P
 
1884
></DIV
 
1885
></DIV
 
1886
><DIV
 
1887
CLASS="NAVFOOTER"
 
1888
><HR
 
1889
ALIGN="LEFT"
 
1890
WIDTH="100%"><TABLE
 
1891
SUMMARY="Footer navigation table"
 
1892
WIDTH="100%"
 
1893
BORDER="0"
 
1894
CELLPADDING="0"
 
1895
CELLSPACING="0"
 
1896
><TR
 
1897
><TD
 
1898
WIDTH="33%"
 
1899
ALIGN="left"
 
1900
VALIGN="top"
 
1901
><A
 
1902
HREF="lo.html"
 
1903
ACCESSKEY="P"
 
1904
>Prev</A
 
1905
></TD
 
1906
><TD
 
1907
WIDTH="34%"
 
1908
ALIGN="center"
 
1909
VALIGN="top"
 
1910
><A
 
1911
HREF="index.html"
 
1912
ACCESSKEY="H"
 
1913
>Home</A
 
1914
></TD
 
1915
><TD
 
1916
WIDTH="33%"
 
1917
ALIGN="right"
 
1918
VALIGN="top"
 
1919
><A
 
1920
HREF="oid2name.html"
 
1921
ACCESSKEY="N"
 
1922
>Next</A
 
1923
></TD
 
1924
></TR
 
1925
><TR
 
1926
><TD
 
1927
WIDTH="33%"
 
1928
ALIGN="left"
 
1929
VALIGN="top"
 
1930
>lo</TD
 
1931
><TD
 
1932
WIDTH="34%"
 
1933
ALIGN="center"
 
1934
VALIGN="top"
 
1935
><A
 
1936
HREF="contrib.html"
 
1937
ACCESSKEY="U"
 
1938
>Up</A
 
1939
></TD
 
1940
><TD
 
1941
WIDTH="33%"
 
1942
ALIGN="right"
 
1943
VALIGN="top"
 
1944
>oid2name</TD
 
1945
></TR
 
1946
></TABLE
 
1947
></DIV
 
1948
></BODY
 
1949
></HTML
 
1950
>
 
 
b'\\ No newline at end of file'