]> granicus.if.org Git - postgresql/commitdiff
Please apply patches for contrib/ltree.
authorBruce Momjian <bruce@momjian.us>
Wed, 19 Feb 2003 03:50:49 +0000 (03:50 +0000)
committerBruce Momjian <bruce@momjian.us>
Wed, 19 Feb 2003 03:50:49 +0000 (03:50 +0000)
ltree_73.patch.gz - for 7.3 :
        Fix ~ operation bug: eg '1.1.1' ~ '*.1'

ltree_74.patch.gz - for current CVS
    Fix ~ operation bug: eg '1.1.1' ~ '*.1'
    Add ? operation
    Optimize index storage

Last change needs drop/create all ltree indexes, so only for 7.4

Teodor Sigaev

contrib/ltree/README.ltree
contrib/ltree/expected/ltree.out
contrib/ltree/lquery_op.c

index a23f7b0945875e566a530190de50662472c93081..08735f95d58cc9c62af7f27a7fd2dceae1bc37f8 100644 (file)
@@ -426,6 +426,8 @@ appreciate your input. So far, below some (rather obvious) results:
 
 CHANGES
 
+Feb 7, 2003
+   Fix ~ operation bug: eg '1.1.1' ~ '*.1'
 Aug 9, 2002
    Fixed very stupid but important bug :-)
 July 31, 2002
index 1b6526c5e9c29e0671ad982bf80b03e3a628349e..d78d67c3ad06bd2db8957a06f936e34ce0e1a135 100644 (file)
@@ -3071,9 +3071,17 @@ SELECT * FROM ltreetest WHERE t ~ '*.1' order by t asc;
                t                
 --------------------------------
  1
+ 1.1
+ 1.1.1
+ 1.1.1.1
+ 1.1.1.2.1
+ 1.1.2.1
+ 1.26.15.23.5.31.29.11.19.28.1
+ 10.13.22.1.8.30.9.24.1.2.1
  10.22.1
  10.26.30.15.1
  11.1
+ 12.1.1
  17.25.2.13.10.27.13.1
  18.13.6.12.26.26.26.29.18.20.1
  19.20.25.7.27.28.27.17.9.3.1
@@ -3083,6 +3091,7 @@ SELECT * FROM ltreetest WHERE t ~ '*.1' order by t asc;
  21.18.2.1
  21.23.17.8.23.11.8.1
  22.30.31.24.23.22.5.20.28.1
+ 23.17.22.1.23.4.29.32.4.1
  23.28.1
  23.3.32.21.5.14.10.17.1
  25.6.12.16.1
@@ -3095,14 +3104,15 @@ SELECT * FROM ltreetest WHERE t ~ '*.1' order by t asc;
  8.2.18.23.5.16.17.1
  8.32.30.1
  9.21.20.29.1
-(25 rows)
+(34 rows)
 
 SELECT * FROM ltreetest WHERE t ~ '23.*.1' order by t asc;
-            t            
--------------------------
+             t             
+---------------------------
+ 23.17.22.1.23.4.29.32.4.1
  23.28.1
  23.3.32.21.5.14.10.17.1
-(2 rows)
+(3 rows)
 
 SELECT * FROM ltreetest WHERE t ~ '23.*{1}.1' order by t asc;
     t    
@@ -7266,9 +7276,17 @@ SELECT * FROM ltreetest WHERE t ~ '*.1' order by t asc;
                t                
 --------------------------------
  1
+ 1.1
+ 1.1.1
+ 1.1.1.1
+ 1.1.1.2.1
+ 1.1.2.1
+ 1.26.15.23.5.31.29.11.19.28.1
+ 10.13.22.1.8.30.9.24.1.2.1
  10.22.1
  10.26.30.15.1
  11.1
+ 12.1.1
  17.25.2.13.10.27.13.1
  18.13.6.12.26.26.26.29.18.20.1
  19.20.25.7.27.28.27.17.9.3.1
@@ -7278,6 +7296,7 @@ SELECT * FROM ltreetest WHERE t ~ '*.1' order by t asc;
  21.18.2.1
  21.23.17.8.23.11.8.1
  22.30.31.24.23.22.5.20.28.1
