Browse Source

Merge pull request #10471 from richardkchapman/utf8-assert

HPCC-18351 Assert errors are converted to ascii

Reviewed-by: Gavin Halliday <ghalliday@hpccsystems.com>
Gavin Halliday 7 years ago
parent
commit
41f88fa353

+ 6 - 0
ecl/hql/hqlexpr.cpp

@@ -12722,6 +12722,12 @@ extern IHqlExpression *createConstant(const char *constant)
     return CHqlConstant::makeConstant(createStringValue(constant, strlen(constant)));
 }
 
+extern IHqlExpression *createUtf8Constant(const char *constant)
+{
+    unsigned len = rtlUtf8Length(strlen(constant), constant);
+    return CHqlConstant::makeConstant(createUtf8Value(constant, makeUtf8Type(len, NULL)));
+}
+
 extern IHqlExpression *createConstant(IValue * constant)
 {
     return CHqlConstant::makeConstant(constant);

+ 1 - 0
ecl/hql/hqlexpr.hpp

@@ -1258,6 +1258,7 @@ extern HQL_API IHqlExpression *createConstant(const char *constant);
 extern HQL_API IHqlExpression *createConstant(double constant);
 extern HQL_API IHqlExpression *createConstant(IValue * constant);
 extern HQL_API IHqlExpression *createConstant(__int64 constant, ITypeInfo * ownedType);
+extern HQL_API IHqlExpression *createUtf8Constant(const char *constant);
 extern HQL_API IHqlExpression *createBlankString();
 extern HQL_API IHqlExpression *createDataset(node_operator op, IHqlExpression *dataset);
 extern HQL_API IHqlExpression *createDataset(node_operator op, IHqlExpression *dataset, IHqlExpression *elist);

+ 13 - 8
ecl/hql/hqlutil.cpp

@@ -7715,15 +7715,20 @@ IHqlExpression * createDefaultAssertMessage(IHqlExpression * cond)
     StringBuffer cmpText;
     cmpText.append(" ").append(getOpString(op)).append(" ");
 
-    OwnedITypeInfo unknownStringType = makeStringType(UNKNOWN_LENGTH, NULL, NULL);
-    OwnedITypeInfo unknownVarStringType = makeVarStringType(UNKNOWN_LENGTH, NULL, NULL);
+    OwnedITypeInfo utf8Type = makeUtf8Type(UNKNOWN_LENGTH, NULL);
     HqlExprArray args;
-    args.append(*createConstant(prefix));
-    args.append(*ensureExprType(lhs, unknownStringType));
-    args.append(*createConstant(cmpText));
-    args.append(*ensureExprType(rhs, unknownStringType));
-    args.append(*createConstant(suffix));
-    return createBalanced(no_concat, unknownVarStringType, args);
+    args.append(*createUtf8Constant(prefix));
+    args.append(*ensureExprType(lhs, utf8Type));
+    args.append(*createUtf8Constant(cmpText));
+    args.append(*ensureExprType(rhs, utf8Type));
+    args.append(*createUtf8Constant(suffix));
+    // Really what we want to do is
+    // return createBalanced(no_concat, utf8Type, args);
+    // and declare the param to the assert helper as varutf8 - but there is no such type so we have to fool it into passing it as a string without conversion
+    OwnedITypeInfo unknownStringType = makeStringType(UNKNOWN_LENGTH);
+    OwnedITypeInfo unknownVarStringType = makeVarStringType(UNKNOWN_LENGTH);
+    OwnedHqlExpr transfer = createValue(no_typetransfer, LINK(unknownStringType), createBalanced(no_concat, utf8Type, args));
+    return ensureExprType(transfer, unknownVarStringType);
 }
 
 //-------------------------------------------------------------------------------------------------------------------

+ 1 - 1
ecl/hqlcpp/hqlhtcpp.cpp

@@ -8855,7 +8855,7 @@ void HqlCppTranslator::doBuildStmtAssert(BuildCtx & ctx, IHqlExpression * expr)
             return;
 
         StringBuffer msgText;
-        getStringValue(msgText, msg);
+        getUTF8Value(msgText, msg);
         reportErrorDirect(locationAttr, ERR_ASSERTION_FAILS, msgText.str(), false);
         return;
     }

+ 4 - 0
testing/regress/ecl/assert.ecl

@@ -65,3 +65,7 @@ rec t(ds l) := transform
 o3 := output(project(ds, t(LEFT)));
 sequential(o1, o2, o3);
 ASSERT(COUNT(ds) = 9); // should be 2
+
+// Test unicode formatting
+utf8 euro := u'€' : stored('euro'); 
+ASSERT(euro=u'€€');  // fail!

+ 1 - 0
testing/regress/ecl/key/assert.xml

@@ -15,6 +15,7 @@
 <Exception><Code>100000</Code><Filename>assert.ecl</Filename><Line>46</Line><Source>user</Source><Message>Assert (2 = 1) failed [val1 = 1]</Message></Exception>
 <Exception><Code>100000</Code><Filename>assert.ecl</Filename><Line>47</Line><Source>user</Source><Message>Abc7</Message></Exception>
 <Exception><Code>100000</Code><Filename>assert.ecl</Filename><Line>67</Line><Source>user</Source><Message>Assert (2 = 9) failed [COUNT(ds) = 9]</Message></Exception>
+<Exception><Code>100000</Code><Filename>assert.ecl</Filename><Line>71</Line><Source>user</Source><Message>Assert (&#226;&#130;&#172; = &#226;&#130;&#172;&#226;&#130;&#172;) failed [euro = U&apos;&#226;&#130;&#172;&#226;&#130;&#172;&apos;]</Message></Exception>
 <Dataset name='Result 1'>
  <Row><val1>1</val1></Row>
  <Row><val1>2</val1></Row>