瀏覽代碼

Merge pull request #11644 from ghalliday/issue20328

HPCC-20328 Fix error for function with virtual dataset inside MODULE

Reviewed-By: Shamser Ahmed <shamser.ahmed@lexisnexis.co.uk>
Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 6 年之前
父節點
當前提交
6f16b81506
共有 3 個文件被更改,包括 35 次插入4 次删除
  1. 6 0
      ecl/hql/hqlexpr.cpp
  2. 3 4
      ecl/hql/hqlexpr.ipp
  3. 26 0
      ecl/regress/issue20328.ecl

+ 6 - 0
ecl/hql/hqlexpr.cpp

@@ -11241,6 +11241,12 @@ void CHqlTemplateFunctionContext::sethash()
     HASHFIELD(context);
 }
 
+IHqlExpression * CHqlTemplateFunctionContext::clone(HqlExprArray &newkids)
+{
+    assertex(newkids.ordinality() == 1);
+    return createTemplateFunctionContext(LINK(&newkids.item(0)), LINK(context));
+}
+
 //==============================================================================================================
 
 extern IHqlExpression *createParameter(IIdAtom * id, unsigned idx, ITypeInfo *type, HqlExprArray & attrs)

+ 3 - 4
ecl/hql/hqlexpr.ipp

@@ -1389,18 +1389,17 @@ class CHqlTemplateFunctionContext : public CHqlExpressionWithType
 {
 public:
     CHqlTemplateFunctionContext(IHqlExpression* expr,  IHqlScope* scope)
-        : CHqlExpressionWithType(no_template_context,expr->getType())
+        : CHqlExpressionWithType(no_template_context,expr->getType()), context(scope)
     {
         addOperand(expr);
-        context = scope;
     }
-    ~CHqlTemplateFunctionContext() { ::Release(context); }
 
     virtual IHqlScope* queryScope() override { return context; }
     virtual IHqlDataset* queryDataset() override { return queryChild(0)->queryDataset(); }
+    virtual IHqlExpression *clone(HqlExprArray &newkids) override;
 
 protected: 
-    IHqlScope* context;             // allows symbols to be resolved when reparsing.
+    Owned<IHqlScope> context;             // allows symbols to be resolved when reparsing.
     virtual void sethash();
 };
 

+ 26 - 0
ecl/regress/issue20328.ecl

@@ -0,0 +1,26 @@
+BaseModule := MODULE, VIRTUAL
+    EXPORT AppendUniqueID(VIRTUAL DATASET ds) := FUNCTION
+        ds1 := PROJECT
+            (
+                ds,
+                TRANSFORM
+                    (
+                        {
+                            UNSIGNED6   gid,
+                            RECORDOF(LEFT)
+                        },
+                        SELF.gid := COUNTER,
+                        SELF := LEFT
+                    )
+            );
+
+        RETURN ds1;
+    END;
+END;
+
+ChildModule := MODULE(BaseModule), VIRTUAL
+
+END;
+
+x := NOFOLD(DATASET(['a', 'b', 'c'], {STRING1 s}));
+ChildModule.AppendUniqueID(x);