Nicolae Brinza has proposed merging lp:~nbrinza/zorba/bugs2 into lp:zorba.

Requested reviews:
  Zorba Coders (zorba-coders)
Related bugs:
  Bug #931501 in Zorba: "improve error message for fn:format-number"
  https://bugs.launchpad.net/zorba/+bug/931501

For more details, see:
https://code.launchpad.net/~nbrinza/zorba/bugs2/+merge/103322

Fixes for bugs #931501 and #866987 -- improved error messages for 
fn:format-number()

-- 
https://code.launchpad.net/~nbrinza/zorba/bugs2/+merge/103322
Your team Zorba Coders is requested to review the proposed merge of 
lp:~nbrinza/zorba/bugs2 into lp:zorba.
=== modified file 'ChangeLog'
--- ChangeLog	2012-04-24 12:39:38 +0000
+++ ChangeLog	2012-04-24 16:42:26 +0000
@@ -16,12 +16,13 @@
 Optimization:
 
 Bug Fixes/Other Changes:
+  * Fixed bugs #931501 and #866987 (improved error messages for fn:format-number(). Additionally, the function now throws the FODF1310 error instead of XTDE1310, as the 3.0 spec requires)
   * Fixed bug 955170 (Catch clause with URILiteral-based wilcard NameTest)
   * Fixed bug 955135 (err:XQDY0044 not caught by try-catch expressions)
   * Fixed bug #986075 (encountering flwor expr with no clauses; due to common 
 	  subexression being formed when inlining var in if-then-else expression) 
   * Fixed bug #967864 (var substitution did not update theFreeVars property)
-  * Fixed buf #891650 (context size var not always declared within path expr)
+  * Fixed bug #891650 (context size var not always declared within path expr)
   * Fixed bug #948879 (--uri-path doesn't work with fetch:content())
   * Fixed bug in window iterator (binding the end vars in the output tuple stream)
   * Fixed bug #866547 (protect index-join rule from general flwor)

=== modified file 'src/diagnostics/diagnostic_en.xml'
--- src/diagnostics/diagnostic_en.xml	2012-04-24 12:39:38 +0000
+++ src/diagnostics/diagnostic_en.xml	2012-04-24 16:42:26 +0000
@@ -983,7 +983,7 @@
       <comment>
        Invalid \c fn:format-number() picture string.
       </comment>
-      <value>"$1": invalid fn:format-number() picture string</value>
+      <value>"$1": invalid fn:format-number() picture string$2</value>
     </diagnostic>
 
     <diagnostic code="FODT0001">
@@ -3643,6 +3643,31 @@
     <entry key="ParseFragmentInvalidOptions">
       <value>invalid options passed to the parse-xml:parse() function, the element must in the schema target namespace</value>
     </entry>
+    
+    <entry key="FormatNumberDuplicates">
+      <value>: a sub-picture must not contain more than one of the "$3" sign</value>
+    </entry>
+    
+    <entry key="FormatNumberGroupingAdjacentToDecimal">
+      <value>: a sub-picture must not contain a grouping-separator-sign adjacent to a decimal-separator-sign</value>
+    </entry>
+    
+    <entry key="FormatNumberIntegerPart">
+      <value>: the integer part of a sub-picture must not contain a member of the decimal-digit-family that is followed by an optional-digit-sign</value>
+    </entry>
+    
+    <entry key="FormatNumberFractionalPart">
+      <value>: the fractional part of a sub-picture must not contain an optional-digit-sign that is followed by a member of the decimal-digit-family</value>
+    </entry>
+    
+    <entry key="FormatNumberPercentPermille">
+      <value>: a sub-picture must not contain more than one percent-sign or per-mille-sign, and it must not contain one of each</value>
+    </entry>
+    
+    <entry key="FormatNumberAtLeastOneOptionalOrDecimal">
+      <value>: a sub-picture must contain at least one character that is an optional-digit-sign or a member of the decimal-digit-family</value>
+    </entry>
+    
 
   </subvalues>
 

