瀏覽代碼

Merge pull request #11636 from ghalliday/issue20402

HPCC-20402 Sort orders could be lost if dataset duplicated in sort criteria

Reviewed-By: Shamser Ahmed <shamser.ahmed@lexisnexis.co.uk>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 6 年之前
父節點
當前提交
b48dba12f8
共有 2 個文件被更改,包括 48 次插入0 次删除
  1. 18 0
      ecl/hqlcpp/hqlresource.cpp
  2. 30 0
      ecl/regress/issue20402.ecl

+ 18 - 0
ecl/hqlcpp/hqlresource.cpp

@@ -1361,6 +1361,24 @@ IHqlExpression * ActivityInvariantHoister::replaceResourcedReferences(ActivityIn
     if (!isAffectedByResourcing(expr))
         return LINK(expr);
 
+    //Process each element in a sort list independently.  Otherwise (a very obscure bug)
+    //sort(ds, { ds, ds.x }) will incorrectly become SORT(ds, { ds', ds'.x })
+    if (expr->getOperator() == no_sortlist)
+    {
+        bool same = true;
+        HqlExprArray args;
+        args.ensure(expr->numChildren());
+        ForEachChild(i, expr)
+        {
+            IHqlExpression * cur = expr->queryChild(i);
+            IHqlExpression * mapped = replaceResourcedReferences(info, cur);
+            args.append(*mapped);
+            if (cur != mapped)
+                same = false;
+        }
+        return same ? LINK(expr) : expr->clone(args);
+    }
+
     LinkedHqlExpr mapped = expr;
     if (info && (info->childDependents.ordinality()))
     {

+ 30 - 0
ecl/regress/issue20402.ecl

@@ -0,0 +1,30 @@
+Dbg(sym) := MACRO
+    OUTPUT(sym, NAMED(#TEXT(sym)));
+ENDMACRO;
+
+DataRec := RECORD
+    UNSIGNED4   n;
+    UNSIGNED4   i;
+END;
+
+ds1 := DATASET
+    (
+        5,
+        TRANSFORM
+            (
+                DataRec,
+                SELF.n := RANDOM(),
+                SELF.i := RANDOM()
+            )
+    );
+
+ds2 := DATASET(['foo', 'bar'], {STRING s});
+
+Dbg(ds1);
+Dbg(ds2);
+
+ds3 := DEDUP(ds1, ds2, WHOLE RECORD, ALL);
+Dbg(ds3);
+
+ds4 := SORT(ds1, ds1, n);
+Dbg(ds4);