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