瀏覽代碼

HPCC-13767 Fix stack fault in code generator iterating grouped datasets

Signed-off-by: Gavin Halliday <gavin.halliday@lexisnexis.com>
Gavin Halliday 10 年之前
父節點
當前提交
0bd39fc262
共有 3 個文件被更改,包括 44 次插入6 次删除
  1. 2 6
      ecl/hqlcpp/hqlcppds.cpp
  2. 7 0
      ecl/hqlcpp/hqlcset.cpp
  3. 35 0
      ecl/regress/issue13767.ecl

+ 2 - 6
ecl/hqlcpp/hqlcppds.cpp

@@ -2149,12 +2149,8 @@ void HqlCppTranslator::doBuildDataset(BuildCtx & ctx, IHqlExpression * expr, CHq
         return;
     case no_getresult:
     case no_workunit_dataset:
-        if (!isGrouped(expr))
-        {
-            doBuildExprGetResult(ctx, expr, tgt);
-            return;
-        }
-        break;
+        doBuildExprGetResult(ctx, expr, tgt);
+        return;
     case no_skip:
         {
             buildStmt(ctx, expr);

+ 7 - 0
ecl/hqlcpp/hqlcset.cpp

@@ -627,6 +627,13 @@ BoundRow * InlineLinkedDatasetCursor::doBuildIterateLoop(BuildCtx & ctx, bool ne
     ctx.addLoop(test, NULL, false);
     ctx.addQuoted(s.clear().append(rowName).append(" = *").append(cursorName).append("++;"));
     BoundRow * cursor = translator.bindTableCursor(ctx, ds, row);
+    if (isGrouped(ds))
+    {
+        BuildCtx filterctx(ctx);
+        OwnedHqlExpr cond = createBoolExpr(no_not, LINK(cursor->queryBound()));
+        filterctx.addFilter(cond);
+        filterctx.addContinue();
+    }
     if (checkForNull)
         cursor->setConditional(true);
     return cursor;

+ 35 - 0
ecl/regress/issue13767.ecl

@@ -0,0 +1,35 @@
+/*##############################################################################
+
+    HPCC SYSTEMS software Copyright (C) 2015 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.
+############################################################################## */
+
+namesRecord :=
+            RECORD
+string20        surname;
+string10        forename;
+integer2        age := 25;
+            END;
+
+namesTable2 := group(dataset([
+        {'Hawthorn','Gavin',31},
+        {'Hawthorn','Mia',30},
+        {'Smithe','Pru',10},
+        {'X','Z'}], namesRecord),surname) : global(few);
+
+doSomething(string name) := BEGINC++
+    // a dummy function
+ENDC++;
+
+nothor(apply(namesTable2, doSomething(namesTable2.surname)));