ソースを参照

HPCC-13581 Fix problem projecting index read with ONFAIL LIMIT

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 10 年 前
コミット
9b63d49f2a
2 ファイル変更14 行追加11 行削除
  1. 0 3
      ecl/hql/hqlattr.cpp
  2. 14 8
      ecl/hql/hqlopt.cpp

+ 0 - 3
ecl/hql/hqlattr.cpp

@@ -1727,9 +1727,6 @@ bool isLocalActivity(IHqlExpression * expr)
     default:
         {
             assertex(!localChangesActivity(expr));
-            //MORE: What is this test here for??
-            if (!expr->isAction() && queryDistribution(expr))
-                return !isGroupedActivity(expr);
             return false;
         }
     }

+ 14 - 8
ecl/hql/hqlopt.cpp

@@ -3107,6 +3107,17 @@ IHqlExpression * CTreeOptimizer::doCreateTransformed(IHqlExpression * transforme
             break;
 
         }
+    case no_stepped:
+        {
+            node_operator childOp = child->getOperator();
+            switch(childOp)
+            {
+            case no_limit:
+            case no_keyedlimit:
+                return swapNodeWithChild(transformed);
+            }
+            break;
+        }
     case no_keyedlimit:
         {
             node_operator childOp = child->getOperator();
@@ -3114,7 +3125,6 @@ IHqlExpression * CTreeOptimizer::doCreateTransformed(IHqlExpression * transforme
             {
             case no_distributed:
             case no_sorted:
-            case no_stepped:
             case no_limit:
             case no_choosen:
             case no_compound_indexread:
@@ -3248,13 +3258,9 @@ IHqlExpression * CTreeOptimizer::doCreateTransformed(IHqlExpression * transforme
             case no_stepped:
                 return moveProjectionOverSimple(transformed, true, false);
             case no_keyedlimit:
-                if (isWorthMovingProjectOverLimit(transformed))
-                {
-                    if (child->hasAttribute(onFailAtom))
-                        return moveProjectionOverLimit(transformed);
-                    return swapNodeWithChild(transformed);
-                }
-                break;
+                if (child->hasAttribute(onFailAtom))
+                    return moveProjectionOverLimit(transformed);
+                return swapNodeWithChild(transformed);
             case no_catchds:
                 //could treat like a limit, but not at the moment
                 break;