zorba-coders team mailing list archive
-
zorba-coders team
-
Mailing list archive
-
Message #10362
[Merge] lp:~zorba-coders/zorba/bug-991088 into lp:zorba
Markos Zaharioudakis has proposed merging lp:~zorba-coders/zorba/bug-991088 into lp:zorba.
Requested reviews:
Markos Zaharioudakis (markos-za)
For more details, see:
https://code.launchpad.net/~zorba-coders/zorba/bug-991088/+merge/108535
Fixed bug #991088$ (raise XUST0001 in trycatch with mixed updating and simple clauses)
--
https://code.launchpad.net/~zorba-coders/zorba/bug-991088/+merge/108535
Your team Zorba Coders is subscribed to branch lp:zorba.
=== modified file 'ChangeLog'
--- ChangeLog 2012-05-30 00:37:00 +0000
+++ ChangeLog 2012-06-04 10:13:32 +0000
@@ -1,5 +1,9 @@
Zorba - The XQuery Processor
+version 2.7
+
+ * Fixed bug #991088$ (raise XUST0001 in trycatch with mixed updating and simple clauses)
+
version 2.5
New Features:
=== modified file 'src/compiler/expression/expr.cpp'
--- src/compiler/expression/expr.cpp 2012-05-16 17:25:48 +0000
+++ src/compiler/expression/expr.cpp 2012-06-04 10:13:32 +0000
@@ -23,6 +23,7 @@
#include <map>
#include "diagnostics/assert.h"
+#include "diagnostics/util_macros.h"
#include "diagnostics/xquery_diagnostics.h"
#include "system/globalenv.h"
@@ -190,15 +191,11 @@
{
if (theThenExpr->is_updating() && !theElseExpr->is_updating_or_vacuous())
{
- throw XQUERY_EXCEPTION(err::XUST0001,
- ERROR_PARAMS(ZED(XUST0001_IF)),
- ERROR_LOC(get_loc()));
+ RAISE_ERROR(err::XUST0001, get_loc(), ERROR_PARAMS(ZED(XUST0001_IF)));
}
else if (theElseExpr->is_updating() && !theThenExpr->is_updating_or_vacuous())
{
- throw XQUERY_EXCEPTION(err::XUST0001,
- ERROR_PARAMS(ZED(XUST0001_IF)),
- ERROR_LOC(get_loc()));
+ RAISE_ERROR(err::XUST0001, get_loc(), ERROR_PARAMS(ZED(XUST0001_IF)));
}
else
{
@@ -1294,22 +1291,47 @@
void trycatch_expr::compute_scripting_kind()
{
- theScriptingKind = SIMPLE_EXPR;
+ bool vacuous = true;
+
+ theScriptingKind = VACUOUS_EXPR;
theScriptingKind |= theTryExpr->get_scripting_detail();
- ulong numCatchClauses = (ulong)theCatchClauses.size();
-
- for (ulong i = 0; i < numCatchClauses; ++i)
+ if (theScriptingKind != VACUOUS_EXPR)
+ vacuous = false;
+
+ csize numCatchClauses = theCatchClauses.size();
+
+ for (csize i = 0; i < numCatchClauses; ++i)
{
const expr* catchExpr = theCatchExprs[i].getp();
-
short catchKind = catchExpr->get_scripting_detail();
+ if (catchKind == VACUOUS_EXPR)
+ continue;
+
+ vacuous = false;
+
+ if (!theSctx->is_feature_set(feature::scripting))
+ {
+ if (is_updating() && !(catchKind & UPDATING_EXPR) && catchKind != VACUOUS_EXPR)
+ {
+ RAISE_ERROR(err::XUST0001, catchExpr->get_loc(),
+ ERROR_PARAMS(ZED(XUST0001_TRYCATCH)));
+ }
+
+ if (!is_updating() && !is_vacuous() && (catchKind & UPDATING_EXPR))
+ {
+ RAISE_ERROR(err::XUST0001, catchExpr->get_loc(),
+ ERROR_PARAMS(ZED(XUST0001_TRYCATCH)));
+ }
+ }
+
theScriptingKind |= catchKind;
}
- theScriptingKind &= ~VACUOUS_EXPR;
+ if (!vacuous)
+ theScriptingKind &= ~VACUOUS_EXPR;
if (theScriptingKind & UPDATING_EXPR)
theScriptingKind &= ~SIMPLE_EXPR;
=== modified file 'src/diagnostics/diagnostic_en.xml'
--- src/diagnostics/diagnostic_en.xml 2012-05-18 22:01:56 +0000
+++ src/diagnostics/diagnostic_en.xml 2012-06-04 10:13:32 +0000
@@ -1205,6 +1205,10 @@
<value>comma expression with updating and non-updating branches</value>
</entry>
+ <entry key="TRYCATCH">
+ <value>try-catch expression with updating and non-updating clauses</value>
+ </entry>
+
<entry key="Generic">
<value>updating expression illegal here</value>
</entry>
=== modified file 'src/diagnostics/pregenerated/dict_en.cpp'
--- src/diagnostics/pregenerated/dict_en.cpp 2012-05-18 22:01:56 +0000
+++ src/diagnostics/pregenerated/dict_en.cpp 2012-06-04 10:13:32 +0000
@@ -784,6 +784,7 @@
{ "~XUST0001_CONCAT", "comma expression with updating and non-updating branches" },
{ "~XUST0001_Generic", "updating expression illegal here" },
{ "~XUST0001_IF", "conditional expression with updating and non-updating branch" },
+ { "~XUST0001_TRYCATCH", "try-catch expression with updating and non-updating clauses" },
{ "~XUST0001_UDF_2", "\"$2\": function declared simple but body is updating" },
{ "~XUST0002_Transform", "transform expression witn non-updating or vacuous modify clause" },
{ "~XUST0002_UDF_2", "\"$2\": function declared updating but body is not updating or vacuous" },
=== added file 'test/rbkt/Queries/zorba/trycatch/trycatch14.spec'
--- test/rbkt/Queries/zorba/trycatch/trycatch14.spec 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/trycatch/trycatch14.spec 2012-06-04 10:13:32 +0000
@@ -0,0 +1,1 @@
+Error: http://www.w3.org/2005/xqt-errors:XUST0001
=== added file 'test/rbkt/Queries/zorba/trycatch/trycatch14.xq'
--- test/rbkt/Queries/zorba/trycatch/trycatch14.xq 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/trycatch/trycatch14.xq 2012-06-04 10:13:32 +0000
@@ -0,0 +1,9 @@
+
+declare namespace op = "http://www.zorba-xquery.com/options/features";
+
+declare option op:disable "scripting";
+
+
+try { 1 } catch * { delete node <a/> }
+
+
=== added file 'test/rbkt/Queries/zorba/trycatch/trycatch15.spec'
--- test/rbkt/Queries/zorba/trycatch/trycatch15.spec 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/trycatch/trycatch15.spec 2012-06-04 10:13:32 +0000
@@ -0,0 +1,1 @@
+Error: http://www.w3.org/2005/xqt-errors:XUST0001
=== added file 'test/rbkt/Queries/zorba/trycatch/trycatch15.xq'
--- test/rbkt/Queries/zorba/trycatch/trycatch15.xq 1970-01-01 00:00:00 +0000
+++ test/rbkt/Queries/zorba/trycatch/trycatch15.xq 2012-06-04 10:13:32 +0000
@@ -0,0 +1,7 @@
+
+declare namespace op = "http://www.zorba-xquery.com/options/features";
+
+declare option op:disable "scripting";
+
+
+try { delete node <a/> } catch * { 1 }
Follow ups