Merge lp:~zorba-coders/zorba/bug-1123161 into lp:zorba

Proposed by Paul J. Lucas on 2013-02-15
Status: Merged
Approved by: Chris Hillery on 2013-02-26
Approved revision: 11286
Merged at revision: 11258
Proposed branch: lp:~zorba-coders/zorba/bug-1123161
Merge into: lp:zorba
Diff against target: 922 lines (+383/-229)
12 files modified
ChangeLog (+6/-2)
src/diagnostics/diagnostic_en.xml (+18/-2)
src/diagnostics/pregenerated/dict_en.cpp (+10/-0)
src/diagnostics/pregenerated/dict_zed_keys.h (+5/-1)
src/util/ascii_util.cpp (+11/-5)
src/util/regex.cpp (+321/-108)
test/fots/CMakeLists.txt (+9/-106)
test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m54.xml.res (+1/-0)
test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m55.xml.res (+1/-0)
test/rbkt/Queries/CMakeLists.txt (+1/-3)
test/rbkt/Queries/zorba/string/Regex/regex_err25.spec (+0/-1)
test/rbkt/Queries/zorba/string/Regex/regex_err7.spec (+0/-1)
To merge this branch: bzr merge lp:~zorba-coders/zorba/bug-1123161
Reviewer Review Type Date Requested Status
Chris Hillery 2013-02-24 Approve on 2013-02-26
Paul J. Lucas Approve on 2013-02-26
Matthias Brantner 2013-02-23 Approve on 2013-02-26
Review via email: mp+148773@code.launchpad.net

Commit Message

Fixed 100 FOTS failures, aka, bugs.

Description of the Change

Fixed 100 FOTS failures, aka, bugs.

To post a comment you must log in.
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue job bug-1123161-2013-02-15T17-50-43.223Z is finished. The final status was:

All tests succeeded!

Zorba Build Bot (zorba-buildbot) wrote :

Voting does not meet specified criteria. Required: Approve > 1, Disapprove < 1, Needs Fixing < 1, Pending < 1. Got: 1 Pending.

Chris Hillery (ceejatec) wrote :

More detailed commit message and Changelog entry, please.

Paul J. Lucas (paul-lucas) wrote :

> More detailed commit message and Changelog entry, please.

I'm not finished yet. It was just to see if I broke anything.

Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~zorba-coders/zorba/bug-1123161 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 bug-1123161-2013-02-20T17-01-04.41Z is finished. The
  final status was:

  1 tests did not succeed - changes not commited.

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

Zorba Build Bot (zorba-buildbot) wrote :

Validation queue job bug-1123161-2013-02-20T17-53-49.766Z is finished. The final status was:

All tests succeeded!

Zorba Build Bot (zorba-buildbot) wrote :

Voting does not meet specified criteria. Required: Approve > 1, Disapprove < 1, Needs Fixing < 1, Pending < 1. Got: 1 Pending.

Paul J. Lucas (paul-lucas) :
review: Approve
Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~zorba-coders/zorba/bug-1123161 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 bug-1123161-2013-02-23T00-36-03.688Z 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

Zorba Build Bot (zorba-buildbot) wrote :

The attempt to merge lp:~zorba-coders/zorba/bug-1123161 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 bug-1123161-2013-02-23T14-57-54.588Z is finished. The
  final status was:

  8 tests did not succeed - changes not commited.

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

Zorba Build Bot (zorba-buildbot) wrote :

Validation queue job bug-1123161-2013-02-23T16-05-49.851Z is finished. The final status was:

All tests succeeded!

Zorba Build Bot (zorba-buildbot) wrote :

Voting does not meet specified criteria. Required: Approve > 1, Disapprove < 1, Needs Fixing < 1, Pending < 1. Got: 1 Approve.

Chris Hillery (ceejatec) wrote :

I do have two minor points, but they're just about comments so I'll go ahead and leave my Approve vote too.

First, one minor typo: "ahe" instead of "the" in regex.cpp.

Second, question about comment:

     //
     // The '=' is neither the first or last character within a
     // character range (i.e., a literal '-') so therefore it's
     // indicating a character range.
     //

Is there some context about '=' that I'm missing, or is that just a typo and it should be '-'?

review: Approve
review: Approve
Paul J. Lucas (paul-lucas) :
review: Needs Fixing
Paul J. Lucas (paul-lucas) wrote :

> Is there some context about '=' that I'm missing, or is that just a typo and
> it should be '-'?

Typo.

Paul J. Lucas (paul-lucas) :
review: Approve
Chris Hillery (ceejatec) :
review: Needs Fixing
Chris Hillery (ceejatec) wrote :

I re-voted to prevent this RQ run from succeeding, because it won't have Paul's typo fixes in it. I'll re-start it in a bit.

Zorba Build Bot (zorba-buildbot) wrote :

Validation queue job bug-1123161-2013-02-26T01-29-52.766Z is finished. The final status was:

All tests succeeded!

Zorba Build Bot (zorba-buildbot) wrote :

Voting does not meet specified criteria. Required: Approve > 1, Disapprove < 1, Needs Fixing < 1, Pending < 1. Got: 2 Approve, 1 Needs Fixing.

Chris Hillery (ceejatec) :
review: Approve
Zorba Build Bot (zorba-buildbot) wrote :

Validation queue job bug-1123161-2013-02-26T01-52-54.087Z is finished. The final status was:

