Browse Source

Merge pull request #9415 from ghalliday/issue16619

HPCC-16619 Ensure no_select in out of line functions are normalized

Reviewed By: Shamser Ahmed <shamser.ahmed@lexisnexis.co.uk>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 8 years ago
parent
commit
ab8fe1ffad
2 changed files with 27 additions and 1 deletions
  1. 26 1
      ecl/hqlcpp/hqlttcpp.cpp
  2. 1 0
      ecl/hqlcpp/hqlttcpp.ipp

+ 26 - 1
ecl/hqlcpp/hqlttcpp.cpp

@@ -855,6 +855,7 @@ YesNoOption HqlThorBoundaryTransformer::calcNormalizeThor(IHqlExpression * expr)
     case no_all:
     case no_self:
     case no_activerow:
+    case no_param:
         return OptionMaybe;
     case no_evaluate:
         throwUnexpected();
@@ -869,6 +870,7 @@ YesNoOption HqlThorBoundaryTransformer::calcNormalizeThor(IHqlExpression * expr)
             case no_externalcall:
                 return normalizeThor(ds);
             case no_self:
+            case no_param:
                 return OptionMaybe;
             }
             return isNew ? OptionYes : OptionMaybe;
@@ -9699,6 +9701,28 @@ IHqlExpression * HqlScopeTagger::transformAmbiguousChildren(IHqlExpression * exp
 }
 
 
+IHqlExpression * HqlScopeTagger::transformCall(IHqlExpression * expr)
+{
+    unsigned max = expr->numChildren();
+    bool same = true;
+    HqlExprArray args;
+    args.ensure(max);
+    for(unsigned i=0; i < max; i++)
+    {
+        IHqlExpression * cur = expr->queryChild(i);
+        IHqlExpression * tr = transformAmbiguous(cur, false);
+        args.append(*tr);
+        if (cur != tr)
+            same = false;
+    }
+    IHqlExpression * funcdef = expr->queryFunctionDefinition();
+    OwnedHqlExpr newFuncDef = transform(funcdef);
+    if (same && funcdef == newFuncDef)
+        return LINK(expr);
+    return createReboundFunction(newFuncDef, args);
+}
+
+
 IHqlExpression * HqlScopeTagger::transformSizeof(IHqlExpression * expr)
 {
     IHqlExpression * arg = expr->queryChild(0)->queryNormalizedSelector();
@@ -9818,12 +9842,13 @@ IHqlExpression * HqlScopeTagger::createTransformed(IHqlExpression * expr)
         break;
     case no_select:
         return transformSelect(expr);
-    case no_call:
     case no_externalcall:
     case no_rowvalue:
 //  case no_addfiles:
 //  case no_libraryscopeinstance:??
         return transformAmbiguousChildren(expr);
+    case no_call:
+        return transformCall(expr);
     case no_offsetof:
     case no_sizeof:
         return transformSizeof(expr);

+ 1 - 0
ecl/hqlcpp/hqlttcpp.ipp

@@ -1065,6 +1065,7 @@ protected:
 
     IHqlExpression * transformAmbiguous(IHqlExpression * expr, bool isActiveOk);
     IHqlExpression * transformAmbiguousChildren(IHqlExpression * expr);
+    IHqlExpression * transformCall(IHqlExpression * expr);
     IHqlExpression * transformNewDataset(IHqlExpression * expr, bool isActiveOk);
     IHqlExpression * transformRelated(IHqlExpression * expr);
     IHqlExpression * transformSelectorsAttr(IHqlExpression * expr);