Matthias Brantner has proposed merging lp:~zorba-coders/zorba/947627 into 
lp:zorba.

Requested reviews:
  Markos Zaharioudakis (markos-za)
  Till Westmann (tillw)
Related bugs:
  Bug #947627 in Zorba: "setting the static type of the context item is ignored"
  https://bugs.launchpad.net/zorba/+bug/947627

For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/947627/+merge/97570

fixed bug #947627 (setting the static type of the context item is ignored) 
- raise an error if specified twice in the prolog
- if set using the C++ api and later in the prolog
-- 
https://code.launchpad.net/~zorba-coders/zorba/947627/+merge/97570
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'ChangeLog'
--- ChangeLog	2012-03-12 20:01:39 +0000
+++ ChangeLog	2012-03-15 04:19:18 +0000
@@ -49,6 +49,7 @@
   * Fixed bug #911585 (management of variables during eval)
   * Fixed bug #866423 (fn:empty and fn:exists iterators must reset their input in
     case of early-out)
+  * Fixed bug #947627 (setting the static type of the context item is ignored)
   * Fixed bug #945241 (StaticCollectionManager::declaredIndexes() and temporary indexes)
   * Fixed bug #872288 (reset recursive flag during node rename)
   * Fixed bug #905041 (allow for the default element and function namespaces to be

=== modified file 'include/zorba/pregenerated/diagnostic_list.h'
--- include/zorba/pregenerated/diagnostic_list.h	2012-03-12 23:43:56 +0000
+++ include/zorba/pregenerated/diagnostic_list.h	2012-03-15 04:19:18 +0000
@@ -172,6 +172,8 @@
 
 extern ZORBA_DLL_PUBLIC XQueryErrorCode XQST0098;
 
+extern ZORBA_DLL_PUBLIC XQueryErrorCode XQST0099;
+
 extern ZORBA_DLL_PUBLIC XQueryErrorCode XQST0106;
 
 extern ZORBA_DLL_PUBLIC XQueryErrorCode XQST0111;

