Markos Zaharioudakis has proposed merging lp:~markos-za/zorba/markos-bugs into 
lp:zorba.

Requested reviews:
  Federico Cavalieri (fcavalieri)

For more details, see:
https://code.launchpad.net/~markos-za/zorba/markos-bugs/+merge/76750

Fixed wrong assumption about the content of an element node with simple content
-- 
https://code.launchpad.net/~markos-za/zorba/markos-bugs/+merge/76750
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'src/store/api/shared_types.h'
--- src/store/api/shared_types.h	2011-09-19 15:01:21 +0000
+++ src/store/api/shared_types.h	2011-09-23 14:33:26 +0000
@@ -29,6 +29,9 @@
 namespace zorba 
 { 
 
+typedef std::vector<char>::size_type csize;
+
+
 namespace store 
 {
 

=== modified file 'src/store/naive/node_items.cpp'
--- src/store/naive/node_items.cpp	2011-09-15 07:18:45 +0000
+++ src/store/naive/node_items.cpp	2011-09-23 14:33:26 +0000
@@ -2076,16 +2076,74 @@
 /*******************************************************************************
 
 ********************************************************************************/
-bool ElementNode::haveTypedTypedValue() const
+bool ElementNode::haveTypedTypedValue(TextNode*& textChild) const
 {
+  textChild = NULL;
+
   if (numChildren() == 1 &&
       getChild(0)->getNodeKind() == store::StoreConsts::textNode)
   {
-    if (reinterpret_cast<TextNode*>(getChild(0))->isTyped())
-      return true;
-  }
-
-  return false;
+    textChild = static_cast<TextNode*>(getChild(0));
+
+    return textChild->isTyped();
+  }
+  else
+  {
+    InternalNode::const_iterator ite = childrenBegin();
+    InternalNode::const_iterator end = childrenEnd();
+
+    for (; ite != end; ++ite)
+    {
+      store::StoreConsts::NodeKind kind = (*ite)->getNodeKind();
+
+      if (kind == store::StoreConsts::elementNode)
+        return false;
+
+      if (kind == store::StoreConsts::commentNode ||
+          kind == store::StoreConsts::piNode)
+        continue;
+
+      assert(kind == store::StoreConsts::textNode);
+
+      if (textChild != NULL)
+        return false;
+
+      textChild = static_cast<TextNode*>(*ite);
+    }
+
+    return (textChild && textChild->isTyped());
+  }
+}
+
+
+/*******************************************************************************
+
+********************************************************************************/
+TextNode* ElementNode::getUniqueTextChild() const
+{
+  TextNode* textChild = NULL;
+
+  InternalNode::const_iterator ite = childrenBegin();
+  InternalNode::const_iterator end = childrenEnd();
+
+  for (; ite != end; ++ite)
+  {
+    store::StoreConsts::NodeKind kind = (*ite)->getNodeKind();
+    
+    ZORBA_ASSERT(kind != store::StoreConsts::elementNode);
+
+    if (kind == store::StoreConsts::textNode)
+    {
+      if (textChild != NULL)
+        ZORBA_ASSERT(false);
+
+      textChild = static_cast<TextNode*>(*ite);
+    }
+  }
+
+  ZORBA_ASSERT(textChild);
+
+  return textChild;
 }
 
 
@@ -2094,10 +2152,10 @@
 ********************************************************************************/
 bool ElementNode::isId() const
 {
-  if (numChildren() == 1 &&
-      getChild(0)->getNodeKind() == store::StoreConsts::textNode)
+  TextNode* textChild;
+  if (haveTypedTypedValue(textChild))
   {
-		if (reinterpret_cast<TextNode*>(getChild(0))->isIdInternal())
+		if (textChild->isIdInternal())
       return true;
 	}
 
@@ -2110,10 +2168,10 @@
 ********************************************************************************/
 bool ElementNode::isIdRefs() const
 {
-  if (numChildren() == 1 &&
-      getChild(0)->getNodeKind() == store::StoreConsts::textNode)
+  TextNode* textChild;
+  if (haveTypedTypedValue(textChild))
   {
-    if (reinterpret_cast<TextNode*>(getChild(0))->isIdRefsInternal())
+    if (textChild->isIdRefsInternal())
       return true;
   }
 
@@ -2128,24 +2186,24 @@
 {
   if (haveValue())
   {
+    TextNode* textChild;
+
     if (haveEmptyValue())
     {
       val = NULL;
       iter = NULL;
     }
-    else if (haveTypedTypedValue())
+    else if (haveTypedTypedValue(textChild))
     {
-      const TextNode* child = reinterpret_cast<const TextNode*>(getChild(0));
-
-      if (child->haveListValue())
+      if (textChild->haveListValue())
       {
-        ItemVector* vec = reinterpret_cast<ItemVector*>(child->getValue());
+        ItemVector* vec = reinterpret_cast<ItemVector*>(textChild->getValue());
         iter = new ItemIterator(vec->getItems(), true);
         val = NULL;
       }
       else
       {
-        val = child->getValue();
+        val = textChild->getValue();
         iter = NULL;
       }
     }
@@ -2158,10 +2216,8 @@
   }
   else
   {
-    throw XQUERY_EXCEPTION(
-      err::FOTY0012,
-      ERROR_PARAMS( theName->getStringValue(), getType()->getStringValue() )
-    );
+    throw XQUERY_EXCEPTION(err::FOTY0012,
+    ERROR_PARAMS(theName->getStringValue(), getType()->getStringValue()));
   }
 }
 
@@ -2814,7 +2870,7 @@
   store::NsBindings nsBindings;
   getNamespaceBindings(nsBindings);
 
-  for (ulong i = 0; i < nsBindings.size(); i++)
+  for (csize i = 0; i < nsBindings.size(); i++)
   {
     str << " xmlns:" <<  nsBindings[i].first << "=\""
         << nsBindings[i].second << "\"";
@@ -3345,12 +3401,10 @@
   if (parent)
   {
 #ifndef NDEBUG
-    if (parent->getNodeKind() == store::StoreConsts::elementNode &&
-        parent->numChildren() == 1 &&
-        parent->getChild(0)->getNodeKind() == store::StoreConsts::textNode)
+    if (parent->getNodeKind() == store::StoreConsts::elementNode)
     {
-      TextNode* textChild = reinterpret_cast<TextNode*>(parent->getChild(0));
-      ZORBA_ASSERT(!textChild->isTyped());
+      TextNode* textChild;
+      ZORBA_ASSERT(!static_cast<ElementNode*>(parent)->haveTypedTypedValue(textChild));
     }
 #endif
 
@@ -3379,12 +3433,12 @@
 
 ********************************************************************************/
 TextNode::TextNode(
-    InternalNode*  parent,
+    InternalNode* parent,
     store::Item_t& content,
-    bool           isListValue)
+    bool isListValue)
   :
 #ifdef TEXT_ORDPATH
-  OrdPathNode(NULL, parent, true, 0, store::StoreConsts::textNode)
+  OrdPathNode(NULL, parent, append, pos, store::StoreConsts::textNode)
 #else
   XmlNode(NULL, parent, store::StoreConsts::textNode)
 #endif
@@ -3395,14 +3449,31 @@
 
   ElementNode* p = reinterpret_cast<ElementNode*>(parent);
 
-  ZORBA_ASSERT(p->numChildren() == 0);
+  // Make sure that the parent node has only comment and pi nodes as children.
+  if (p->numChildren() > 0)
+  {
+    InternalNode::const_iterator ite = p->childrenBegin();
+    InternalNode::const_iterator end = p->childrenEnd();
+
+    for (; ite != end; ++ite)
+    {
+      XmlNode* child = (*ite);
+
+      if (child->getNodeKind() != store::StoreConsts::commentNode &&
+          child->getNodeKind() != store::StoreConsts::piNode)
+      {
+        ZORBA_ASSERT(false);
+      }
+    }    
+  }
+
   ZORBA_ASSERT(p->haveValue() && !p->haveEmptyValue());
 
   setTypedValue(content);
   if (isListValue)
     setHaveListValue();
 
-  p->insertChild(this, 0);
+  p->insertChild(this, p->numChildren());
 
 #ifdef TEXT_ORDPATH
   NODE_TRACE1("Constructed text node " << this << " parent = "
@@ -3453,7 +3524,7 @@
         // always be untyped.
 
         // Merge adjacent text nodes.
-        ulong numChildren = parent->numChildren();
+        csize numChildren = parent->numChildren();
 
         XmlNode* lsib = (pos > 0 ? parent->getChild(pos-1) : NULL);
         XmlNode* rsib = (pos < numChildren ? parent->getChild(pos) : NULL);
@@ -3615,8 +3686,8 @@
 bool TextNode::isIdInternal() const
 {
   if (isTyped() &&
-    (static_cast<AtomicItem*>(getValue()))->isAtomic() &&
-    (static_cast<AtomicItem*>(getValue()))->getTypeCode() == XS_ID)
+      getValue()->isAtomic() &&
+      static_cast<AtomicItem*>(getValue())->getTypeCode() == XS_ID)
     return true;
 
   return false;
@@ -3635,9 +3706,9 @@
     if (haveListValue())
     {
       const ItemVector& values = *reinterpret_cast<ItemVector*>(value);
-      ulong numValues = values.size();
+      csize numValues = values.size();
 
-      for (ulong i = 0; i < numValues; ++i)
+      for (csize i = 0; i < numValues; ++i)
       {
         if (dynamic_cast<IDREFItem*>(values.getItem(i)) != NULL)
         {
@@ -4285,7 +4356,7 @@
 void InternalNode::tokenize( XmlNodeTokenizerCallback& cb )
 {
   XmlNodeTokenizerCallback::begin_type const begin = cb.beginTokenization();
-  for ( ulong i = 0; i < numChildren(); ++i )
+  for ( csize i = 0; i < numChildren(); ++i )
     getChild( i )->tokenize( cb );
   cb.endTokenization( this, begin );
 }

=== modified file 'src/store/naive/node_items.h'
--- src/store/naive/node_items.h	2011-09-13 13:33:51 +0000
+++ src/store/naive/node_items.h	2011-09-23 14:33:26 +0000
@@ -899,18 +899,24 @@
   void resetHaveEmptyValue()    { theFlags &= ~HaveEmptyValue; }
   bool haveEmptyValue() const   { return (theFlags & HaveEmptyValue) != 0; }
 
-  bool haveTypedTypedValue() const;
+  bool haveTypedTypedValue(TextNode*&) const;
+
+  TextNode* getUniqueTextChild() const;
 
   void setInSubstGroup()        { theFlags |= IsInSubstGroup; }
+
   void resetInSubstGroup()      { theFlags &= ~IsInSubstGroup; }
 
 #ifndef EMBEDED_TYPE
   bool haveType() const         { return (theFlags & HaveType) != 0; }
+
   void setHaveType()            { theFlags |= HaveType; }
+
   void resetHaveType()          { theFlags &= ~HaveType; }
 #endif
 
   bool isRecursive() const      { return (theFlags & IsRecursive) != 0; }
+
   void resetRecursive()         { theFlags &= ~IsRecursive; }
 
   void setRecursive()

=== modified file 'src/store/naive/node_updates.cpp'
--- src/store/naive/node_updates.cpp	2011-09-15 07:18:45 +0000
+++ src/store/naive/node_updates.cpp	2011-09-23 14:33:26 +0000
@@ -605,12 +605,12 @@
 void XmlNode::removeType(UpdatePrimitive& upd)
 {
   TypeUndoList& undoList = upd.theTypeUndoList;
-  ulong undoSize = (ulong)undoList.size();
+  csize undoSize = undoList.size();
 
   zorba::store::Item* revalidationNode = NULL;
   XmlNode* currNode = this;
 
-  while(currNode != NULL)
+  while (currNode != NULL)
   {
     NodeTypeInfo tinfo;
     tinfo.theNode = currNode;
@@ -643,10 +643,10 @@
 #endif
       tinfo.theFlags = n->theFlags;
 
-      if (n->haveTypedTypedValue())
+      TextNode* textChild;
+
+      if (n->haveTypedTypedValue(textChild))
       {
-        TextNode* textChild = reinterpret_cast<TextNode*>(n->getChild(0));
-
         zstring textValue;
         textChild->getStringValue2(textValue);
 
@@ -744,12 +744,9 @@
       n->setType(tinfo.theTypeName);
       n->theFlags = tinfo.theFlags;
 
-      if (tinfo.theChildFlags & IsTyped)
+      if (tinfo.theChildFlags & XmlNode::IsTyped)
       {
-        ZORBA_ASSERT(n->numChildren() == 1 &&
-                     n->getChild(0)->getNodeKind() == store::StoreConsts::textNode);
-
-        TextNode* textChild = reinterpret_cast<TextNode*>(n->getChild(0));
+        TextNode* textChild = n->getUniqueTextChild();
 
         if (!textChild->isTyped())
         {

=== modified file 'src/store/naive/pul_primitives.cpp'
--- src/store/naive/pul_primitives.cpp	2011-09-21 10:10:35 +0000
+++ src/store/naive/pul_primitives.cpp	2011-09-23 14:33:26 +0000
@@ -467,10 +467,10 @@
 
   target->setType(theTypeName);
 
-  if (target->haveTypedTypedValue())
+  TextNode* textChild;
+
+  if (target->haveTypedTypedValue(textChild))
   {
-    TextNode* textChild = reinterpret_cast<TextNode*>(target->getChild(0));
-
     zstring textValue;
     textChild->getStringValue2(textValue);
 
@@ -489,10 +489,7 @@
 
     if (theHaveTypedValue)
     {
-      ZORBA_FATAL(target->numChildren() == 1, "");
-      ZORBA_FATAL(target->getChild(0)->getNodeKind() == store::StoreConsts::textNode, "");
-
-      TextNode* textChild = reinterpret_cast<TextNode*>(target->getChild(0));
+      TextNode* textChild = target->getUniqueTextChild();
 
       textChild->setTypedValue(theTypedValue);
       if (theHaveListValue)

=== modified file 'src/store/naive/shared_types.h'
--- src/store/naive/shared_types.h	2011-06-14 17:26:33 +0000
+++ src/store/naive/shared_types.h	2011-09-23 14:33:26 +0000
@@ -30,9 +30,6 @@
 namespace simplestore 
 {
 
-typedef std::vector<char>::size_type csize;
-
-
 class CollectionSet;
 class CollectionIterator;
 typedef rchandle<CollectionIterator> CollectionIterator_t;

=== modified file 'src/types/schema/validate.cpp'
--- src/types/schema/validate.cpp	2011-07-01 17:58:59 +0000
+++ src/types/schema/validate.cpp	2011-09-23 14:33:26 +0000
@@ -525,8 +525,8 @@
                << "\n"; cout.flush();
 #endif
 
-        if ( xqType!=NULL &&
-             xqType->content_kind()==XQType::SIMPLE_CONTENT_KIND )
+        if ( xqType != NULL &&
+             xqType->content_kind() == XQType::SIMPLE_CONTENT_KIND )
         {
           store::NsBindings nsBindings;
           parent->getNamespaceBindings(nsBindings);
@@ -540,7 +540,7 @@
                            typedValues,
                            loc);
 
-          if ( typedValues.size()==1 ) // hack around serialization bug
+          if ( typedValues.size() == 1 ) // hack around serialization bug
             GENV_ITEMFACTORY->createTextNode(validatedTextNode, parent,
                                              typedValues[0]);
           else

=== added file 'test/rbkt/ExpQueryResults/zorba/misc/validate1.xml.res'
--- test/rbkt/ExpQueryResults/zorba/misc/validate1.xml.res	1970-01-01 00:00:00 +0000
+++ test/rbkt/ExpQueryResults/zorba/misc/validate1.xml.res	2011-09-23 14:33:26 +0000
@@ -0,0 +1,9 @@
+<xqdoc xmlns="http://www.xqdoc.org/1.0";>
+    <control>
+        <date><?processinginstruction aaa?>TS4J5UJ</date>
+        <version>N/A</version>
+    </control>
+    <module type="library">
+        <uri>DGQEb8Q</uri>
+    </module>
+</xqdoc>

=== added file 'test/rbkt/Queries/zorba/misc/validate1.xq'
--- test/rbkt/Queries/zorba/misc/validate1.xq	1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/misc/validate1.xq	2011-09-23 14:33:26 +0000
@@ -0,0 +1,15 @@
+
+import schema namespace s = "http://www.xqdoc.org/1.0";;
+
+let $hostInfo :=<xqdoc xmlns="http://www.xqdoc.org/1.0";>
+    <control>
+        <date><?processinginstruction aaa?>TS4J5UJ</date>
+        <version>N/A</version>
+    </control>
+    <module type="library">
+        <uri>DGQEb8Q</uri>
+    </module>
+</xqdoc>
+
+return
+  validate { $hostInfo }

-- 
Mailing list: https://launchpad.net/~zorba-coders
Post to     : zorba-coders@lists.launchpad.net
Unsubscribe : https://launchpad.net/~zorba-coders
More help   : https://help.launchpad.net/ListHelp

Reply via email to