瀏覽代碼

HPCC-16354 Fix internal error triggered by SORT(ds, x, -x)

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 8 年之前
父節點
當前提交
00d499efe1
共有 1 個文件被更改,包括 51 次插入18 次删除
  1. 51 18
      ecl/hqlcpp/hqlttcpp.cpp

+ 51 - 18
ecl/hqlcpp/hqlttcpp.cpp

@@ -1743,15 +1743,34 @@ IHqlExpression * normalizeAggregateExpr(IHqlExpression * tableSelector, IHqlExpr
 
 //---------------------------------------------------------------------------
 
-static void appendComponent(HqlExprArray & cpts, bool invert, IHqlExpression * expr)
+class SortListSimplifier
 {
-    if (invert)
-        cpts.append(*createValue(no_negate, expr->getType(), LINK(expr)));
-    else
-        cpts.append(*LINK(expr));
+public:
+    IHqlExpression * simplify(IHqlExpression * expr);
+
+protected:
+    void appendComponent(bool invert, IHqlExpression * expr);
+    void expandRowComponents(bool invert, IHqlExpression * select, IHqlExpression * record);
+
+protected:
+    TransformMutexBlock block;
+    HqlExprArray cpts;
+};
+
+void SortListSimplifier::appendComponent(bool invert, IHqlExpression * expr)
+{
+    //If already sorted by x or -x then no point sorting again by the same expression.
+    if (!expr->queryTransformExtra())
+    {
+        expr->setTransformExtraUnlinked(expr);
+        if (invert)
+            cpts.append(*createValue(no_negate, expr->getType(), LINK(expr)));
+        else
+            cpts.append(*LINK(expr));
+    }
 }
 
-static void expandRowComponents(HqlExprArray & cpts, bool invert, IHqlExpression * select, IHqlExpression * record)
+void SortListSimplifier::expandRowComponents(bool invert, IHqlExpression * select, IHqlExpression * record)
 {
     ForEachChild(i, record)
     {
@@ -1759,18 +1778,18 @@ static void expandRowComponents(HqlExprArray & cpts, bool invert, IHqlExpression
         switch (cur->getOperator())
         {
         case no_record:
-            expandRowComponents(cpts, invert, select, cur);
+            expandRowComponents(invert, select, cur);
             break;
         case no_ifblock:
-            expandRowComponents(cpts, invert, select, cur->queryChild(1));
+            expandRowComponents(invert, select, cur->queryChild(1));
             break;
         case no_field:
             {
                 OwnedHqlExpr childSelect = createSelectExpr(LINK(select), LINK(cur));
                 if (!childSelect->isDatarow())
-                    appendComponent(cpts, invert, childSelect);
+                    appendComponent(invert, childSelect);
                 else
-                    expandRowComponents(cpts, invert, childSelect, childSelect->queryRecord());
+                    expandRowComponents(invert, childSelect, childSelect->queryRecord());
                 break;
             }
         }
@@ -1778,14 +1797,10 @@ static void expandRowComponents(HqlExprArray & cpts, bool invert, IHqlExpression
 }
 
 
-static IHqlExpression * simplifySortlistComplexity(IHqlExpression * sortlist)
+IHqlExpression * SortListSimplifier::simplify(IHqlExpression * sortlist)
 {
-    if (!sortlist)
-        return NULL;
-
     //convert concat on fixed width strings to a list of fields.
     bool same = true;
-    HqlExprArray cpts;
     ForEachChild(idx, sortlist)
     {
         IHqlExpression * cpt = sortlist->queryChild(idx);
@@ -1813,7 +1828,7 @@ static IHqlExpression * simplifySortlistComplexity(IHqlExpression * sortlist)
             if (expand)
             {
                 ForEachItemIn(idxc, concats)
-                    appendComponent(cpts, invert, &concats.item(idxc));
+                    appendComponent(invert, &concats.item(idxc));
             }
         }
         else if (cur->getOperator() == no_trim)
@@ -1827,7 +1842,7 @@ static IHqlExpression * simplifySortlistComplexity(IHqlExpression * sortlist)
                 if (cur->queryType()->getTypeCode() == argType->getTypeCode())
                 {
                     expand = true;
-                    appendComponent(cpts, invert, arg);
+                    appendComponent(invert, arg);
                 }
             }
         }
@@ -1837,13 +1852,21 @@ static IHqlExpression * simplifySortlistComplexity(IHqlExpression * sortlist)
             if (cur->getOperator() == no_select && cur->isDatarow() && !cur->hasAttribute(newAtom))
             {
                 expand = true;
-                expandRowComponents(cpts, invert, cur, cur->queryRecord());
+                expandRowComponents(invert, cur, cur->queryRecord());
             }
 #endif
+            if (cur->queryTransformExtra())
+                expand = true;
+
+            if (cur->isConstant() && cpts.ordinality())
+                expand = true;
         }
 
         if (!expand)
+        {
+            cur->setTransformExtraUnlinked(cur);
             cpts.append(*LINK(cpt));
+        }
         else
             same = false;
     }
@@ -1853,6 +1876,16 @@ static IHqlExpression * simplifySortlistComplexity(IHqlExpression * sortlist)
     return NULL;
 }
 
+static IHqlExpression * simplifySortlistComplexity(IHqlExpression * sortlist)
+{
+    if (!sortlist)
+        return NULL;
+
+    SortListSimplifier transformer;
+    return transformer.simplify(sortlist);
+}
+
+
 static IHqlExpression * normalizeIndexBuild(IHqlExpression * expr, bool sortIndexPayload, bool alwaysLocal, bool allowImplicitSubSort)
 {
     LinkedHqlExpr dataset = expr->queryChild(0);