+ 23.17.22.1.23.4.29.32.4.1
  23.28.1
  23.3.32.21.5.14.10.17.1
  25.6.12.16.1
@@ -7290,14 +7309,15 @@ SELECT * FROM ltreetest WHERE t ~ '*.1' order by t asc;
  8.2.18.23.5.16.17.1
  8.32.30.1
  9.21.20.29.1
-(25 rows)
+(34 rows)
 
 SELECT * FROM ltreetest WHERE t ~ '23.*.1' order by t asc;
-            t            
--------------------------
+             t             
+---------------------------
+ 23.17.22.1.23.4.29.32.4.1
  23.28.1
  23.3.32.21.5.14.10.17.1
-(2 rows)
+(3 rows)
 
 SELECT * FROM ltreetest WHERE t ~ '23.*{1}.1' order by t asc;
     t    
@@ -7372,13 +7392,13 @@ SELECT count(*) FROM _ltreetest WHERE t ~ '1.1.1.*' ;
 SELECT count(*) FROM _ltreetest WHERE t ~ '*.1' ;
  count 
 -------
-    83
+   109
 (1 row)
 
 SELECT count(*) FROM _ltreetest WHERE t ~ '23.*.1' ;
  count 
 -------
-    10
+    11
 (1 row)
 
 SELECT count(*) FROM _ltreetest WHERE t ~ '23.*{1}.1' ;
@@ -7416,13 +7436,13 @@ SELECT count(*) FROM _ltreetest WHERE t ~ '1.1.1.*' ;
 SELECT count(*) FROM _ltreetest WHERE t ~ '*.1' ;
  count 
 -------
-    83
+   109
 (1 row)
 
 SELECT count(*) FROM _ltreetest WHERE t ~ '23.*.1' ;
  count 
 -------
-    10
+    11
 (1 row)
 
 SELECT count(*) FROM _ltreetest WHERE t ~ '23.*{1}.1' ;
index e24cc8559fcc16c6773ce6f0e1b28fe85159854c..a7a56977e8e34f2d5a738316fab73a4929d97217 100644 (file)
@@ -39,7 +39,7 @@ getlexem(char *start, char *end, int *len)
 }
 
 bool
-                       compare_subnode(ltree_level * t, char *qn, int len, int (*cmpptr) (const char *, const char *, size_t), bool anyend)
+compare_subnode(ltree_level * t, char *qn, int len, int (*cmpptr) (const char *, const char *, size_t), bool anyend)
 {
        char       *endt = t->name + t->len;
        char       *endq = qn + len;
@@ -117,6 +117,11 @@ printFieldNot(FieldNot *fn ) {
 }
 */
 
+static struct {
+       bool muse;
+       uint32  high_pos;
+} SomeStack = {false,0,};
+
 static bool
 checkCond(lquery_level * curq, int query_numlevel, ltree_level * curt, int tree_numlevel, FieldNot * ptr)
 {
@@ -129,6 +134,14 @@ checkCond(lquery_level * curq, int query_numlevel, ltree_level * curt, int tree_
        lquery_level *prevq = NULL;
        ltree_level *prevt = NULL;
 
+       if ( SomeStack.muse ) {
+               high_pos = SomeStack.high_pos;
+               qlen--;
+               prevq = curq;
+               curq = LQL_NEXT(curq);
+               SomeStack.muse = false;
+       }
+
        while (tlen > 0 && qlen > 0)
        {
                if (curq->numvar)
@@ -181,6 +194,15 @@ checkCond(lquery_level * curq, int query_numlevel, ltree_level * curt, int tree_
                                        curt = LEVEL_NEXT(curt);
                                        tlen--;
                                        cur_tpos++;
+                                       if ( isok && prevq && prevq->numvar==0 && tlen>0 && cur_tpos <= high_pos ) {
+                                               FieldNot tmpptr;
+                                               if ( ptr )
+                                                       memcpy(&tmpptr,ptr,sizeof(FieldNot));
+                                               SomeStack.high_pos = high_pos-cur_tpos;
+                                               SomeStack.muse = true;
+                                               if ( checkCond(prevq, qlen+1, curt, tlen, (ptr) ? &tmpptr : NULL) )
+                                                       return true;
+                                       }
                                        if (!isok && ptr)
                                                ptr->nt++;
                                }