Forráskód Böngészése

Merge pull request #5109 from ghalliday/issue10363b

HPCC-10363 Don't convert non-many LOOKUP joins to ALL joins

Reviewed-By: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman 11 éve
szülő
commit
6211da3d8d

+ 5 - 1
ecl/hqlcpp/hqlhtcpp.cpp

@@ -11518,6 +11518,7 @@ ABoundActivity * HqlCppTranslator::doBuildActivityJoinOrDenormalize(BuildCtx & c
     bool joinToSelf = (op == no_selfjoin);
     bool allowAllToLookupConvert = !options.noAllToLookupConversion;
     IHqlExpression * atmostAttr = expr->queryAttribute(atmostAtom);
+    LinkedHqlExpr keepLimit = queryAttributeChild(expr, keepAtom, 0);
     //Delay removing ungroups until this point because they can be useful for reducing the size of spill files.
     if (isUngroup(dataset1) && !isLookupJoin)
         dataset1.set(dataset1->queryChild(0));
@@ -11602,6 +11603,10 @@ ABoundActivity * HqlCppTranslator::doBuildActivityJoinOrDenormalize(BuildCtx & c
                 }
             }
             isAllJoin = true;
+            //A non-many LOOKUP join can't really be converted to an ALL join.
+            //Possibly if KEEP(1) was added, no limits, no skipping in transform etc.
+            if (isLookupJoin && !isManyLookup)
+                isAllJoin = false;
             WARNING(HQLWRN_JoinConditionFoldedNowAll);
         }
         else
@@ -11729,7 +11734,6 @@ ABoundActivity * HqlCppTranslator::doBuildActivityJoinOrDenormalize(BuildCtx & c
     buildInstancePrefix(instance);
     StringBuffer s,temp;
 
-    LinkedHqlExpr keepLimit = queryAttributeChild(expr, keepAtom, 0);
     DatasetReference lhsDsRef(dataset1, no_activetable, NULL);
     DatasetReference rhsDsRef(dataset2, no_activetable, NULL);
 

+ 10 - 0
testing/regress/ecl/key/lookupjoinall.xml

@@ -0,0 +1,10 @@
+<Dataset name='Result 1'>
+ <Row><x>0</x><id>1</id></Row>
+ <Row><x>0</x><id>2</id></Row>
+ <Row><x>0</x><id>3</id></Row>
+</Dataset>
+<Dataset name='Result 2'>
+ <Row><x>0</x><id>1</id></Row>
+ <Row><x>0</x><id>2</id></Row>
+ <Row><x>0</x><id>3</id></Row>
+</Dataset>

+ 25 - 0
testing/regress/ecl/lookupjoinall.ecl

@@ -0,0 +1,25 @@
+/*##############################################################################
+
+    HPCC SYSTEMS software Copyright (C) 2012 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.
+############################################################################## */
+
+dsLeft := DATASET([1,2,3], { unsigned id; });
+dsRight := DATASET([4,5,6], { unsigned id; });
+
+pLeft := TABLE(dsLeft, { unsigned x := 0; id });
+pRight := TABLE(dsRight, { unsigned x := 0; id });
+
+JOIN(pLeft,pRight,LEFT.x = RIGHT.x,lookup);
+JOIN(NOFOLD(pLeft),NOFOLD(pRight),LEFT.x = RIGHT.x,lookup);