Merge lp:~zorba-coders/zorba/bug1064978_xqxq_bind_cast_variable into lp:zorba

Proposed by Juan Zacarias
Status: Needs review
Proposed branch: lp:~zorba-coders/zorba/bug1064978_xqxq_bind_cast_variable
Merge into: lp:zorba
Diff against target: 409 lines (+249/-1)
19 files modified
include/zorba/dynamic_context.h (+15/-0)
modules/xqxq/xqxq.xq (+78/-0)
modules/xqxq/xqxq.xq.src/xqxq.cpp (+45/-0)
modules/xqxq/xqxq.xq.src/xqxq.h (+20/-0)
src/api/dynamiccontextimpl.cpp (+44/-1)
src/api/dynamiccontextimpl.h (+6/-0)
test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable.xml.res (+1/-0)
test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable2.xml.res (+1/-0)
test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable3.xml.res (+1/-0)
test/rbkt/ExpQueryResults/zorba/xqxq/variable-type.xml.res (+1/-0)
test/rbkt/Queries/zorba/xqxq/bind-cast-variable.xq (+4/-0)
test/rbkt/Queries/zorba/xqxq/bind-cast-variable2.xq (+4/-0)
test/rbkt/Queries/zorba/xqxq/bind-cast-variable3.xq (+4/-0)
test/rbkt/Queries/zorba/xqxq/bind-cast-variable4.spec (+1/-0)
test/rbkt/Queries/zorba/xqxq/bind-cast-variable4.xq (+4/-0)
test/rbkt/Queries/zorba/xqxq/query-plan3.xq (+1/-0)
test/rbkt/Queries/zorba/xqxq/variable-type.xq (+13/-0)
test/rbkt/Queries/zorba/xqxq/variable-type2.spec (+1/-0)
test/rbkt/Queries/zorba/xqxq/variable-type2.xq (+5/-0)
To merge this branch: bzr merge lp:~zorba-coders/zorba/bug1064978_xqxq_bind_cast_variable
Reviewer Review Type Date Requested Status
Juan Zacarias Pending
Review via email: mp+160214@code.launchpad.net

Commit message

*Implementation of Dynamic Context function getVariableType.
*Included new Function getVariableType to the dynamicContext API.
*Implementation of new xqxq functions: xqxq:variable-type
and xqxq:bind-cast-variable.

Description of the change

*Implementation of Dynamic Context function getVariableType.
*Included new Function getVariableType to the dynamicContext API.
*Implementation of new xqxq functions: xqxq:variable-type
and xqxq:bind-cast-variable.

To post a comment you must log in.
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :
Revision history for this message
Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~zorba-coders/zorba/bug1064978_xqxq_bind_cast_variable into lp:zorba failed. Below is the output from the failed tests.

CMake Error at /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake:275 (message):
  Validation queue job
  bug1064978_xqxq_bind_cast_variable-2013-04-22T21-34-44.988Z is finished.
  The final status was:

  2 tests did not succeed - changes not commited.

Error in read script: /home/ceej/zo/testing/zorbatest/tester/TarmacLander.cmake

Unmerged revisions

11397. By Juan Zacarias

