Sfoglia il codice sorgente

HPCC-22164 Fix bug casting/transferring string to DATA type

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 6 anni fa
parent
commit
e494812a9a

+ 7 - 0
common/deftype/deftype.cpp

@@ -943,6 +943,13 @@ bool CDataTypeInfo::assignableFrom(ITypeInfo *t2)
     return false;
 }
 
+IValue * CDataTypeInfo::castFrom(size32_t len, const char * text)
+{
+    if (length == UNKNOWN_LENGTH)
+        return createDataValue(text, len);
+    return createDataValue(text, LINK(this), len);
+}
+
 
 //---------------------------------------------------------------------------
 

+ 1 - 0
common/deftype/deftype.ipp

@@ -202,6 +202,7 @@ public:
     virtual bool assignableFrom(ITypeInfo *t2);
     virtual StringBuffer &getECLType(StringBuffer & out);
     virtual const char *queryTypeName()         { return "data"; } // ???
+    virtual IValue * castFrom(size32_t len, const char * text);
 
     virtual void serialize(MemoryBuffer &tgt)   
     { 

+ 13 - 0
common/deftype/defvalue.cpp

@@ -1333,6 +1333,19 @@ IValue *createDataValue(const char *val, ITypeInfo *type)
 }
 
 
+IValue *createDataValue(const char *val, ITypeInfo *type, size32_t srcLen)
+{
+    size32_t targetSize = type->getSize();
+    assertex(targetSize != UNKNOWN_LENGTH);
+    if (srcLen >= targetSize)
+        return new DataValue(val, type);
+
+    MemoryAttr stretched(targetSize);
+    rtlDataToData(targetSize, stretched.mem(), srcLen, val);
+    return new DataValue(stretched.get(), type);
+}
+
+
 //===========================================================================
 
 QStringValue::QStringValue(unsigned len, const void *v, ITypeInfo *_type) : MemoryValue(_type)

+ 1 - 0
common/deftype/defvalue.hpp

@@ -83,6 +83,7 @@ extern DEFTYPE_API IValue * createUtf8Value(unsigned srclen, char const * value,
 extern DEFTYPE_API IValue * createUtf8Value(size32_t len, char const * value, char const * locale, bool unescape);
 extern DEFTYPE_API IValue * createDataValue(const char * value, unsigned size);
 extern DEFTYPE_API IValue * createDataValue(const char * value, ITypeInfo *type);
+extern DEFTYPE_API IValue * createDataValue(const char *val, ITypeInfo *type, size32_t srcLen);
 extern DEFTYPE_API IValue * createQStringValue(unsigned len, const char * value, ITypeInfo *type);
 extern DEFTYPE_API IValue * createVarStringValue(unsigned len, const char * value, ITypeInfo *type);
 extern DEFTYPE_API IValue * createVarStringValue(const char *val, ITypeInfo *type, int srcLength, ICharsetInfo * srcCharset);

+ 2 - 0
ecllibrary/teststd/str/TestTrim.ecl

@@ -22,6 +22,8 @@ EXPORT TestTrim := MODULE
     ASSERT((>DATA<)TRIM('\tabc\t\tdef\t', ALL) = (>DATA<)'\tabc\t\tdef\t', CONST);
     ASSERT((>DATA<)TRIM('', ALL) = (>DATA<)'', CONST);
     ASSERT((>DATA<)TRIM('\t', ALL) = (>DATA<)'\t', CONST);
+    ASSERT((string)(ebcdic string)(>DATA<)trim('A ') != (string)(ebcdic string)'A', CONST);
+    ASSERT((string)(>DATA<)(ebcdic string)trim('A ') != (string)(ebcdic string)'A', CONST);
     //---------------------------------------
     ASSERT(TRUE)
   ];