瀏覽代碼

Merge remote-tracking branch 'origin/candidate-4.0.2' into closedown-4.0.x

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 12 年之前
父節點
當前提交
31b1910363
共有 2 個文件被更改,包括 29 次插入0 次删除
  1. 4 0
      ecl/hqlcpp/hqlckey.cpp
  2. 25 0
      ecl/regress/issue9479.ecl

+ 4 - 0
ecl/hqlcpp/hqlckey.cpp

@@ -966,6 +966,9 @@ static void doGatherFieldsAccessed(RecursionChecker & checker, HqlExprArray & fi
 
 static void gatherFieldsAccessed(HqlExprArray & fieldsAccessed, IHqlExpression * cond, IHqlExpression * ds)
 {
+    if (!cond)
+        return;
+
     RecursionChecker checker;
 
     doGatherFieldsAccessed(checker, fieldsAccessed, cond, ds);
@@ -1000,6 +1003,7 @@ void KeyedJoinInfo::optimizeExtractJoinFields()
     else
     {
         gatherFieldsAccessed(fieldsAccessed, expr->queryChild(3), right);
+        gatherFieldsAccessed(fieldsAccessed, queryPropertyChild(expr, onFailAtom, 0), right);
 
         if (isFullJoin())
         {

+ 25 - 0
ecl/regress/issue9479.ecl

@@ -0,0 +1,25 @@
+rec := RECORD
+ unsigned4 key;
+ unsigned4 aux;
+ STRING50 payload;
+END;
+
+ds := DATASET([{1,81,''}, {1,82,''}, {1,83,''}, {2,91,''}], rec);
+
+i := INDEX(ds, {key}, {aux, payload}, '~aindex');
+
+lhs := TABLE(ds, { key });
+
+rec joinFunc(lhs l, i r) := TRANSFORM
+  SELF := l;
+  SELF := r;
+END;
+
+SEQUENTIAL(
+BUILDINDEX(SORTED(ds, key, payload), { key }, { aux, payload }, '~aindex', OVERWRITE),
+
+// Fails with code generator error "Dataset 'right' does not contain expression 'key'"
+// OUTPUT(JOIN(lhs, i, LEFT.key = RIGHT.key, joinFunc(LEFT, RIGHT), LIMIT(2), ONFAIL(TRANSFORM(rec, SELF.payload := '***FAILED***', SELF.key := RIGHT.key; SELF.aux := RIGHT.aux))))
+// Works, if 'key' is extracted from LEFT instead. Also works if hThor is targeted instead.
+OUTPUT(JOIN(lhs, i, LEFT.key = RIGHT.key, joinFunc(LEFT, RIGHT), LIMIT(2), ONFAIL(TRANSFORM(rec, SELF.payload := '***FAILED***', SELF.key := RIGHT.key; SELF.aux := RIGHT.aux))))
+);