=== modified file 'src/diagnostics/pregenerated/dict_en.cpp'
--- src/diagnostics/pregenerated/dict_en.cpp	2012-04-24 12:39:38 +0000
+++ src/diagnostics/pregenerated/dict_en.cpp	2012-04-24 16:42:26 +0000
@@ -47,7 +47,7 @@
   { "FODC0006", "invalid content passed to $1: $2" },
   { "FODC0007", "\"$1\": base URI passed to fn:parse() is not a valid absolute URI" },
   { "FODF1280", "\"$1\": invalid decimal format name for fn:format-number()" },
-  { "FODF1310", "\"$1\": invalid fn:format-number() picture string" },
+  { "FODF1310", "\"$1\": invalid fn:format-number() picture string$2" },
   { "FODT0001", "overflow/underflow in date/time operation" },
   { "FODT0002", "overflow/underflow in duration operation" },
   { "FODT0003", "\"$1\": invalid timezone value" },
@@ -514,6 +514,12 @@
   { "~FileNotFoundOrReadable", "file not found or readable" },
   { "~FnNilledArgNotNode", "fn:nilled() argument not a node" },
   { "~FnOnlyInXQueryVersion_3", "function only available in XQuery $3" },
+  { "~FormatNumberAtLeastOneOptionalOrDecimal", ": a sub-picture must contain at least one character that is an optional-digit-sign or a member of the decimal-digit-family" },
+  { "~FormatNumberDuplicates", ": a sub-picture must not contain more than one of the \"$3\" sign" },
+  { "~FormatNumberFractionalPart", ": the fractional part of a sub-picture must not contain an optional-digit-sign that is followed by a member of the decimal-digit-family" },
+  { "~FormatNumberGroupingAdjacentToDecimal", ": a sub-picture must not contain a grouping-separator-sign adjacent to a decimal-separator-sign" },
+  { "~FormatNumberIntegerPart", ": the integer part of a sub-picture must not contain a member of the decimal-digit-family that is followed by an optional-digit-sign" },
+  { "~FormatNumberPercentPermille", ": a sub-picture must not contain more than one percent-sign or per-mille-sign, and it must not contain one of each" },
   { "~FullTextNotEnabled", "full-text was not enabled in this build" },
   { "~FunctionFailedErrorCodeMessage_123", "$2 failed (error $3): $4" },
   { "~FunctionFailed_12o", "$2 failed${: 3}" },

=== modified file 'src/runtime/numerics/numerics_impl.cpp'
--- src/runtime/numerics/numerics_impl.cpp	2012-04-24 12:39:38 +0000
+++ src/runtime/numerics/numerics_impl.cpp	2012-04-24 16:42:26 +0000
@@ -427,6 +427,8 @@
   zstring infinity;
   zstring NaN;
   zstring minus;
+  
+  zstring pictureString; // The original picture string, used for debugging and error reporting
 
   class PartInfo
   {
@@ -500,14 +502,14 @@
 
 
 // returns an error if there are two or more instances of the given pattern in the string
-static void errorIfTwoOrMore(zstring const& part, const char* sep, QueryLoc& loc)
+static void errorIfTwoOrMore(zstring const& part, const char* sep, FormatNumberInfo& info)
 {
   zstring::size_type const pos = part.find(sep);
 
   if (pos != zstring::npos)
   {
     if (part.find(sep, strlen(sep), pos+1) != zstring::npos)
-      throw XQUERY_EXCEPTION(err::XTDE1310, ERROR_LOC(loc));
+      throw XQUERY_EXCEPTION(err::FODF1310, ERROR_PARAMS(info.pictureString, ZED(FormatNumberDuplicates), sep), ERROR_LOC(info.loc));
   }
 }
 
@@ -521,19 +523,19 @@
   if (str.empty())
     return;
 
-  errorIfTwoOrMore(str, info.percent.c_str(), info.loc);
-  errorIfTwoOrMore(str, info.per_mille.c_str(), info.loc);
+  errorIfTwoOrMore(str, info.percent.c_str(), info);
+  errorIfTwoOrMore(str, info.per_mille.c_str(), info);
 
   if (str.find(info.percent.c_str()) != zstring::npos &&
       str.find(info.per_mille.c_str()) != zstring::npos)
   {
-    throw XQUERY_EXCEPTION(err::XTDE1310, ERROR_LOC(info.loc));
+    throw XQUERY_EXCEPTION(err::FODF1310, ERROR_PARAMS(info.pictureString, ZED(FormatNumberPercentPermille)), ERROR_LOC(info.loc));
   }
 
   if (str.find(info.digit_sign.c_str()) == zstring::npos &&
       str.find(info.zero_digit.c_str()) == zstring::npos)
   {
-    throw XQUERY_EXCEPTION(err::XTDE1310, ERROR_LOC(info.loc));
+    throw XQUERY_EXCEPTION(err::FODF1310, ERROR_PARAMS(info.pictureString, ZED(FormatNumberAtLeastOneOptionalOrDecimal)), ERROR_LOC(info.loc));
   }
 
   // get grouping separators
@@ -563,15 +565,16 @@
     start += delta;
   }
 
