瀏覽代碼

HPCC-7928 Ensure each branch of a SEQUENTIAL is independent

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 12 年之前
父節點
當前提交
cb14b5c1ac
共有 2 個文件被更改,包括 43 次插入3 次删除
  1. 10 3
      ecl/hqlcpp/hqlcpp.cpp
  2. 33 0
      ecl/regress/issue7928.ecl

+ 10 - 3
ecl/hqlcpp/hqlcpp.cpp

@@ -3471,13 +3471,14 @@ void HqlCppTranslator::buildStmt(BuildCtx & _ctx, IHqlExpression * expr)
 {
     BuildCtx ctx(_ctx);
 
-    switch (expr->getOperator())
+    node_operator op = expr->getOperator();
+    switch (op)
     {
     case no_assign:
         doBuildStmtAssign(ctx, expr->queryChild(0), expr->queryChild(1));
         return;
     case no_assign_addfiles:
-        doBuildStmtAssignModify(ctx, expr->queryChild(0), expr->queryChild(1), expr->getOperator());
+        doBuildStmtAssignModify(ctx, expr->queryChild(0), expr->queryChild(1), op);
         return;
     case no_alias:
         doBuildExprAlias(ctx, expr, NULL);
@@ -3550,7 +3551,13 @@ void HqlCppTranslator::buildStmt(BuildCtx & _ctx, IHqlExpression * expr)
     case no_actionlist:
         {
             ForEachChild(idx, expr)
-                buildStmt(ctx, expr->queryChild(idx));
+            {
+                BuildCtx subctx(ctx);
+                //Add a group for each branch of a sequential to ensure all branches are independent
+                if (op == no_sequential)
+                    subctx.addGroup();
+                buildStmt(subctx, expr->queryChild(idx));
+            }
             return;
         }
     case no_wait:

+ 33 - 0
ecl/regress/issue7928.ecl

@@ -0,0 +1,33 @@
+/*##############################################################################
+
+    HPCC SYSTEMS software Copyright (C) 2013 HPCC Systems.
+
+    Licensed under the Apache License, Version 2.0 (the "License");
+    you may not use this file except in compliance with the License.
+    You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+    Unless required by applicable law or agreed to in writing, software
+    distributed under the License is distributed on an "AS IS" BASIS,
+    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+    See the License for the specific language governing permissions and
+    limitations under the License.
+############################################################################## */
+
+import FileServices from lib_FileServices;
+
+myInt := FileServices.GetUniqueInteger();
+
+sequential(
+	output(myInt, named('unique'), overwrite),
+
+	// outputs the first value as expected
+	output(workunit('unique', integer)),
+
+	// overwrite the result so subsequent reads will get this new value
+	output(myInt, named('unique'), overwrite),
+
+	// outputs the first value again, expected a different value
+	output(workunit('unique', integer)), 
+);