All tests succeeded!

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'ChangeLog'
2--- ChangeLog 2013-02-15 21:39:41 +0000
3+++ ChangeLog 2013-02-26 01:37:22 +0000
4@@ -28,10 +28,14 @@
5 * Fixed bug #1111786 (xml/json parse error location in catch clause).
6 * NaN items are considered equal to each other during grouping
7 * Fixed bug #855481 (Too small time types on Windows).
8+ * Fixed bug #1132032 (Certain regexes involving ^ should be legal)
9+ * Fixed bug #1023168 (Non-single-char-escapes in regex character ranges not
10+ caught)
11+ * Fixed bug #866874 (regex "range subtraction" not supported for ICU)
12 * Fixed bug in computing the static type of an allowing-empty FOR variable.
13 * Fixed bug #1099648 and #1088886 (XML parsing failures on Red Hat)
14- * Fixed bug #1099535 (xml:parse endless loop)
15- * Fixed bug #866958 (Parsing error not explicit enough)
16+ * Fixed bug #1099535 (xml:parse endless loop)
17+ * Fixed bug #866958 (Parsing error not explicit enough)
18 * Fixed bug #867068 (Incorrect usage of XQDY0027)
19 * Fixed bug #1023362 (xsi:type attribute ignored during validation)
20
21
22=== modified file 'src/diagnostics/diagnostic_en.xml'
23--- src/diagnostics/diagnostic_en.xml 2013-02-21 14:33:24 +0000
24+++ src/diagnostics/diagnostic_en.xml 2013-02-26 01:37:22 +0000
25@@ -3222,6 +3222,10 @@
26 <value>'$3': illegal character within { }</value>
27 </entry>
28
29+ <entry key="BadEndCharInRange_34">
30+ <value>'$3': invalid end character in range (less than '$4' start character)</value>
31+ </entry>
32+
33 <entry key="BadDecDigit_3">
34 <value>'$3': invalid decimal digit</value>
35 </entry>
36@@ -3246,12 +3250,20 @@
37 <value>invalid library module</value>
38 </entry>
39
40+ <entry key="BadPath">
41+ <value>invalid path</value>
42+ </entry>
43+
44+ <entry key="BadQuantifierHere_3" if="!defined(ZORBA_NO_ICU)">
45+ <value>'$3': quantifier illegal here</value>
46+ </entry>
47+
48 <entry key="BadRegexEscape_3" if="!defined(ZORBA_NO_ICU)">
49 <value>"$3": illegal escape character</value>
50 </entry>
51
52- <entry key="BadPath">
53- <value>invalid path</value>
54+ <entry key="BadRegexParen_3" if="!defined(ZORBA_NO_ICU)">
55+ <value>"$3": illegal character after "(?"</value>
56 </entry>
57
58 <entry key="BadStreamState">
59@@ -3626,6 +3638,10 @@
60 <value>can not treat as "$4"</value>
61 </entry>
62
63+ <entry key="NotSingleCharEsc_3" if="!defined(ZORBA_NO_ICU)">
64+ <value>"\\$3": multi-character and category escapes not permitted in character range</value>
65+ </entry>
66+
67 <entry key="NoTypeInMainModule_4">
68 <value>type of variable "$4" is not among the in-scope types of the main module</value>
69 </entry>
70
71=== modified file 'src/diagnostics/pregenerated/dict_en.cpp'
72--- src/diagnostics/pregenerated/dict_en.cpp 2013-02-21 14:33:24 +0000
73+++ src/diagnostics/pregenerated/dict_en.cpp 2013-02-26 01:37:22 +0000
74@@ -549,6 +549,7 @@
75 { "~BadCharAfter_34", "'$3': illegal character after '$4'" },
76 { "~BadCharInBraces_3", "'$3': illegal character within { }" },
77 { "~BadDecDigit_3", "'$3': invalid decimal digit" },
78+ { "~BadEndCharInRange_34", "'$3': invalid end character in range (less than '$4' start character)" },
79 { "~BadFileURIAuthority_2", "\"$2\": invalid authority for \"file\" scheme" },
80 { "~BadHexSequence", "invalid hexedecimal sequence" },
81 { "~BadItem", "invalid item" },
82@@ -556,8 +557,14 @@
83 { "~BadLibraryModule", "invalid library module" },
84 { "~BadPath", "invalid path" },
85 #if !defined(ZORBA_NO_ICU)
86+ { "~BadQuantifierHere_3", "'$3': quantifier illegal here" },
87+#endif
88+#if !defined(ZORBA_NO_ICU)
89 { "~BadRegexEscape_3", "\"$3\": illegal escape character" },
90 #endif
91+#if !defined(ZORBA_NO_ICU)
92+ { "~BadRegexParen_3", "\"$3\": illegal character after \"(?\"" },
93+#endif
94 { "~BadStreamState", "bad I/O stream state" },
95 { "~BadTokenInBraces_3", "\"$3\": illegal token within { }" },
96 { "~BadTraceStream", "trace stream not retrievable using SerializationCallback" },
97@@ -726,6 +733,9 @@
98 { "~NotDocOrElementNode", "not a document or element node" },
99 { "~NotInStaticCtx", "not found in static context" },
100 { "~NotPlainFile", "not plain file" },
101+#if !defined(ZORBA_NO_ICU)
102+ { "~NotSingleCharEsc_3", "\"\\\\$3\": multi-character and category escapes not permitted in character range" },
103+#endif
104 { "~NotSpecified", "not specified" },
105 { "~OpIsSameNodeMustHaveNodes", "op:is-same-node() must have nodes as parameters" },
106 { "~OpNodeAfterMustHaveNodes", "op:node-after() must have nodes as parameters" },
107
108=== modified file 'src/diagnostics/pregenerated/dict_zed_keys.h'
109--- src/diagnostics/pregenerated/dict_zed_keys.h 2013-02-09 00:26:52 +0000
110+++ src/diagnostics/pregenerated/dict_zed_keys.h 2013-02-26 01:37:22 +0000
111@@ -129,14 +129,17 @@
112 #define ZED_BadArgTypeForFn_2o34o "~BadArgTypeForFn_2o34o"
113 #define ZED_BadCharAfter_34 "~BadCharAfter_34"
114 #define ZED_BadCharInBraces_3 "~BadCharInBraces_3"
115+#define ZED_BadEndCharInRange_34 "~BadEndCharInRange_34"
116 #define ZED_BadDecDigit_3 "~BadDecDigit_3"
117 #define ZED_BadFileURIAuthority_2 "~BadFileURIAuthority_2"
118 #define ZED_BadHexSequence "~BadHexSequence"
119 #define ZED_BadItem "~BadItem"
120 #define ZED_BadIterator "~BadIterator"
121 #define ZED_BadLibraryModule "~BadLibraryModule"
122+#define ZED_BadPath "~BadPath"
123+#define ZED_BadQuantifierHere_3 "~BadQuantifierHere_3"
124 #define ZED_BadRegexEscape_3 "~BadRegexEscape_3"
125-#define ZED_BadPath "~BadPath"
126+#define ZED_BadRegexParen_3 "~BadRegexParen_3"
127 #define ZED_BadStreamState "~BadStreamState"
128 #define ZED_BadTokenInBraces_3 "~BadTokenInBraces_3"
129 #define ZED_BadTraceStream "~BadTraceStream"
130@@ -230,6 +233,7 @@
131 #define ZED_NoSerializationCallbackForTraceStream "~NoSerializationCallbackForTraceStream"
132 #define ZED_NoSourceURI "~NoSourceURI"
133 #define ZED_NoTreatAs_4 "~NoTreatAs_4"
134+#define ZED_NotSingleCharEsc_3 "~NotSingleCharEsc_3"
135 #define ZED_NoTypeInMainModule_4 "~NoTypeInMainModule_4"
136 #define ZED_NoTypeInModule_45 "~NoTypeInModule_45"
137 #define ZED_NoURIAuthority "~NoURIAuthority"
138
139=== modified file 'src/util/ascii_util.cpp'
140--- src/util/ascii_util.cpp 2012-11-29 05:00:43 +0000
141+++ src/util/ascii_util.cpp 2013-02-26 01:37:22 +0000
142@@ -40,11 +40,17 @@
143 ostream& printable_char( ostream &o, char c ) {
144 if ( ascii::is_print( c ) )
145 o << c;
146- else {
147- ios::fmtflags const old_flags = o.flags();
148- o << "#x" << uppercase << hex << (static_cast<unsigned>( c ) & 0xFF);
149- o.flags( old_flags );
150- }
151+ else
152+ switch ( c ) {
153+ case '\n': o << "\\n"; break;
154+ case '\r': o << "\\r"; break;
155+ case '\t': o << "\\t"; break;
156+ default: {
157+ ios::fmtflags const old_flags = o.flags();
158+ o << "#x" << uppercase << hex << (static_cast<unsigned>( c ) & 0xFF);
159+ o.flags( old_flags );
160+ }
161+ }
162 return o;
163 }
164
165
166=== modified file 'src/util/regex.cpp'
167--- src/util/regex.cpp 2012-10-08 12:09:36 +0000
168+++ src/util/regex.cpp 2013-02-26 01:37:22 +0000
169@@ -51,17 +51,46 @@
170
171 using namespace std;
172
173-#define bs_c "\\p{L}\\d.:\\p{M}-" /* \c equivalent contents */
174+#define bs_c "\\p{L}_\\d.:\\p{M}-" /* \c equivalent contents */
175 #define bs_i "\\p{L}_:" /* \i equivalent contents */
176+#define bs_W "\\p{P}\\p{Z}\\p{C}" /* \W equivalent contents */
177+
178+template<typename IntegralType> inline
179+typename std::enable_if<ZORBA_TR1_NS::is_integral<IntegralType>::value,
180+ void>::type
181+dec_limit( IntegralType *i, IntegralType limit = 0 ) {
182+ if ( *i > limit )
183+ --*i;
184+}
185+
186+static unsigned digits( long n ) {
187+ unsigned d = 0;
188+ do {
189+ ++d;
190+ } while ( n /= 10 );
191+ return d;
192+}
193+
194+template<class C> inline
195+typename C::value_type peek( C const &c, typename C::const_iterator i ) {
196+ typedef typename C::value_type value_type;
197+ return ++i != c.end() ? *i : value_type();
198+}
199+
200+template<class C> inline
201+typename C::value_type peek_back( C const &c, typename C::const_iterator i ) {
202+ typedef typename C::value_type value_type;
203+ return i != c.begin() ? *--i : value_type();
204+}
205
206 namespace zorba {
207
208 ///////////////////////////////////////////////////////////////////////////////
209
210-typedef uint32_t icu_flags_t;
211+typedef uint32_t icu_flags_type;
212
213-static icu_flags_t convert_xquery_flags( char const *xq_flags ) {
214- icu_flags_t icu_flags = 0;
215+static icu_flags_type convert_xquery_flags( char const *xq_flags ) {
216+ icu_flags_type icu_flags = 0;
217 if ( xq_flags ) {
218 for ( char const *f = xq_flags; *f; ++f ) {
219 switch ( *f ) {
220@@ -89,9 +118,22 @@
221 return icu_flags;
222 }
223
224+inline bool is_char_range_begin( zstring const &s,
225+ zstring::const_iterator const &i ) {
226+ return peek( s, i ) == '-' && peek( s, i + 1 ) != '[';
227+}
228+
229+inline bool is_non_capturing_begin( zstring const &s,
230+ zstring::const_iterator const &i ) {
231+ return peek_back( s, i ) == '?' && peek_back( s, i - 1 ) == '(';
232+}
233+
234+#define IS_CHAR_RANGE_BEGIN (in_char_class && is_char_range_begin( xq_re, i ))
235+#define PEEK_C peek( xq_re, i )
236+
237 void convert_xquery_re( zstring const &xq_re, zstring *icu_re,
238 char const *xq_flags ) {
239- icu_flags_t const icu_flags = convert_xquery_flags( xq_flags );
240+ icu_flags_type const icu_flags = convert_xquery_flags( xq_flags );
241 bool const i_flag = (icu_flags & UREGEX_CASE_INSENSITIVE) != 0;
242 bool const m_flag = (icu_flags & UREGEX_MULTILINE) != 0;
243 bool const q_flag = (icu_flags & UREGEX_LITERAL) != 0;
244@@ -100,32 +142,44 @@
245 icu_re->clear();
246 icu_re->reserve( xq_re.length() ); // approximate
247
248+ char c; // current (raw) XQuery char
249+ char c_cooked; // current cooked XQuery char
250+ char prev_c_cooked = 0; // previous c_cooked
251+ char char_range_begin_cooked; // the 'a' in [a-b]
252+
253 bool got_backslash = false;
254- bool in_char_class = false; // within [...]
255- bool is_first_char = true; // to check ^ placement
256+ int got_quantifier = 0;
257+ int in_char_class = 0; // within [...]
258+ int in_char_range = 0; // within a-b within [...]
259+ int is_first_char = 1; // to check ^ placement
260
261 bool in_backref = false; // '\'[1-9][0-9]*
262 unsigned backref_no = 0; // 1-based
263+
264+ // capture subgroup: true = open; false = closed
265+ vector<bool> cap_sub; // 0-based
266 unsigned cur_cap_sub = 0; // 1-based
267 unsigned open_cap_subs = 0;
268
269- // capture subgroup: true = open; false = closed
270- vector<bool> cap_sub; // 0-based
271+ // parentheses balancing: true = is capture subgroup; false = non-capturing
272+ vector<bool> paren; // 0-based
273+ unsigned cur_paren = 0; // 1-based
274
275- FOR_EACH( zstring, xq_c, xq_re ) {
276+ FOR_EACH( zstring, i, xq_re ) {
277+ c = c_cooked = *i;
278 if ( got_backslash ) {
279- if ( x_flag && !in_char_class && ascii::is_space( *xq_c ) ) {
280+ if ( x_flag && !in_char_class && ascii::is_space( c ) ) {
281 //
282 // XQuery 3.0 F&O 5.6.1.1: If [the 'x' flag is] present, whitespace
283 // characters ... in the regular expression are removed prior to
284 // matching with one exception: whitespace characters within character
285 // class expressions ... are not removed.
286 //
287- continue;
288+ goto next;
289 }
290 got_backslash = false;
291
292- switch ( *xq_c ) {
293+ switch ( c ) {
294
295 ////////// Back-References ////////////////////////////////////////////
296
297@@ -139,7 +193,7 @@
298 case '7':
299 case '8':
300 case '9':
301- backref_no = *xq_c - '0';
302+ backref_no = c - '0';
303 if ( !backref_no ) // \0 is illegal
304 throw INVALID_RE_EXCEPTION( xq_re, ZED( BackRef0Illegal ) );
305 if ( in_char_class ) {
306@@ -168,41 +222,73 @@
307 case '\\':
308 case ']':
309 case '^':
310+ case '{':
311+ case '|':
312+ case '}':
313+ *icu_re += '\\';
314+ break;
315+
316+ ////////// Multi-Character & Category Escapes /////////////////////////
317+
318 case 'n': // newline
319+ *icu_re += '\\';
320+ c_cooked = '\n';
321+ break;
322 case 'r': // carriage return
323+ *icu_re += '\\';
324+ c_cooked = '\r';
325+ break;
326 case 't': // tab
327- case '{':
328- case '|':
329- case '}':
330- // no break;
331-
332- ////////// Multi-Character & Category Escapes /////////////////////////
333-
334+ *icu_re += '\\';
335+ c_cooked = '\t';
336+ break;
337 case 'd': // [0-9]
338 case 'D': // [^\d]
339 case 'p': // category escape
340 case 'P': // [^\p]
341 case 's': // whitespace
342 case 'S': // [^\s]
343+ if ( in_char_range || IS_CHAR_RANGE_BEGIN )
344+ goto not_single_char_esc;
345+ *icu_re += '\\';
346+ break;
347 case 'w': // word char
348+ if ( in_char_range || IS_CHAR_RANGE_BEGIN )
349+ goto not_single_char_esc;
350+ //
351+ // Note that we can't simply pass \w through to ICU because what it
352+ // considers a "word character" is different from what XQuery does.
353+ //
354+ *icu_re += "[^" bs_W "]";
355+ goto next;
356 case 'W': // [^\w]
357- *icu_re += '\\';
358- break;
359+ if ( in_char_range || IS_CHAR_RANGE_BEGIN )
360+ goto not_single_char_esc;
361+ *icu_re += "[" bs_W "]";
362+ goto next;
363 case 'c': // NameChar
364+ if ( in_char_range || IS_CHAR_RANGE_BEGIN )
365+ goto not_single_char_esc;
366 *icu_re += "[" bs_c "]";
367- continue;
368+ goto next;
369 case 'C': // [^\c]
370+ if ( in_char_range || IS_CHAR_RANGE_BEGIN )
371+ goto not_single_char_esc;
372 *icu_re += "[^" bs_c "]";
373- continue;
374+ goto next;
375 case 'i': // initial NameChar
376+ if ( in_char_range || IS_CHAR_RANGE_BEGIN )
377+ goto not_single_char_esc;
378 *icu_re += "[" bs_i "]";
379- continue;
380+ goto next;
381 case 'I': // [^\i]
382+ if ( in_char_range || IS_CHAR_RANGE_BEGIN )
383+ goto not_single_char_esc;
384 *icu_re += "[^" bs_i "]";
385- continue;
386+ goto next;
387
388 default:
389- throw INVALID_RE_EXCEPTION( xq_re, ZED( BadRegexEscape_3 ), *xq_c );
390+ throw INVALID_RE_EXCEPTION( xq_re, ZED( BadRegexEscape_3 ), c );
391 }
392 } else {
393 if ( in_backref ) {
394@@ -214,10 +300,26 @@
395 // back-reference is preceded by NN or more unescaped opening
396 // parentheses.
397 //
398- if ( cap_sub.size() > 9 && ascii::is_digit( *xq_c ) )
399- backref_no = backref_no * 10 + (*xq_c - '0');
400- else
401+ bool prevent_multidigit_backref = false;
402+ if ( ascii::is_digit( c ) ) {
403+ if ( digits( cap_sub.size() ) > digits( backref_no ) )
404+ backref_no = backref_no * 10 + (c - '0');
405+ else {
406+ in_backref = false;
407+ //
408+ // Unlike XQuery, ICU always takes further digits to be part of the
409+ // backreference so we have to prevent ICU from doing that. One
410+ // way to do that is by enclosing said digits in a single-character
411+ // character class, i.e., [N].
412+ //
413+ *icu_re += '[';
414+ *icu_re += c;
415+ *icu_re += ']';
416+ prevent_multidigit_backref = true;
417+ }
418+ } else
419 in_backref = false;
420+
421 //
422 // XQuery 3.0 F&O 5.6.1: The regular expression is invalid if a back-
423 // reference refers to a subexpression that does not exist or whose
424@@ -231,85 +333,170 @@
425 throw INVALID_RE_EXCEPTION(
426 xq_re, ZED( NonClosedBackRef_3 ), backref_no
427 );
428+
429+ if ( prevent_multidigit_backref )
430+ goto next;
431 }
432- switch ( *xq_c ) {
433+
434+ switch ( c ) {
435+ case '$':
436+ if ( q_flag )
437+ *icu_re += '\\';
438+ else if ( !m_flag && i + 1 == xq_re.end() ) {
439+ //
440+ // XQuery 3.0 F&O 5.6.1: By default, ... $ matches the end of the
441+ // entire string. [Newlines are treated as any other character.]
442+ //
443+ // However, in ICU, $ always matches before any trailing newlines.
444+ //
445+ // To make ICU work as XQuery needs it to, substitute \z for $ when
446+ // it is the last character in the regular expression (and multi-
447+ // line mode is not set).
448+ //
449+ icu_re->append( "\\z" );
450+ goto next;
451+ }
452+ break;
453+ case '(':
454+ if ( q_flag )
455+ *icu_re += '\\';
456+ else {
457+ cur_paren = paren.size() + 1;
458+ zstring::const_iterator j = i;
459+ if ( ++j != xq_re.end() && *j == '?' && ++j != xq_re.end() ) {
460+ //
461+ // Got "(?" sequence: potentially start of "(?:", a non-capturing
462+ // subgroup. ICU also allows other characters after the "(?"
463+ // that XQuery does not, so we have to report those as errors.
464+ //
465+ if ( *j != ':' )
466+ throw INVALID_RE_EXCEPTION( xq_re, ZED( BadRegexParen_3 ), *j );
467+ //
468+ // Start of non-capturing subgroup.
469+ //
470+ paren.push_back( false );
471+ } else {
472+ //
473+ // Start of capturing subgroup.
474+ //
475+ paren.push_back( true );
476+ ++open_cap_subs;
477+ cap_sub.push_back( true );
478+ cur_cap_sub = cap_sub.size();
479+ is_first_char = 2;
480+ }
481+ }
482+ break;
483+ case ')':
484+ if ( q_flag )
485+ *icu_re += '\\';
486+ else {
487+ if ( !cur_paren )
488+ goto unbalanced_char;
489+ if ( paren[ --cur_paren ] ) {
490+ if ( !open_cap_subs || !cur_cap_sub )
491+ goto unbalanced_char;
492+ cap_sub[ --cur_cap_sub ] = false;
493+ }
494+ }
495+ break;
496+ case ':':
497+ if ( is_non_capturing_begin( xq_re, i ) ) {
498+ //
499+ // This ':' is part of a "(?:" sequence, i.e., a non-capturing
500+ // subgroup. Therefore, the *next* character will be a "first
501+ // character" for the purposes of '^'.
502+ //
503+ is_first_char = 2;
504+ }
505+ break;
506+ case '*':
507+ case '+':
508+ case '?':
509+ case '{':
510+ if ( q_flag )
511+ *icu_re += '\\';
512+ else {
513+ //
514+ // ICU allows the multiple quantifiers *+, ++, and ?+, but XQuery
515+ // does not so we have to check for them.
516+ //
517+ if ( got_quantifier && c != '?' )
518+ throw INVALID_RE_EXCEPTION(
519+ xq_re, ZED( BadQuantifierHere_3 ), c
520+ );
521+ got_quantifier = 2;
522+ }
523+ break;
524+ case '-':
525+ if ( in_char_class && !in_char_range ) {
526+ char const next_c = PEEK_C;
527+ if ( next_c == '[' ) {
528+ //
529+ // ICU uses "--" to indicate range subtraction, e.g.,
530+ // XQuery [A-Z-[OI]] becomes ICU [A-Z--[OI]].
531+ //
532+ *icu_re += '-';
533+ } else if ( prev_c_cooked != '[' && next_c != ']' ) {
534+ //
535+ // The '-' is neither the first or last character within a
536+ // character range (i.e., a literal '-') so therefore it's
537+ // indicating a character range.
538+ //
539+ char_range_begin_cooked = prev_c_cooked;
540+ in_char_range = 2;
541+ }
542+ }
543+ break;
544+ case '.':
545+ case '}':
546+ if ( q_flag )
547+ *icu_re += '\\';
548+ break;
549+ case '[':
550+ if ( q_flag )
551+ *icu_re += '\\';
552+ else {
553+ if ( in_char_class && prev_c_cooked != '-' )
554+ goto unescaped_char;
555+ ++in_char_class;
556+ is_first_char = 2;
557+ }
558+ break;
559 case '\\':
560 got_backslash = true;
561- continue;
562- case '$':
563- if ( q_flag )
564- *icu_re += '\\';
565- else if ( !m_flag ) {
566- zstring::const_iterator const temp = xq_c + 1;
567- if ( temp == xq_re.end() ) {
568- //
569- // XQuery 3.0 F&O 5.6.1: By default, ... $ matches the end of the
570- // entire string. [Newlines are treated as any other character.]
571- //
572- // However, in ICU, $ always matches before any trailing
573- // newlines.
574- //
575- // To make ICU work as XQuery needs it to, substitute \z for $
576- // when it is the last character in the regular expression (and
577- // multi-line mode is not set).
578- //
579- icu_re->append( "\\z" );
580- continue;
581- }
582- }
583- break;
584- case '(':
585- if ( q_flag )
586- *icu_re += '\\';
587- else {
588- ++open_cap_subs;
589- cap_sub.push_back( true );
590- cur_cap_sub = cap_sub.size();
591- is_first_char = true;
592- goto append;
593- }
594- break;
595- case ')':
596- if ( q_flag )
597- *icu_re += '\\';
598- else {
599- if ( !open_cap_subs || cur_cap_sub == 0 )
600- throw INVALID_RE_EXCEPTION( xq_re, ZED( UnbalancedChar_3 ), ')' );
601- cap_sub[ --cur_cap_sub ] = false;
602- }
603- break;
604- case '[':
605- if ( q_flag )
606- *icu_re += '\\';
607- else {
608- in_char_class = true;
609- goto append;
610- }
611- break;
612+ if ( in_char_range )
613+ ++in_char_range;
614+ goto next;
615 case ']':
616 if ( q_flag )
617 *icu_re += '\\';
618+ else {
619+ if ( !in_char_class )
620+ goto unbalanced_char;
621+ --in_char_class;
622+ in_char_range = 0;
623+ }
624+ break;
625+ case '^':
626+ if ( q_flag )
627+ *icu_re += '\\';
628+ else if ( !is_first_char ) {
629+ if ( in_char_class )
630+ goto unescaped_char;
631+ *icu_re += '\\';
632+ }
633+ break;
634+ case '|':
635+ if ( q_flag )
636+ *icu_re += '\\';
637 else
638- in_char_class = false;
639- break;
640- case '^':
641- if ( q_flag )
642- *icu_re += '\\';
643- else if ( !is_first_char && !in_char_class )
644- throw INVALID_RE_EXCEPTION( xq_re, ZED( UnescapedChar_3 ), *xq_c );
645- break;
646- case '|':
647- if ( q_flag )
648- *icu_re += '\\';
649- else {
650- is_first_char = true;
651- goto append;
652- }
653+ is_first_char = 2;
654 break;
655 default:
656- if ( x_flag && ascii::is_space( *xq_c ) ) {
657+ if ( x_flag && ascii::is_space( c ) ) {
658 if ( !in_char_class )
659- continue;
660+ goto next;
661 //
662 // This is similar to the above case for removing whitespace except
663 // ICU removes *all* whitespace (even within character classes)
664@@ -319,11 +506,28 @@
665 }
666 } // switch
667 } // else
668- is_first_char = false;
669-append:
670- *icu_re += *xq_c;
671+
672+ if ( in_char_range == 1 && c_cooked < char_range_begin_cooked )
673+ throw INVALID_RE_EXCEPTION(
674+ xq_re, ZED( BadEndCharInRange_34 ),
675+ ascii::printable_char( c_cooked ),
676+ char_range_begin_cooked
677+ );
678+
679+ *icu_re += c;
680+
681+next:
682+ dec_limit( &in_char_range );
683+ dec_limit( &got_quantifier );
684+ dec_limit( &is_first_char );
685+ prev_c_cooked = c_cooked;
686 } // FOR_EACH
687
688+ if ( got_backslash )
689+ throw INVALID_RE_EXCEPTION( xq_re, ZED( TrailingChar_3 ), '\\' );
690+ if ( in_char_class )
691+ throw INVALID_RE_EXCEPTION( xq_re, ZED( UnbalancedChar_3 ), '[' );
692+
693 if ( !q_flag ) {
694 if ( i_flag ) {
695 //
696@@ -332,12 +536,13 @@
697 // only.
698 //
699 // However, ICU lower-cases everything for the 'i' flag; hence we have to
700- // turn off the 'i' flag for just the \p{Lu}.
701+ // turn off the 'i' flag for the \p{Lu} and \P{Lu}.
702 //
703 // Note that the "6" and "12" below are correct since "\\" represents a
704 // single '\'.
705 //
706 ascii::replace_all( *icu_re, "\\p{Lu}", 6, "(?-i:\\p{Lu})", 12 );
707+ ascii::replace_all( *icu_re, "\\P{Lu}", 6, "(?-i:\\P{Lu})", 12 );
708 }
709
710 //
711@@ -352,7 +557,16 @@
712 // Note that the "5" below is correct since "\\" represents a single '\'.
713 //
714 ascii::replace_all( *icu_re, "\\p{Is", 5, "\\p{In", 5 );
715+ ascii::replace_all( *icu_re, "\\P{Is", 5, "\\P{In", 5 );
716 } // q_flag
717+ return;
718+
719+not_single_char_esc:
720+ throw INVALID_RE_EXCEPTION( xq_re, ZED( NotSingleCharEsc_3 ), c );
721+unbalanced_char:
722+ throw INVALID_RE_EXCEPTION( xq_re, ZED( UnbalancedChar_3 ), c );
723+unescaped_char:
724+ throw INVALID_RE_EXCEPTION( xq_re, ZED( UnescapedChar_3 ), c );
725 }
726
727 ///////////////////////////////////////////////////////////////////////////////
728@@ -362,7 +576,8 @@
729
730 void regex::compile( string const &u_pattern, char const *flags,
731 char const *pattern ) {
732- icu_flags_t const icu_flags = convert_xquery_flags( flags ) & ~UREGEX_LITERAL;
733+ icu_flags_type const icu_flags =
734+ convert_xquery_flags( flags ) & ~UREGEX_LITERAL;
735 delete matcher_;
736 UErrorCode status = U_ZERO_ERROR;
737 matcher_ = new RegexMatcher( u_pattern, icu_flags, status );
738@@ -375,9 +590,7 @@
739 icu_error_key = ZED_PREFIX;
740 icu_error_key += u_errorName( status );
741 }
742- throw XQUERY_EXCEPTION(
743- err::FORX0002, ERROR_PARAMS( pattern, icu_error_key )
744- );
745+ throw INVALID_RE_EXCEPTION( pattern, icu_error_key );
746 }
747 }
748
749
750=== modified file 'test/fots/CMakeLists.txt'
751--- test/fots/CMakeLists.txt 2013-02-25 16:18:58 +0000
752+++ test/fots/CMakeLists.txt 2013-02-26 01:37:22 +0000
753@@ -344,112 +344,15 @@
754 EXPECTED_FOTS_FAILURE (fn-iri-to-uri fn-iri-to-uri-18A 0)
755 EXPECTED_FOTS_FAILURE (fn-last last-11 0)
756 EXPECTED_FOTS_FAILURE (fn-last last-24 0)
757-EXPECTED_FOTS_FAILURE (fn-matches caselessmatch10 0)
758-EXPECTED_FOTS_FAILURE (fn-matches caselessmatch11 0)
759-EXPECTED_FOTS_FAILURE (fn-matches cbcl-matches-038 0)
760-EXPECTED_FOTS_FAILURE (fn-matches cbcl-matches-039 0)
761-EXPECTED_FOTS_FAILURE (fn-matches.re re00041 0)
762-EXPECTED_FOTS_FAILURE (fn-matches.re re00055 0)
763-EXPECTED_FOTS_FAILURE (fn-matches.re re00058 0)
764-EXPECTED_FOTS_FAILURE (fn-matches.re re00059 0)
765-EXPECTED_FOTS_FAILURE (fn-matches.re re00060 0)
766-EXPECTED_FOTS_FAILURE (fn-matches.re re00063 0)
767-EXPECTED_FOTS_FAILURE (fn-matches.re re00071 0)
768-EXPECTED_FOTS_FAILURE (fn-matches.re re00072 0)
769-EXPECTED_FOTS_FAILURE (fn-matches.re re00288 0)
770-EXPECTED_FOTS_FAILURE (fn-matches.re re00370 0)
771-EXPECTED_FOTS_FAILURE (fn-matches.re re00480 0)
772-EXPECTED_FOTS_FAILURE (fn-matches.re re00498 0)
773-EXPECTED_FOTS_FAILURE (fn-matches.re re00501 0)
774-EXPECTED_FOTS_FAILURE (fn-matches.re re00506 0)
775-EXPECTED_FOTS_FAILURE (fn-matches.re re00589 0)
776-EXPECTED_FOTS_FAILURE (fn-matches.re re00590 0)
777-EXPECTED_FOTS_FAILURE (fn-matches.re re00613 0)
778-EXPECTED_FOTS_FAILURE (fn-matches.re re00680 0)
779-EXPECTED_FOTS_FAILURE (fn-matches.re re00693 0)
780-EXPECTED_FOTS_FAILURE (fn-matches.re re00694 0)
781-EXPECTED_FOTS_FAILURE (fn-matches.re re00695 0)
782-EXPECTED_FOTS_FAILURE (fn-matches.re re00696 0)
783-EXPECTED_FOTS_FAILURE (fn-matches.re re00697 0)
784-EXPECTED_FOTS_FAILURE (fn-matches.re re00698 0)
785-EXPECTED_FOTS_FAILURE (fn-matches.re re00702 0)
786-EXPECTED_FOTS_FAILURE (fn-matches.re re00703 0)
787-EXPECTED_FOTS_FAILURE (fn-matches.re re00704 0)
788-EXPECTED_FOTS_FAILURE (fn-matches.re re00705 0)
789-EXPECTED_FOTS_FAILURE (fn-matches.re re00706 0)
790-EXPECTED_FOTS_FAILURE (fn-matches.re re00707 0)
791-EXPECTED_FOTS_FAILURE (fn-matches.re re00708 0)
792-EXPECTED_FOTS_FAILURE (fn-matches.re re00709 0)
793-EXPECTED_FOTS_FAILURE (fn-matches.re re00710 0)
794-EXPECTED_FOTS_FAILURE (fn-matches.re re00711 0)
795-EXPECTED_FOTS_FAILURE (fn-matches.re re00712 0)
796-EXPECTED_FOTS_FAILURE (fn-matches.re re00713 0)
797-EXPECTED_FOTS_FAILURE (fn-matches.re re00717 0)
798-EXPECTED_FOTS_FAILURE (fn-matches.re re00718 0)
799-EXPECTED_FOTS_FAILURE (fn-matches.re re00719 0)
800-EXPECTED_FOTS_FAILURE (fn-matches.re re00720 0)
801-EXPECTED_FOTS_FAILURE (fn-matches.re re00721 0)
802-EXPECTED_FOTS_FAILURE (fn-matches.re re00722 0)
803-EXPECTED_FOTS_FAILURE (fn-matches.re re00723 0)
804-EXPECTED_FOTS_FAILURE (fn-matches.re re00730 0)
805-EXPECTED_FOTS_FAILURE (fn-matches.re re00732 0)
806-EXPECTED_FOTS_FAILURE (fn-matches.re re00736 0)
807-EXPECTED_FOTS_FAILURE (fn-matches.re re00739 0)
808-EXPECTED_FOTS_FAILURE (fn-matches.re re00740 0)
809-EXPECTED_FOTS_FAILURE (fn-matches.re re00744 0)
810-EXPECTED_FOTS_FAILURE (fn-matches.re re00745 0)
811-EXPECTED_FOTS_FAILURE (fn-matches.re re00746 0)
812-EXPECTED_FOTS_FAILURE (fn-matches.re re00749 0)
813-EXPECTED_FOTS_FAILURE (fn-matches.re re00750 0)
814-EXPECTED_FOTS_FAILURE (fn-matches.re re00754 0)
815-EXPECTED_FOTS_FAILURE (fn-matches.re re00763 0)
816-EXPECTED_FOTS_FAILURE (fn-matches.re re00767 0)
817-EXPECTED_FOTS_FAILURE (fn-matches.re re00768 0)
818-EXPECTED_FOTS_FAILURE (fn-matches.re re00769 0)
819-EXPECTED_FOTS_FAILURE (fn-matches.re re00770 0)
820-EXPECTED_FOTS_FAILURE (fn-matches.re re00771 0)
821-EXPECTED_FOTS_FAILURE (fn-matches.re re00779 0)
822-EXPECTED_FOTS_FAILURE (fn-matches.re re00780 0)
823-EXPECTED_FOTS_FAILURE (fn-matches.re re00795 0)
824-EXPECTED_FOTS_FAILURE (fn-matches.re re00804 0)
825-EXPECTED_FOTS_FAILURE (fn-matches.re re00805 0)
826-EXPECTED_FOTS_FAILURE (fn-matches.re re00806 0)
827-EXPECTED_FOTS_FAILURE (fn-matches.re re00814 0)
828-EXPECTED_FOTS_FAILURE (fn-matches.re re00867 0)
829-EXPECTED_FOTS_FAILURE (fn-matches.re re00868 0)
830-EXPECTED_FOTS_FAILURE (fn-matches.re re00869 0)
831-EXPECTED_FOTS_FAILURE (fn-matches.re re00870 0)
832-EXPECTED_FOTS_FAILURE (fn-matches.re re00871 0)
833-EXPECTED_FOTS_FAILURE (fn-matches.re re00872 0)
834-EXPECTED_FOTS_FAILURE (fn-matches.re re00873 0)
835-EXPECTED_FOTS_FAILURE (fn-matches.re re00874 0)
836-EXPECTED_FOTS_FAILURE (fn-matches.re re00875 0)
837-EXPECTED_FOTS_FAILURE (fn-matches.re re00876 0)
838-EXPECTED_FOTS_FAILURE (fn-matches.re re00881 0)
839-EXPECTED_FOTS_FAILURE (fn-matches.re re00882 0)
840-EXPECTED_FOTS_FAILURE (fn-matches.re re00890 0)
841-EXPECTED_FOTS_FAILURE (fn-matches.re re00891 0)
842-EXPECTED_FOTS_FAILURE (fn-matches.re re00905 0)
843-EXPECTED_FOTS_FAILURE (fn-matches.re re00912 0)
844-EXPECTED_FOTS_FAILURE (fn-matches.re re00913 0)
845-EXPECTED_FOTS_FAILURE (fn-matches.re re00914 0)
846-EXPECTED_FOTS_FAILURE (fn-matches.re re00919 0)
847-EXPECTED_FOTS_FAILURE (fn-matches.re re00939 0)
848-EXPECTED_FOTS_FAILURE (fn-matches.re re00940 0)
849-EXPECTED_FOTS_FAILURE (fn-matches.re re00941 0)
850-EXPECTED_FOTS_FAILURE (fn-matches.re re00957 0)
851-EXPECTED_FOTS_FAILURE (fn-matches.re re00970 0)
852-EXPECTED_FOTS_FAILURE (fn-matches.re re00977 0)
853-EXPECTED_FOTS_FAILURE (fn-matches.re re00978 0)
854-EXPECTED_FOTS_FAILURE (fn-matches.re re00982 0)
855-EXPECTED_FOTS_FAILURE (fn-matches.re re00983 0)
856-EXPECTED_FOTS_FAILURE (fn-matches.re re00984 0)
857-EXPECTED_FOTS_FAILURE (fn-matches.re re00987 0)
858-EXPECTED_FOTS_FAILURE (fn-matches.re re00988 0)
859-EXPECTED_FOTS_FAILURE (fn-matches.re re00989 0)
860-EXPECTED_FOTS_FAILURE (fn-matches.re re00994 0)
861-EXPECTED_FOTS_FAILURE (fn-matches.re re00998 0)
862-EXPECTED_FOTS_FAILURE (fn-matches.re re00999 0)
863+EXPECTED_FOTS_FAILURE (fn-matches cbcl-matches-038 1131304)
864+EXPECTED_FOTS_FAILURE (fn-matches.re re00056 1131984)
865+EXPECTED_FOTS_FAILURE (fn-matches.re re00086 1131984)
866+EXPECTED_FOTS_FAILURE (fn-matches.re re00288 1131985)
867+EXPECTED_FOTS_FAILURE (fn-matches.re re00370 1131985)
868+EXPECTED_FOTS_FAILURE (fn-matches.re re00480 1131985)
869+EXPECTED_FOTS_FAILURE (fn-matches.re re00732 1131988)
870+EXPECTED_FOTS_FAILURE (fn-matches.re re00737 1131990)
871+EXPECTED_FOTS_FAILURE (fn-matches.re re00987 1131313)
872 EXPECTED_FOTS_FAILURE (fn-nilled fn-nilled-33 0)
873 EXPECTED_FOTS_FAILURE (fn-nilled fn-nilled-35 0)
874 EXPECTED_FOTS_FAILURE (fn-nilled fn-nilled-37 0)
875
876=== added file 'test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m54.xml.res'
877--- test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m54.xml.res 1970-01-01 00:00:00 +0000
878+++ test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m54.xml.res 2013-02-26 01:37:22 +0000
879@@ -0,0 +1,1 @@
880+false
881
882=== added file 'test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m55.xml.res'
883--- test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m55.xml.res 1970-01-01 00:00:00 +0000
884+++ test/rbkt/ExpQueryResults/zorba/string/Regex/regex_m55.xml.res 2013-02-26 01:37:22 +0000
885@@ -0,0 +1,1 @@
886+false
887
888=== modified file 'test/rbkt/Queries/CMakeLists.txt'
889--- test/rbkt/Queries/CMakeLists.txt 2013-02-12 08:27:39 +0000
890+++ test/rbkt/Queries/CMakeLists.txt 2013-02-26 01:37:22 +0000
891@@ -549,15 +549,13 @@
892 EXPECTED_FAILURE(test/rbkt/zorba/http-client/post/post3_binary_element 3391756)
893 IF(NOT ZORBA_NO_ICU)
894 IF ( ${ICU_VERSION} VERSION_LESS 4.0.0 )
895+ EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_m11 866874)
896 EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_m40 866874)
897 EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_m41 866874)
898- EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_err17 1023168)
899 ELSE ( ${ICU_VERSION} VERSION_LESS 4.0.0 )
900 EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_err10 994610)
901 EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_err15 866874)
902- EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_err16 1023168)
903 ENDIF ( ${ICU_VERSION} VERSION_LESS 4.0.0 )
904- EXPECTED_FAILURE(test/rbkt/zorba/string/Regex/regex_m11 866874)
905 ENDIF(NOT ZORBA_NO_ICU)
906
907 IF(ZORBA_NO_ICU)
908
909=== removed file 'test/rbkt/Queries/zorba/string/Regex/regex_err25.spec'
910--- test/rbkt/Queries/zorba/string/Regex/regex_err25.spec 2011-10-13 15:47:39 +0000
911+++ test/rbkt/Queries/zorba/string/Regex/regex_err25.spec 1970-01-01 00:00:00 +0000
912@@ -1,1 +0,0 @@
913-Error: http://www.w3.org/2005/xqt-errors:FORX0002
914
915=== removed file 'test/rbkt/Queries/zorba/string/Regex/regex_err7.spec'
916--- test/rbkt/Queries/zorba/string/Regex/regex_err7.spec 2011-10-13 15:47:39 +0000
917+++ test/rbkt/Queries/zorba/string/Regex/regex_err7.spec 1970-01-01 00:00:00 +0000
918@@ -1,1 +0,0 @@
919-Error: http://www.w3.org/2005/xqt-errors:FORX0002
920
921=== renamed file 'test/rbkt/Queries/zorba/string/Regex/regex_err7.xq' => 'test/rbkt/Queries/zorba/string/Regex/regex_m54.xq'
922=== renamed file 'test/rbkt/Queries/zorba/string/Regex/regex_err25.xq' => 'test/rbkt/Queries/zorba/string/Regex/regex_m55.xq'

Subscribers

People subscribed via source and target branches