*Implmentation of Dynamic Context function getVariableType.
*Included new Function getVariableType to the dynamicContext API.
*Implementation of new xqxq functions: xqxq:variable-type
and xqxq:bind-cast-variable.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'include/zorba/dynamic_context.h'
--- include/zorba/dynamic_context.h 2013-03-13 16:17:38 +0000
+++ include/zorba/dynamic_context.h 2013-04-22 21:33:28 +0000
@@ -133,6 +133,21 @@
133 Item& aItem,133 Item& aItem,
134 Iterator_t& aIterator) const = 0;134 Iterator_t& aIterator) const = 0;
135135
136 /** \brief Returns the type of an external variable.
137 *
138 * The named external variable may be located in the main query or in any
139 * modules imported directly or indirectly by the query.
140 *
141 * @param aNamespace the namespace URI of the variable's expanded QName
142 * @param aLocalname the local name of the variable's expanded QName
143 * @param outType a String representing the type of
144 * the external variable.
145 * @return true if the variable has been retrieved successfully, false otherwise.
146 * @throw ZorbaException if an error occured.
147 */
148 virtual bool
149 getVariableType(const String& aNamespace, const String& aLocalname, String& outType) = 0;
150
136 /** \brief Defines the context item.151 /** \brief Defines the context item.
137 *152 *
138 * @param aItem the Item that is used as value for the context item.153 * @param aItem the Item that is used as value for the context item.
139154
=== modified file 'modules/xqxq/xqxq.xq'
--- modules/xqxq/xqxq.xq 2013-04-09 14:22:41 +0000
+++ modules/xqxq/xqxq.xq 2013-04-22 21:33:28 +0000
@@ -25,6 +25,9 @@
25 :)25 :)
26module namespace xqxq = 'http://www.zorba-xquery.com/modules/xqxq';26module namespace xqxq = 'http://www.zorba-xquery.com/modules/xqxq';
2727
28import module namespace parse-xml = "http://www.zorba-xquery.com/modules/xml";
29import schema namespace opt = "http://www.zorba-xquery.com/modules/xml-options";
30
28declare namespace an = "http://www.zorba-xquery.com/annotations";31declare namespace an = "http://www.zorba-xquery.com/annotations";
29declare namespace ver = "http://www.zorba-xquery.com/options/versioning";32declare namespace ver = "http://www.zorba-xquery.com/options/versioning";
30declare namespace op = "http://www.zorba-xquery.com/options/features";33declare namespace op = "http://www.zorba-xquery.com/options/features";
@@ -462,6 +465,81 @@
462 $resolver as item()?, $mapper as item()?) as xs:anyURI external;465 $resolver as item()?, $mapper as item()?) as xs:anyURI external;
463466
464(:~467(:~
468 : This function returns the type of a variable that is bound in the
469 : given query.
470 :
471 : @param $query-key the identifier of a compiled query.
472 : @param $var-name the name of the variable whose value should be returned.
473 :
474 : @return the type of the given variable.
475 :
476 : @error xqxq:NoQueryMatch if no query with the given identifier
477 : was prepared.
478 : @error xqxq:UndeclaredVariable if the given variable is not declared
479 : in the query.
480 : @error xqxq:UnboundVariable if the given variable doesn't have a value.
481 :)
482declare function xqxq:variable-type($query-key as xs:anyURI, $var-name as
483 xs:QName) as xs:string external;
484
485(:~
486 : This function uses a string value to bind the value of an external variable
487 : by trying to cast the string to the corresponding type defined in the query.
488 : Currently the types supported for automatic casting are: xs:string*, xs:integer*,
489 : xs:int*, xs:long*, xs:short*, xs:decimal*, xs:double*, xs:float*, xs:date*,
490 : xs:time*, xs:dateTime*, object()*, array()*, document-node()* and element()*.
491 : If the variable doesn't have a defined type xs:string is assumed.
492 :
493 : NOTE: if the user wants to set the variable using an item() the use of
494 : xqxq:bind-variable is suggested.
495 :
496 : @param $query-key the identifier for a compiled query
497 : @param $name the name of the external variable to bind
498 : @param $value the sequence of strings to which the external variable $name
499 : should be casted and set
500 :
501 : @return the function has side effects and returns the empty
502 : sequence.
503 :
504 : @error xqxq:NoQueryMatch if no query with the given identifier
505 : was prepared.
506 : @error xqxq:UndeclaredVariable if the given variable is not declared
507 : in the query.
508 :)
509declare %an:sequential function xqxq:bind-cast-variable($query-key as xs:anyURI, $var-name as
510 xs:QName, $value as xs:string*) as empty-sequence()
511{
512 variable $type := xqxq:variable-type($query-key, $var-name);
513 variable $unquanttype := fn:replace($type, "[*+?]$", "");
514 variable $casted-value :=
515 if (fn:contains($unquanttype, "object")) then
516 for $val in $value return jn:parse-json($val)
517 else if (fn:contains($unquanttype, "array")) then
518 for $val in $value return jn:parse-json($val)
519 else if (fn:contains($unquanttype, "document-node")) then
520 for $val in $value return fn:parse-xml($val)
521 else if (fn:contains($unquanttype, "element")) then
522 for $val in $value return parse-xml:parse($val,
523 <opt:options>
524 <opt:parse-external-parsed-entity/>
525 </opt:options>)
526 else
527 if ($unquanttype eq "xs:anyType")
528 then $value
529 else
530 {
531 variable $caster := xqxq:prepare-main-module(
532 fn:concat("declare variable $val as xs:string* external; ",
533 "for $v in $val return $v cast as ",
534 $unquanttype));
535 xqxq:bind-variable($caster, xs:QName("val"), $value);
536 xqxq:evaluate($caster)
537 };
538
539 xqxq:bind-variable($query-key, $var-name, $casted-value)
540};
541
542(:~
465 : Internal helper function. Only necessary because of incomplete HOF543 : Internal helper function. Only necessary because of incomplete HOF
466 : support in Zorba.544 : support in Zorba.
467 :)545 :)
468546
=== modified file 'modules/xqxq/xqxq.xq.src/xqxq.cpp'
--- modules/xqxq/xqxq.xq.src/xqxq.cpp 2013-04-15 12:07:41 +0000
+++ modules/xqxq/xqxq.xq.src/xqxq.cpp 2013-04-22 21:33:28 +0000
@@ -93,6 +93,10 @@
93 {93 {
94 lFunc = new LoadFromQueryPlanFunction(this);94 lFunc = new LoadFromQueryPlanFunction(this);
95 }95 }
96 else if (localName == "variable-type")
97 {
98 lFunc = new VariableTypeFunction(this);
99 }
96 }100 }
97 101
98 return lFunc;102 return lFunc;
@@ -1093,6 +1097,47 @@
1093 return ItemSequence_t(new SingletonItemSequence(XQXQModule::getItemFactory()->createAnyURI(lStrUUID)));1097 return ItemSequence_t(new SingletonItemSequence(XQXQModule::getItemFactory()->createAnyURI(lStrUUID)));
1094}1098}
10951099
1100/*******************************************************************************
1101
1102 ********************************************************************************/
1103zorba::ItemSequence_t VariableTypeFunction::evaluate(
1104 const Arguments_t& aArgs,
1105 const zorba::StaticContext* aSctx,
1106 const zorba::DynamicContext* aDctx) const
1107{
1108 String lQueryID = XQXQFunction::getOneStringArgument(aArgs,0);
1109
1110 QueryMap* lQueryMap;
1111 if (!(lQueryMap= dynamic_cast<QueryMap*>(aDctx->getExternalFunctionParameter("xqxqQueryMap"))))
1112 {
1113 throwError("NoQueryMatch", "String identifying query does not exists.");
1114 }
1115
1116 XQuery_t lQuery = getQuery(aDctx, lQueryID);
1117
1118 Item lVarQName = XQXQFunction::getItemArgument(aArgs, 1);
1119
1120 zorba::DynamicContext* lCtx = lQuery->getDynamicContext();
1121 zorba::String lNS = lVarQName.getNamespace(), lLocal = lVarQName.getLocalName();
1122 zorba::String lType;
1123 try
1124 {
1125 if(!lCtx->getVariableType(lNS, lLocal, lType))
1126 {
1127 std::ostringstream lMsg;
1128 lMsg << lLocal << ": variable not bound";
1129 XQXQFunction::throwError("UndeclaredVariable", lMsg.str());
1130 }
1131 }
1132 catch (ZorbaException& ze)
1133 {
1134 if (ze.diagnostic() == zerr::ZAPI0011_VARIABLE_NOT_DECLARED)
1135 XQXQFunction::throwError("UndeclaredVariable", ze.what());
1136 throw; // should not happen
1137 }
1138 return ItemSequence_t(new SingletonItemSequence(XQXQModule::getItemFactory()->createString(lType)));
1139}
1140
1096}/*namespace xqxq*/ }/*namespace zorba*/1141}/*namespace xqxq*/ }/*namespace zorba*/
10971142
1098#ifdef WIN321143#ifdef WIN32
10991144
=== modified file 'modules/xqxq/xqxq.xq.src/xqxq.h'
--- modules/xqxq/xqxq.xq.src/xqxq.h 2013-04-15 12:07:41 +0000
+++ modules/xqxq/xqxq.xq.src/xqxq.h 2013-04-22 21:33:28 +0000
@@ -645,6 +645,26 @@
645 getURLResolver(size_t i) const { return theUrlResolvers.size() < i? NULL : theUrlResolvers[i]; }645 getURLResolver(size_t i) const { return theUrlResolvers.size() < i? NULL : theUrlResolvers[i]; }
646 };646 };
647};647};
648
649/*******************************************************************************
650
651********************************************************************************/
652class VariableTypeFunction : public XQXQFunction
653{
654public:
655 VariableTypeFunction(const XQXQModule* aModule) : XQXQFunction(aModule) {}
656
657 virtual ~VariableTypeFunction() {}
658
659 virtual zorba::String
660 getLocalName() const {return "variable-type"; }
661
662 virtual zorba::ItemSequence_t
663 evaluate(const Arguments_t&,
664 const zorba::StaticContext*,
665 const zorba::DynamicContext*) const;
666};
667
648}/*xqxq namespace*/}/*zorba namespace*/668}/*xqxq namespace*/}/*zorba namespace*/
649669
650670
651671
=== modified file 'src/api/dynamiccontextimpl.cpp'
--- src/api/dynamiccontextimpl.cpp 2013-03-13 16:17:38 +0000
+++ src/api/dynamiccontextimpl.cpp 2013-04-22 21:33:28 +0000
@@ -225,7 +225,50 @@
225 return false;225 return false;
226}226}
227227
228228/****************************************************************************//**
229
230********************************************************************************/
231bool DynamicContextImpl::getVariableType(
232 const String& inNamespace,
233 const String& inLocalname,
234 String& outType)
235{
236 ZORBA_DCTX_TRY
237 {
238 checkNoIterators();
239
240 const zstring& nameSpace = Unmarshaller::getInternalString(inNamespace);
241 const zstring& localName = Unmarshaller::getInternalString(inLocalname);
242
243 VarInfo* var = NULL;
244
245 try
246 {
247 var = get_var_info(nameSpace, localName);
248
249 const XQType* varType = var->getType();
250
251 if (!varType)
252 outType = "xs:anyType";
253 else
254 outType = varType->toSchemaString();
255 }
256 catch (ZorbaException const& e)
257 {
258 // Normally, we should be throwing an exception if the variable has not
259 // been declared inside the xquery program, but this cases many failures
260 // with the w3c XQTS.
261 if (e.diagnostic() == err::XPST0008)
262 {
263 return false;
264 }
265 throw;
266 }
267 return true;
268 }
269 ZORBA_DCTX_CATCH
270 return false;
271}
229/****************************************************************************//**272/****************************************************************************//**
230273
231********************************************************************************/274********************************************************************************/
232275
=== modified file 'src/api/dynamiccontextimpl.h'
--- src/api/dynamiccontextimpl.h 2013-03-13 16:17:38 +0000
+++ src/api/dynamiccontextimpl.h 2013-04-22 21:33:28 +0000
@@ -90,6 +90,12 @@
90 Item& outItem,90 Item& outItem,
91 Iterator_t& outIterator) const;91 Iterator_t& outIterator) const;
9292
93 virtual bool
94 getVariableType(
95 const String& inNamespace,
96 const String& inLocalname,
97 String& outType);
98
93 virtual bool99 virtual bool
94 setVariable(100 setVariable(
95 const String& inVarName,101 const String& inVarName,
96102
=== added file 'test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable.xml.res'
--- test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable.xml.res 1970-01-01 00:00:00 +0000
+++ test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable.xml.res 2013-04-22 21:33:28 +0000
@@ -0,0 +1,1 @@
12 3
0\ No newline at end of file2\ No newline at end of file
13
=== added file 'test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable2.xml.res'
--- test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable2.xml.res 1970-01-01 00:00:00 +0000
+++ test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable2.xml.res 2013-04-22 21:33:28 +0000
@@ -0,0 +1,1 @@
12
0\ No newline at end of file2\ No newline at end of file
13
=== added file 'test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable3.xml.res'
--- test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable3.xml.res 1970-01-01 00:00:00 +0000
+++ test/rbkt/ExpQueryResults/zorba/xqxq/bind-cast-variable3.xml.res 2013-04-22 21:33:28 +0000
@@ -0,0 +1,1 @@
1success
0\ No newline at end of file2\ No newline at end of file
13
=== added file 'test/rbkt/ExpQueryResults/zorba/xqxq/variable-type.xml.res'
--- test/rbkt/ExpQueryResults/zorba/xqxq/variable-type.xml.res 1970-01-01 00:00:00 +0000
+++ test/rbkt/ExpQueryResults/zorba/xqxq/variable-type.xml.res 2013-04-22 21:33:28 +0000
@@ -0,0 +1,1 @@
1xs:integer xs:string xs:dateTime object() element(*, xs:anyType?)
0\ No newline at end of file2\ No newline at end of file
13
=== added file 'test/rbkt/Queries/zorba/xqxq/bind-cast-variable.xq'
--- test/rbkt/Queries/zorba/xqxq/bind-cast-variable.xq 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/xqxq/bind-cast-variable.xq 2013-04-22 21:33:28 +0000
@@ -0,0 +1,4 @@
1import module namespace xqxq = 'http://www.zorba-xquery.com/modules/xqxq';
2variable $queryID := xqxq:prepare-main-module('declare variable $ext as xs:integer* external; for $i in $ext return $i+1');
3xqxq:bind-cast-variable( $queryID, xs:QName("ext"), ('1', '2'));
4xqxq:evaluate($queryID)
0\ No newline at end of file5\ No newline at end of file
16
=== added file 'test/rbkt/Queries/zorba/xqxq/bind-cast-variable2.xq'
--- test/rbkt/Queries/zorba/xqxq/bind-cast-variable2.xq 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/xqxq/bind-cast-variable2.xq 2013-04-22 21:33:28 +0000
@@ -0,0 +1,4 @@
1import module namespace xqxq = 'http://www.zorba-xquery.com/modules/xqxq';
2variable $queryID := xqxq:prepare-main-module('declare variable $ext as object() external; $ext("value")+1');
3xqxq:bind-cast-variable( $queryID, xs:QName("ext"), '{ "value" : 1}');
4xqxq:evaluate($queryID)
0\ No newline at end of file5\ No newline at end of file
16
=== added file 'test/rbkt/Queries/zorba/xqxq/bind-cast-variable3.xq'
--- test/rbkt/Queries/zorba/xqxq/bind-cast-variable3.xq 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/xqxq/bind-cast-variable3.xq 2013-04-22 21:33:28 +0000
@@ -0,0 +1,4 @@
1import module namespace xqxq = 'http://www.zorba-xquery.com/modules/xqxq';
2variable $queryID := xqxq:prepare-main-module('declare variable $ext as element() external; $ext//b[@id = 131]/text()');
3xqxq:bind-cast-variable( $queryID, xs:QName("ext"), '<a><b id="131">success</b><b id="2">foo</b></a>');
4xqxq:evaluate($queryID)
0\ No newline at end of file5\ No newline at end of file
16
=== added file 'test/rbkt/Queries/zorba/xqxq/bind-cast-variable4.spec'
--- test/rbkt/Queries/zorba/xqxq/bind-cast-variable4.spec 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/xqxq/bind-cast-variable4.spec 2013-04-22 21:33:28 +0000
@@ -0,0 +1,1 @@
1Error: http://www.zorba-xquery.com/modules/xqxq:UndeclaredVariable
0\ No newline at end of file2\ No newline at end of file
13
=== added file 'test/rbkt/Queries/zorba/xqxq/bind-cast-variable4.xq'
--- test/rbkt/Queries/zorba/xqxq/bind-cast-variable4.xq 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/xqxq/bind-cast-variable4.xq 2013-04-22 21:33:28 +0000
@@ -0,0 +1,4 @@
1import module namespace xqxq = 'http://www.zorba-xquery.com/modules/xqxq';
2variable $queryID := xqxq:prepare-main-module('declare variable $ext external; $ext');
3xqxq:bind-cast-variable( $queryID, xs:QName("ext2"), '2');
4xqxq:evaluate($queryID)
0\ No newline at end of file5\ No newline at end of file
16
=== modified file 'test/rbkt/Queries/zorba/xqxq/query-plan3.xq'
--- test/rbkt/Queries/zorba/xqxq/query-plan3.xq 2013-03-22 23:09:40 +0000
+++ test/rbkt/Queries/zorba/xqxq/query-plan3.xq 2013-04-22 21:33:28 +0000
@@ -26,3 +26,4 @@
26variable $query-plan := xqxq:query-plan($queryID); 26variable $query-plan := xqxq:query-plan($queryID);
27variable $queryID2 := xqxq:load-from-query-plan($query-plan, resolver:url-resolver#2, mapper:uri-mapper#2);27variable $queryID2 := xqxq:load-from-query-plan($query-plan, resolver:url-resolver#2, mapper:uri-mapper#2);
28xqxq:evaluate ($queryID2)28xqxq:evaluate ($queryID2)
29
2930
=== added file 'test/rbkt/Queries/zorba/xqxq/variable-type.xq'
--- test/rbkt/Queries/zorba/xqxq/variable-type.xq 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/xqxq/variable-type.xq 2013-04-22 21:33:28 +0000
@@ -0,0 +1,13 @@
1import module namespace xqxq = 'http://www.zorba-xquery.com/modules/xqxq';
2
3variable $queryID := xqxq:prepare-main-module('declare variable $ext as xs:integer external; $ext');
4variable $queryID2 := xqxq:prepare-main-module('declare variable $ext as xs:string external; $ext');
5variable $queryID3 := xqxq:prepare-main-module('declare variable $ext as xs:dateTime external; $ext');
6variable $queryID4 := xqxq:prepare-main-module('declare variable $ext as object() external; $ext');
7variable $queryID5 := xqxq:prepare-main-module('declare variable $ext as element() external; $ext');
8
9xqxq:variable-type($queryID, xs:QName('ext')),
10xqxq:variable-type($queryID2, xs:QName('ext')),
11xqxq:variable-type($queryID3, xs:QName('ext')),
12xqxq:variable-type($queryID4, xs:QName('ext')),
13xqxq:variable-type($queryID5, xs:QName('ext'))
0\ No newline at end of file14\ No newline at end of file
115
=== added file 'test/rbkt/Queries/zorba/xqxq/variable-type2.spec'
--- test/rbkt/Queries/zorba/xqxq/variable-type2.spec 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/xqxq/variable-type2.spec 2013-04-22 21:33:28 +0000
@@ -0,0 +1,1 @@
1Error: http://www.zorba-xquery.com/modules/xqxq:UndeclaredVariable
0\ No newline at end of file2\ No newline at end of file
13
=== added file 'test/rbkt/Queries/zorba/xqxq/variable-type2.xq'
--- test/rbkt/Queries/zorba/xqxq/variable-type2.xq 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/xqxq/variable-type2.xq 2013-04-22 21:33:28 +0000
@@ -0,0 +1,5 @@
1import module namespace xqxq = 'http://www.zorba-xquery.com/modules/xqxq';
2
3variable $queryID := xqxq:prepare-main-module('declare variable $ext as xs:integer external; $ext');
4
5xqxq:variable-type($queryID, xs:QName('ext2'))
0\ No newline at end of file6\ No newline at end of file

Subscribers

People subscribed via source and target branches