فهرست منبع

HPCC-14039 Ensure SORT(ds, TRIM(x)) is equivalent to SORT(ds, x)

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 9 سال پیش
والد
کامیت
a2ba18502c
3فایلهای تغییر یافته به همراه30 افزوده شده و 1 حذف شده
  1. 6 0
      ecl/hql/hqlmeta.cpp
  2. 21 1
      ecl/hql/hqlutil.cpp
  3. 3 0
      ecl/hql/hqlutil.hpp

+ 6 - 0
ecl/hql/hqlmeta.cpp

@@ -659,6 +659,12 @@ IHqlExpression * normalizeDistribution(IHqlExpression * distribution)
 
 static bool sortComponentMatches(IHqlExpression * curNew, IHqlExpression * curExisting)
 {
+    //A component of (trim)x is identical to x since spaces are always ignored
+    while (isOpRedundantForCompare(curNew))
+        curNew = curNew->queryChild(0);
+    while (isOpRedundantForCompare(curExisting))
+        curExisting = curExisting->queryChild(0);
+
     IHqlExpression * newBody = curNew->queryBody();
     IHqlExpression * existingBody = curExisting->queryBody();
     if (newBody == existingBody)

+ 21 - 1
ecl/hql/hqlutil.cpp

@@ -3791,7 +3791,6 @@ IAtom * queryCsvTableEncoding(IHqlExpression * tableExpr)
     return queryCsvEncoding(mode);
 }
 
-
 IHqlExpression * createTrimExpr(IHqlExpression * value, IHqlExpression * flags)
 {
     LinkedHqlExpr expr = value;
@@ -3819,6 +3818,27 @@ IHqlExpression * createTrimExpr(IHqlExpression * value, IHqlExpression * flags)
     return createValue(no_trim, tgtType, args);
 }
 
+bool isRightTrim(IHqlExpression * expr)
+{
+    if (expr->getOperator() != no_trim)
+        return false;
+    if (expr->hasAttribute(leftAtom) || expr->hasAttribute(allAtom))
+        return false;
+    return true;
+}
+
+bool isOpRedundantForCompare(IHqlExpression * expr)
+{
+    if (isRightTrim(expr))
+    {
+        ITypeInfo * baseType = expr->queryChild(0)->queryType();
+        if (baseType->getTypeCode() == type_data)
+            return false;
+        return true;
+    }
+    return false;
+}
+
 bool isLengthPreservingCast(IHqlExpression * expr)
 {
     if (!isCast(expr))

+ 3 - 0
ecl/hql/hqlutil.hpp

@@ -144,6 +144,9 @@ extern HQL_API IHqlExpression * convertScalarToGraphResult(IHqlExpression * valu
 extern HQL_API IHqlExpression * createScalarFromGraphResult(ITypeInfo * scalarType, ITypeInfo * fieldType, IHqlExpression * represents, unsigned seq);
 
 extern HQL_API IHqlExpression * createTrimExpr(IHqlExpression * value, IHqlExpression * flags);
+extern HQL_API bool isRightTrim(IHqlExpression * expr);
+extern HQL_API bool isOpRedundantForCompare(IHqlExpression * expr);
+
 extern HQL_API bool isLengthPreservingCast(IHqlExpression * expr);
 
 extern HQL_API IHqlExpression * createTransformFromRow(IHqlExpression * expr);