=== modified file 'modules/w3c/pregenerated/xqt-errors.xq'
--- modules/w3c/pregenerated/xqt-errors.xq	2011-11-15 08:10:49 +0000
+++ modules/w3c/pregenerated/xqt-errors.xq	2012-03-15 04:19:18 +0000
@@ -766,6 +766,14 @@
 
 (:~
  :
+ : If a module contains more than one context item declaration, a static error is raised [err:XQST0099].
+ : 
+ : @see http://www.w3.org/2005/xqt-errors
+:)
+declare variable $err:XQST0099 as xs:QName := fn:QName($err:NS, "err:XQST0099");
+
+(:~
+ :
  : It is a static error if a function's annotations contain more than one
  : annotation named \c private or \c public.  It is a static error if a
  : function's annotations contain more than one annotation named \c

=== modified file 'src/api/staticcontextimpl.cpp'
--- src/api/staticcontextimpl.cpp	2012-03-07 15:49:25 +0000
+++ src/api/staticcontextimpl.cpp	2012-03-15 04:19:18 +0000
@@ -932,6 +932,10 @@
 void
 StaticContextImpl::setContextItemStaticType(TypeIdentifier_t type)
 {
+  if (theCtx->is_context_item_type_set())
+  {
+    throw ZORBA_EXCEPTION(err::XQST0099);
+  }
   xqtref_t xqType = NULL;
   if (type != NULL) 
   {

=== modified file 'src/compiler/translator/translator.cpp'
--- src/compiler/translator/translator.cpp	2012-03-07 14:22:29 +0000
+++ src/compiler/translator/translator.cpp	2012-03-15 04:19:18 +0000
@@ -3917,6 +3917,10 @@
     RAISE_ERROR(err::XPST0003, loc,
     ERROR_PARAMS(ZED(XPST0003_XQueryVersionAtLeast30_2), theSctx->xquery_version()));
 
+  if (theSctx->is_context_item_type_set())
+  {
+    RAISE_ERROR_NO_PARAMS(err::XQST0099, loc);
+  }
   theHaveContextItemDecl = true;
 
   return no_state;

=== modified file 'src/context/root_static_context.cpp'
--- src/context/root_static_context.cpp	2012-01-23 10:06:24 +0000
+++ src/context/root_static_context.cpp	2012-03-15 04:19:18 +0000
@@ -93,8 +93,6 @@
 
   set_default_function_ns(W3C_FN_NS, true, loc);
 
-  set_context_item_type(GENV_TYPESYSTEM.ITEM_TYPE_ONE);
-
   add_collation(ZORBA_DEF_COLLATION_NS, QueryLoc::null);
   add_collation(W3C_CODEPT_COLLATION_NS, QueryLoc::null);
   set_default_collation(W3C_CODEPT_COLLATION_NS, QueryLoc::null);

=== modified file 'src/context/static_context.cpp'
--- src/context/static_context.cpp	2012-03-07 15:49:25 +0000
+++ src/context/static_context.cpp	2012-03-15 04:19:18 +0000
@@ -554,6 +554,7 @@
   theHaveDefaultElementNamespace(false),
   theHaveDefaultFunctionNamespace(false),
   theContextItemType(GENV_TYPESYSTEM.ITEM_TYPE_ONE),
+  theContextItemTypeSet(false),
   theVariablesMap(NULL),
   theImportedPrivateVariablesMap(NULL),
   theFunctionMap(NULL),
@@ -602,6 +603,7 @@
   theHaveDefaultElementNamespace(false),
   theHaveDefaultFunctionNamespace(false),
   theContextItemType(GENV_TYPESYSTEM.ITEM_TYPE_ONE),
+  theContextItemTypeSet(false),
   theVariablesMap(NULL),
   theImportedPrivateVariablesMap(NULL),
   theFunctionMap(NULL),
@@ -655,6 +657,7 @@
   theHaveDefaultElementNamespace(false),
   theHaveDefaultFunctionNamespace(false),
   theContextItemType(GENV_TYPESYSTEM.ITEM_TYPE_ONE),
+  theContextItemTypeSet(false),
   theVariablesMap(NULL),
   theImportedPrivateVariablesMap(NULL),
   theFunctionMap(NULL),
@@ -961,6 +964,7 @@
   ar & theHaveDefaultFunctionNamespace;
 
   ar & theContextItemType;
+  ar & theContextItemTypeSet;
 
   ar & theVariablesMap;
   ar & theImportedPrivateVariablesMap;     
@@ -2218,12 +2222,31 @@
 }
 
 
+/*******************************************************************************
+
+********************************************************************************/
+bool static_context::is_context_item_type_set() const
+{
+  const static_context* sctx = this;
+  while (sctx != NULL)
+  {
+    if (sctx->theContextItemTypeSet)
+      return true;
+
+    sctx = sctx->theParent;
+  }
+
+  return false;
+}
+
+
 /***************************************************************************//**
 
 ********************************************************************************/
 void static_context::set_context_item_type(const xqtref_t& t)
 {
   theContextItemType = t;
+  theContextItemTypeSet = true;
 }
 
 

=== modified file 'src/context/static_context.h'
--- src/context/static_context.h	2012-03-07 15:49:25 +0000
+++ src/context/static_context.h	2012-03-15 04:19:18 +0000
@@ -520,6 +520,7 @@
   bool                                    theHaveDefaultFunctionNamespace;
 
   xqtref_t                                theContextItemType;
+  bool                                    theContextItemTypeSet;
 
   VariableMap                           * theVariablesMap;
   
@@ -798,6 +799,8 @@
     bool returnPrivateVars = false,
     bool externalVarsOnly = false) const;
 
+  bool is_context_item_type_set() const;
+
   void set_context_item_type(const xqtref_t& t);
 
   const XQType* get_context_item_type() const;

=== modified file 'src/diagnostics/diagnostic_en.xml'
--- src/diagnostics/diagnostic_en.xml	2012-03-12 23:43:56 +0000
+++ src/diagnostics/diagnostic_en.xml	2012-03-15 04:19:18 +0000
@@ -716,6 +716,13 @@
       <value>properties "$1" and "$2", representing characters used in picture string, do not have distinct values</value>
     </diagnostic>
 
+    <diagnostic code="XQST0099">
+      <comment>
+        If a module contains more than one context item declaration, a static error is raised [err:XQST0099].
+      </comment>
+      <value>module contains more than one context item declaration</value>
+    </diagnostic>
+
     <diagnostic code="XQST0106">
       <comment>
        It is a static error if a function's annotations contain more than one

=== modified file 'src/diagnostics/pregenerated/diagnostic_list.cpp'
--- src/diagnostics/pregenerated/diagnostic_list.cpp	2012-03-12 23:43:56 +0000
+++ src/diagnostics/pregenerated/diagnostic_list.cpp	2012-03-15 04:19:18 +0000
@@ -241,6 +241,9 @@
 XQueryErrorCode XQST0098( "XQST0098" );
 
 
+XQueryErrorCode XQST0099( "XQST0099" );
+
+
 XQueryErrorCode XQST0106( "XQST0106" );
 
 

=== modified file 'src/diagnostics/pregenerated/dict_en.cpp'
--- src/diagnostics/pregenerated/dict_en.cpp	2012-03-12 23:43:56 +0000
+++ src/diagnostics/pregenerated/dict_en.cpp	2012-03-15 04:19:18 +0000
@@ -178,6 +178,7 @@
   { "XQST0090", "\"$1\": invalid character reference in XML $2" },
   { "XQST0093", "\"$1\": module must not depend on itself" },
   { "XQST0098", "properties \"$1\" and \"$2\", representing characters used in picture string, do not have distinct values" },
+  { "XQST0099", "module contains more than one context item declaration" },
   { "XQST0106", "$1: multiple annotations with $2 names" },
   { "XQST0111", "$1" },
   { "XQTY0024", "element constructor content sequence must not have an attribute node following a non-attribute node" },

=== added file 'test/rbkt/Queries/zorba/misc/context-item-decl01.spec'
--- test/rbkt/Queries/zorba/misc/context-item-decl01.spec	1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/misc/context-item-decl01.spec	2012-03-15 04:19:18 +0000
@@ -0,0 +1,1 @@
+Error: http://www.w3.org/2005/xqt-errors:XQST0099

=== added file 'test/rbkt/Queries/zorba/misc/context-item-decl01.xq'
--- test/rbkt/Queries/zorba/misc/context-item-decl01.xq	1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/misc/context-item-decl01.xq	2012-03-15 04:19:18 +0000
@@ -0,0 +1,5 @@
+declare context item as item() := 2;
+
+declare context item as xs:string := "3";
+
+.

=== modified file 'test/unit/context_item.cpp'
--- test/unit/context_item.cpp	2011-12-30 17:55:53 +0000
+++ test/unit/context_item.cpp	2012-03-15 04:19:18 +0000
@@ -97,16 +97,9 @@
     std::ostringstream resultStream;
 
     {
-      zorba::TypeIdentifier_t type =
-      zorba::TypeIdentifier::createNamedType("http://www.w3.org/2001/XMLSchema";,
-                                             "integer");
-
       zorba::Item ctxValue = zorba->getItemFactory()->createString("foo");
 
-      zorba::StaticContext_t sctx = zorba->createStaticContext();
-      sctx->setContextItemStaticType(type);
-
-      zorba::XQuery_t query = zorba->compileQuery(queryStream, sctx);
+      zorba::XQuery_t query = zorba->compileQuery(queryStream);
 
       Zorba_SerializerOptions serOptions;
       serOptions.omit_xml_declaration = ZORBA_OMIT_XML_DECLARATION_YES;
@@ -138,6 +131,46 @@
   return 0;
 }
 
+int test_3(zorba::Zorba* zorba)
+{
+  try
+  {
+    std::ifstream queryStream("context_item2.xq");
+    assert(queryStream.good());
+    std::ostringstream resultStream;
+
+    {
+      zorba::TypeIdentifier_t type =
+      zorba::TypeIdentifier::createNamedType("http://www.w3.org/2001/XMLSchema";,
+                                             "integer");
+
+      zorba::Item ctxValue = zorba->getItemFactory()->createString("foo");
+
+      zorba::StaticContext_t sctx = zorba->createStaticContext();
+      sctx->setContextItemStaticType(type);
+
+      zorba::XQuery_t query = zorba->compileQuery(queryStream, sctx);
+
+      zorba::DynamicContext* dctx = query->getDynamicContext();
+      dctx->setContextItem(ctxValue);
+
+      query->execute(resultStream);
+
+      return 5;
+    }
+  }
+  catch (zorba::XQueryException& qe)
+  {
+    std::cerr << qe << std::endl;
+    if (qe.diagnostic() == zorba::err::XQST0099)
+    {
+      return 0;
+    }
+    return 1;
+  }
+
+  return 2;
+}
 
 int context_item(int argc, char* argv[]) 
 {
@@ -150,9 +183,11 @@
 
   int result2 = test_2(zorba);
 
+  int result3 = test_3(zorba);
+
   zorba->shutdown();
   zorba::StoreManager::shutdownStore(store);
-  return result1 + result2;
+  return result1 + result2 + result3;
 }
 
 /* vim:set et sw=2 ts=2: */

-- 
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