Update of /cvsroot/monetdb/pathfinder/compiler/mil
In directory sc8-pr-cvs16.sourceforge.net:/tmp/cvs-serv26964/mil
Modified Files:
Tag: XQuery_0-24
milgen.brg
Log Message:
-- Fixing part of bug [ 1350418 ] PF: text nodes with empty content sequence
PART 1/2:
o For the non-twig case (if only a single textnode constructor appears
in the twig) prune empty strings before creating textnodes.
This leads already to the correct translation of e.g., the queries
text{"42"}/doc("foo.xml")/a --> element a
text{""}/doc("foo.xml")/a --> ()
STILL MISSING -- PART2:
o Avoiding the empty textnode construction inside larger twigs
(requires some SIZE adjustments).
U milgen.brg
Index: milgen.brg
===================================================================
RCS file: /cvsroot/monetdb/pathfinder/compiler/mil/milgen.brg,v
retrieving revision 1.157.2.10
retrieving revision 1.157.2.11
diff -u -d -r1.157.2.10 -r1.157.2.11
--- milgen.brg 5 Jun 2008 17:12:40 -0000 1.157.2.10
+++ milgen.brg 5 Jun 2008 21:50:28 -0000 1.157.2.11
@@ -6996,11 +6996,34 @@
assert (type_of (LL(p), L(p)->sem.ii.iter) == aat_nat);
assert (type_of (LL(p), L(p)->sem.ii.item) == aat_str);
{
- mvar_t *seqb = new_var (1);
- mvar_t *root_pre = new_var (p->refctr);
- mvar_t *root_frag = new_var (p->refctr);
- mvar_t *iter = env_mvar (LL(p)->env, L(p)->sem.ii.iter, aat_nat);
- PFmil_t *item = VAR (LL(p)->env, L(p)->sem.ii.item, aat_str);
+ mvar_t *seqb = new_var (1),
+ *root_pre = new_var (p->refctr),
+ *root_frag = new_var (p->refctr),
+ *iter = new_var (p->refctr),
+ *item = new_var (1),
+ *map = new_var (1);
+
+ /* prune all empty textnodes */
+ execute (
+ assgn (var (map->name),
+ hmark (
+ select_ (meq (VAR (LL(p)->env,
+ L(p)->sem.ii.item,
+ aat_str),
+ lit_str ("")),
+ lit_bit (false)),
+ lit_oid (0))),
+ assgn (var (iter->name),
+ leftjoin (var (map->name),
+ VAR (LL(p)->env,
+ L(p)->sem.ii.iter,
+ aat_nat))),
+ assgn (var (item->name),
+ leftjoin (var (map->name),
+ VAR (LL(p)->env,
+ L(p)->sem.ii.item,
+ aat_str))));
+ unpin (map, 1);
execute (
/* get first free pre value */
@@ -7028,28 +7051,30 @@
var (PF_MIL_VAR_WS),
var (PF_MIL_VAR_PRE_SIZE)),
var (PF_MIL_VAR_WS_CONT)),
- project (item, lit_int (0))),
+ project (var (item->name), lit_int (0))),
/* level */
bappend (fetch (
fetch (
var (PF_MIL_VAR_WS),
var (PF_MIL_VAR_PRE_LEVEL)),
var (PF_MIL_VAR_WS_CONT)),
- project (item, cast (type (mty_chr), lit_int (0)))),
+ project (var (item->name),
+ cast (type (mty_chr), lit_int (0)))),
/* kind */
bappend (fetch (
fetch (
var (PF_MIL_VAR_WS),
var (PF_MIL_VAR_PRE_KIND)),
var (PF_MIL_VAR_WS_CONT)),
- project (item, var (PF_MIL_VAR_KIND_TEXT))),
+ project (var (item->name),
+ var (PF_MIL_VAR_KIND_TEXT))),
/* prop */
bappend (fetch (
fetch (
var (PF_MIL_VAR_WS),
var (PF_MIL_VAR_PRE_PROP)),
var (PF_MIL_VAR_WS_CONT)),
- add_content (item,
+ add_content (var (item->name),
var (PF_MIL_VAR_WS),
var (PF_MIL_VAR_PROP_TEXT))),
/* cont */
@@ -7058,28 +7083,29 @@
var (PF_MIL_VAR_WS),
var (PF_MIL_VAR_PRE_CONT)),
var (PF_MIL_VAR_WS_CONT)),
- project (item, var (PF_MIL_VAR_WS_CONT))),
+ project (var (item->name),
+ var (PF_MIL_VAR_WS_CONT))),
/* pre_nid */
bappend (fetch (
fetch (
var (PF_MIL_VAR_WS),
var (PF_MIL_VAR_PRE_NID)),
var (PF_MIL_VAR_WS_CONT)),
- mark (item, var (seqb->name))),
+ mark (var (item->name), var (seqb->name))),
/* nid_rid */
bappend (fetch (
fetch (
var (PF_MIL_VAR_WS),
var (PF_MIL_VAR_NID_RID)),
var (PF_MIL_VAR_WS_CONT)),
- mark (item, var (seqb->name))),
+ mark (var (item->name), var (seqb->name))),
/* new root pre values */
assgn (var (root_pre->name),
- mark (item, var (seqb->name))),
+ mark (var (item->name), var (seqb->name))),
/* fragment information */
assgn (var (root_frag->name),
- project (item, var (PF_MIL_VAR_WS_CONT))),
+ project (var (item->name), var (PF_MIL_VAR_WS_CONT))),
/* make the fragment boundaries known */
binsert (fetch (
@@ -7093,9 +7119,9 @@
lit_oid (0)))));
unpin (seqb, 1);
- pin (iter, p->refctr);
- env_add (p->env, p->sem.ii.iter, aat_nat, iter);
- env_add (p->env, p->sem.ii.item, aat_pre, root_pre);
+ unpin (item, 1);
+ env_add (p->env, p->sem.ii.iter, aat_nat, iter);
+ env_add (p->env, p->sem.ii.item, aat_pre, root_pre);
env_add (p->env, p->sem.ii.item, aat_frag, root_frag);
}
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