Update of /cvsroot/monetdb/pathfinder/compiler/mil
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv2034/mil

Modified Files:
      Tag: XQuery_0-24
        milgen.brg 
Log Message:
-- Fixing bug [ 1350418 ] PF: text nodes with empty content sequence

   PART 2/2:
   o In a twig we have to prune empty strings before creating textnodes
     and we have to provide the calculation of the sizes (0|1) for the
     parent nodes.

   Queries such as the following now work correctly:

   <a>{text{"foo"}}</a>                                  --> <a>foo</a>
   <a>{text{""}}</a>                                     --> <a/>
   for $a in ("foo","","bar") return <a>{text{$a}}</a>   --> 
<a>foo</a><a/><a>bar</a>


U milgen.brg
Index: milgen.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milgen.brg,v
retrieving revision 1.157.2.12
retrieving revision 1.157.2.13
diff -u -d -r1.157.2.12 -r1.157.2.13
--- milgen.brg  6 Jun 2008 10:15:54 -0000       1.157.2.12
+++ milgen.brg  7 Jun 2008 08:17:46 -0000       1.157.2.13
@@ -7019,11 +7019,12 @@
             execute (
                 assgn (var (map->name),
                        hmark (
-                           select_ (meq (VAR (LL(p)->env,
-                                              L(p)->sem.ii.item,
-                                              aat_str),
-                                         lit_str ("")),
-                                    lit_bit (false)),
+                           select_ (
+                               PFmil_mne (VAR (LL(p)->env,
+                                               L(p)->sem.ii.item,
+                                               aat_str),
+                                          lit_str ("")),
+                               lit_bit (true)),
                            lit_oid (0))),
                 assgn (var (iter->name),
                        leftjoin (var (map->name),
@@ -7619,52 +7620,121 @@
             assert (type_of (L(p), p->sem.ii.iter) == aat_nat);
             assert (type_of (L(p), p->sem.ii.item) == aat_str);
         {
-            mvar_t  *v = new_var (1);
-            mvar_t  *prop = new_var (1);
-            PFmil_t *iter = VAR (L(p)->env, p->sem.ii.iter, aat_nat);
-            PFmil_t *item = VAR (L(p)->env, p->sem.ii.item, aat_str);
+            mvar_t  *v    = new_var (1),
+                    *prop = new_var (1),
+                    *iter = new_var (1),
+                    *item = new_var (1);
+
+            /* check for constant non-empty string */
+            if (PFprop_const (p->prop, p->sem.ii.item) &&
+                strcmp (PFprop_const_val (p->prop, p->sem.ii.item).val.str, 
"")) {
+                execute (
+                    assgn (var (iter->name),
+                           VAR (L(p)->env, p->sem.ii.iter, aat_nat)),
+                    assgn (var (item->name),
+                           VAR (L(p)->env, p->sem.ii.item, aat_str)));
+
+                /* stable size + 1 */
+                twig_state->size++;
+            }
+            /* we need to prune empty textnodes and calculate the
+               resulting sizes for the consuming parents */
+            else {
+                mvar_t *bool_list = new_var (1),
+                       *map       = new_var (1),
+                       *size      = new_var (1);
+                
+                /* prune all empty textnodes */
+                execute (
+                    assgn (var (bool_list->name),
+                           PFmil_mne (VAR (L(p)->env,
+                                           p->sem.ii.item,
+                                           aat_str),
+                                      lit_str (""))),
+                    assgn (var (map->name),
+                           hmark (
+                               select_ (var (bool_list->name),
+                                        lit_bit (true)),
+                               lit_oid (0))),
+                    assgn (var (iter->name),
+                           leftjoin (var (map->name),
+                                     VAR (L(p)->env,
+                                          p->sem.ii.iter,
+                                          aat_nat))),
+                    assgn (var (item->name),
+                           leftjoin (var (map->name),
+                                     VAR (L(p)->env,
+                                          p->sem.ii.item,
+                                          aat_str))));
+                unpin (map, 1);
+
+                assert (twig_state->loop);
 
+                /* calculate the sizes and map them to the head
+                   of the loop relation */
+                execute (
+                    assgn (var (size->name),
+                           leftjoin (
+                               twig_state->loop,
+                               leftjoin (
+                                   reverse (VAR (L(p)->env,
+                                                 p->sem.ii.iter,
+                                                 aat_nat)),
+                                   mcast (type (mty_int),
+                                          var (bool_list->name))))));
+                unpin (bool_list, 1);
+                
+                /* add the correct sizes to the variable environment */
+                env_add (p->env, att_NULL, aat_int, size);
+            }
+            
             execute (
                 assgn (var (prop->name),
-                       add_content (item,
+                       add_content (var (item->name),
                                     var (PF_MIL_VAR_WS),
                                     var (PF_MIL_VAR_PROP_TEXT))),
                 assgn (var (v->name),
                        seqbase (new (type (mty_void), type (mty_bat)),
                                 lit_oid (0))),
                 /* iter */
-                bappend (var (v->name), iter),
+                bappend (var (v->name), var (iter->name)),
                 /* pre */
                 bappend (var (v->name),
-                         project (iter, lit_oid (twig_state->pre))),
+                         project (var (iter->name),
+                                  lit_oid (twig_state->pre))),
                 /* size */
                 bappend (var (v->name),
-                         project (iter, lit_int (0))),
+                         project (var (iter->name), lit_int (0))),
                 /* level */
                 bappend (var (v->name),
-                         project (iter,
+                         project (var (iter->name),
                                   cast (type (mty_chr),
                                         lit_int (twig_state->level)))),
                 /* kind */
                 bappend (var (v->name),
-                         project (iter, var (PF_MIL_VAR_KIND_TEXT))),
+                         project (var (iter->name),
+                                  var (PF_MIL_VAR_KIND_TEXT))),
                 /* prop */
                 bappend (var (v->name), var (prop->name)),
                 /* cont */
                 bappend (var (v->name),
-                         project (iter, var (PF_MIL_VAR_WS_CONT))),
+                         project (var (iter->name),
+                                  var (PF_MIL_VAR_WS_CONT))),
                 /* old_pre */
                 bappend (var (v->name),
-                         project (iter, cast (type (mty_oid), nil ()))),
+                         project (var (iter->name),
+                                  cast (type (mty_oid), nil ()))),
                 /* old_cont */
                 bappend (var (v->name),
-                         project (iter, cast (type (mty_oid), nil ()))));
+                         project (var (iter->name),
+                                  cast (type (mty_oid), nil ()))));
 
+            unpin (iter, 1);
+            unpin (item, 1);
             unpin (prop, 1);
 
             *(mvar_t **) PFarray_add (twig_state->elem_vars) = v;
             twig_state->pre++;
-            twig_state->size++;
         }
             break; /* fold) */
 


-------------------------------------------------------------------------
Check out the new SourceForge.net Marketplace.
It's the best place to buy or sell services for
just about anything Open Source.
http://sourceforge.net/services/buy/index.php
_______________________________________________
Monetdb-pf-checkins mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/monetdb-pf-checkins

Reply via email to