-  if (first_digit_sign != -1 && last_zero_sign != -1
-      &&
-      ((!fractional && first_digit_sign > last_zero_sign)
-        ||
-        (fractional && first_digit_sign < last_zero_sign)))
-    throw XQUERY_EXCEPTION(err::XTDE1310, ERROR_LOC(info.loc));
+  if (first_digit_sign != -1 && last_zero_sign != -1)
+  {
+    if (!fractional && first_digit_sign > last_zero_sign)
+      throw XQUERY_EXCEPTION(err::FODF1310, ERROR_PARAMS(info.pictureString, ZED(FormatNumberIntegerPart)), ERROR_LOC(info.loc));    
+    else if (fractional && first_digit_sign < last_zero_sign)
+      throw XQUERY_EXCEPTION(err::FODF1310, ERROR_PARAMS(info.pictureString, ZED(FormatNumberFractionalPart)), ERROR_LOC(info.loc));
+  }
 
   if (part.grouping_pos.size() > 0 && part.grouping_pos[0] == 0)
-    throw XQUERY_EXCEPTION(err::XTDE1310, ERROR_LOC(info.loc));
+    throw XQUERY_EXCEPTION(err::FODF1310, ERROR_PARAMS(info.pictureString, ZED(FormatNumberGroupingAdjacentToDecimal)), ERROR_LOC(info.loc));
 
   if (part.grouping_pos.size() > 0)
   {
@@ -606,7 +609,7 @@
   if (str.empty())
     return;
 
-  errorIfTwoOrMore(str, info.decimal_separator.c_str(), info.loc);
+  errorIfTwoOrMore(str, info.decimal_separator.c_str(), info);
   zstring::size_type pos = str.find(info.decimal_separator.c_str());
   if (pos != zstring::npos)
   {
@@ -648,18 +651,18 @@
 }
 
 
-static void parsePicture(zstring& picture, FormatNumberInfo& info)
+static void parsePicture(FormatNumberInfo& info)
 {
-  errorIfTwoOrMore(picture, info.pattern_separator.c_str(), info.loc);
+  errorIfTwoOrMore(info.pictureString, info.pattern_separator.c_str(), info);
 
-  zstring::size_type pos = picture.find(info.pattern_separator.c_str());
+  zstring::size_type pos = info.pictureString.find(info.pattern_separator.c_str());
   if (pos != zstring::npos)
   {
-    info.pos_subpicture.str = picture.substr(0, pos);
-    info.neg_subpicture.str = picture.substr(pos+1, picture.size() - pos);
+    info.pos_subpicture.str = info.pictureString.substr(0, pos);
+    info.neg_subpicture.str = info.pictureString.substr(pos+1, info.pictureString.size() - pos);
   }
   else
-    info.pos_subpicture.str = picture;
+    info.pos_subpicture.str = info.pictureString;
 
   parseSubpicture(info.pos_subpicture, info);
   if (info.neg_subpicture.str.empty())
@@ -862,7 +865,6 @@
 FormatNumberIterator::nextImpl(store::Item_t& result, PlanState& planState) const
 {
   zstring resultString;
-  zstring pictureString;
   store::Item_t numberItem, pictureItem, formatName;
   FormatNumberInfo info;
   DecimalFormat_t df_t;
@@ -945,8 +947,8 @@
 
     info.readFormat(df_t);
 
-    pictureString = pictureItem->getStringValue();
-    parsePicture(pictureString, info);
+    info.pictureString = pictureItem->getStringValue();
+    parsePicture(info);
     formatNumber(resultString, result, info, theSctx->get_typemanager(), loc);
 
     STACK_PUSH (GENV_ITEMFACTORY->createString(result, resultString), state);

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