Просмотр исходного кода

Merge pull request #13557 from ghalliday/optimizeNetwork

HPCC-23778 Fix internal errors from #option ('aggressiveOptimizeProjects')

Reviewed-By: Shamser Ahmed <shamser.ahmed@lexisnexis.co.uk>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 5 лет назад
Родитель
Сommit
9546ca896e
3 измененных файлов с 27 добавлено и 13 удалено
  1. 23 11
      ecl/hql/hqltrans.cpp
  2. 1 0
      ecl/hql/hqltrans.ipp
  3. 3 2
      ecl/hqlcpp/hqliproj.cpp

+ 23 - 11
ecl/hql/hqltrans.cpp

@@ -2030,29 +2030,42 @@ IHqlExpression * NewHqlTransformer::doUpdateOrphanedSelectors(IHqlExpression * e
     //Happens in constant folding when filters etc. are replaced with a very different child
     //Happens when also hoisting a non-table expression e.g, globalAutoHoist
 
-    IHqlExpression * newDs = transformed->queryChild(0);
-    if (!newDs || !newDs->isDataset())
+    // Check this before unwinding the arguments
+    childDatasetType childType = getChildDatasetType(expr);
+    if (!(childType & childdataset_hasdataset))
         return LINK(transformed);
 
+    HqlExprArray args;
+    unwindChildren(args, transformed);
+    if (updateOrphanedSelectors(args, expr))
+        return transformed->clone(args);
+    return LINK(transformed);
+}
+
+bool NewHqlTransformer::updateOrphanedSelectors(HqlExprArray & args, IHqlExpression * expr)
+{
+    //See the comments in doUpdateOrphanedSelectors() above
     childDatasetType childType = getChildDatasetType(expr);
     if (!(childType & childdataset_hasdataset))
-        return LINK(transformed);
+        return false;
+
+    IHqlExpression * newDs = &args.item(0);
+    if (!newDs || !newDs->isDataset())
+        return false;
 
-    LinkedHqlExpr updated = transformed;
     IHqlExpression * ds = expr->queryChild(0);
+    bool changed = false;
     for (;;)
     {
         if (newDs == ds)
-            return updated.getClear();
+            return changed;
 
         OwnedHqlExpr transformedSelector = transformSelector(ds->queryNormalizedSelector());
         IHqlExpression * newSelector = newDs->queryNormalizedSelector();
         if (transformedSelector != newSelector)
         {
-            HqlExprArray args;
-            args.append(*LINK(updated->queryChild(0)));
-            replaceSelectors(args, updated, 1, transformedSelector, newSelector);
-            updated.setown(updated->clone(args));
+            changed = true;
+            replaceSelectors(args, 1, transformedSelector, newSelector);
         }
 
         //In unusual situations we also need to map selectors for any parent datasets that are in scope
@@ -2077,8 +2090,7 @@ IHqlExpression * NewHqlTransformer::doUpdateOrphanedSelectors(IHqlExpression * e
             newDs = newDs->queryChild(0);
         }
     }
-
-    return updated.getClear();
+    return changed;
 }
 
 //---------------------------------------------------------------------------

+ 1 - 0
ecl/hql/hqltrans.ipp

@@ -484,6 +484,7 @@ protected:
             transformed.setown(doUpdateOrphanedSelectors(expr, transformed));
     }
     IHqlExpression * doUpdateOrphanedSelectors(IHqlExpression * expr, IHqlExpression * transformed);
+    bool updateOrphanedSelectors(HqlExprArray & args, IHqlExpression * expr);
 
     IHqlExpression * queryTransformed(IHqlExpression * expr);
 

+ 3 - 2
ecl/hqlcpp/hqliproj.cpp

@@ -2744,6 +2744,7 @@ void ImplicitProjectTransformer::logChange(const char * message, IHqlExpression
 void ImplicitProjectTransformer::getTransformedChildren(IHqlExpression * expr, HqlExprArray & children)
 {
     transformChildren(expr, children);
+    updateOrphanedSelectors(children, expr);
 }
 
 IHqlExpression * ImplicitProjectTransformer::createParentTransformed(IHqlExpression * expr)
@@ -2826,7 +2827,7 @@ IHqlExpression * ImplicitProjectTransformer::createTransformed(IHqlExpression *
                 IHqlExpression * transform = &args.item(transformPos);
                 IHqlExpression * newTransform = complexExtra->outputFields.createFilteredTransform(transform, NULL);
                 args.replace(*newTransform, transformPos);
-                if (transform->getOperator() == no_newtransform)
+                if (newTransform->getOperator() == no_newtransform)
                     args.replace(*LINK(complexExtra->queryOutputRecord()), transformPos-1);
                 IHqlExpression * onFail = queryAttribute(onFailAtom, args);
                 if (onFail)
@@ -3020,7 +3021,7 @@ IHqlExpression * ImplicitProjectTransformer::createTransformed(IHqlExpression *
                 HqlExprArray args;
                 OwnedHqlExpr inputProject = complexExtra->createOutputProject(transformed->queryChild(0));
                 OwnedHqlExpr replacement = replaceChildDataset(transformed, inputProject, 0);
-                transformed.setown(updateSelectors(replacement, expr));
+                transformed.setown(updateSelectors(replacement, transformed));
                 logChange("Insert project before", expr, complexExtra->outputFields);
             }
             else