소스 검색

Merge pull request #7380 from ghalliday/issue13581

HPCC-13581 Fix problem projecting index read with ONFAIL LIMIT

Reviewed-By: Jamie Noss <james.noss@lexisnexis.com>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 10 년 전
부모
커밋
4338d59814
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

@@ -3181,6 +3181,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();
@@ -3188,7 +3199,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:
@@ -3322,13 +3332,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;