Explorar el Código

Merge branch 'candidate-7.12.x' into candidate-8.0.x

Signed-off-by: Richard Chapman <rchapman@hpccsystems.com>
Richard Chapman hace 3 años
padre
commit
c9707cdce0

+ 96 - 0
testing/regress/ecl/indexlimit3.ecl

@@ -0,0 +1,96 @@
+/*##############################################################################
+
+    HPCC SYSTEMS software Copyright (C) 2022 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.
+############################################################################## */
+
+//version optRemoteRead=false
+//version optRemoteRead=true
+
+#onwarning(4523, ignore);
+
+import $.setup;
+import ^ as root;
+prefix := setup.Files(false, false).QueryFilePrefix;
+optRemoteRead := #IFDEFINED(root.optRemoteRead, false);
+#option('forceRemoteRead', optRemoteRead);
+
+
+crec := RECORD
+ unsigned ckey;
+ string info := '';
+END;
+
+rec := RECORD
+  unsigned key;
+  unsigned key2;
+  unsigned v;
+  DATASET(crec) kkeys;
+  string info := '';
+END;
+
+
+ds := DATASET([
+ {1,2,1,[{991}]},
+ {1,2,6,[{992}]},
+ {1,2,7,[{993}]},
+ {1,2,8,[{994}]},
+ {1,2,9,[{995}]},
+ {4,2,2,[{996}]},
+ {4,2,3,[{997}]},
+ {4,2,4,[{998}]},
+ {4,2,5,[{999}]}
+], rec);
+
+i := INDEX(ds, {key, key2}, {ds}, prefix + 'index');
+
+// NB: filter designed so result is not 1st keyed match.
+fi := i(KEYED(key=1) AND v >= 6 AND v <= 8);
+
+SEQUENTIAL(
+ BUILD(i, FEW, OVERWRITE);
+
+ OUTPUT(fi);
+ OUTPUT(COUNT(fi));
+
+// Hit limits
+// indexread with LIMIT
+ OUTPUT(LIMIT(fi, 2, ONFAIL(TRANSFORM(RECORDOF(fi), SELF.info := '**ROW LIMIT HIT IN INDEXREAD**'; SELF := []))));
+ OUTPUT(LIMIT(fi, 4, KEYED, ONFAIL(TRANSFORM(RECORDOF(fi), SELF.info := '**KEYED LIMIT HIT IN INDEXREAD**'; SELF := []))));
+
+// indexcount with limits. NB: if exceeded, count will be 1
+ OUTPUT(COUNT(LIMIT(fi, 2, ONFAIL(TRANSFORM(RECORDOF(fi), SELF.info := '**ROW LIMIT HIT IN INDEXCOUNT**'; SELF := [])))));
+ OUTPUT(COUNT(LIMIT(fi, 4, KEYED, ONFAIL(TRANSFORM(RECORDOF(fi), SELF.info := '**KEYED LIMIT HIT IN INDEXCOUNT**'; SELF := [])))));
+
+// indexnormalize
+ //OUTPUT(LIMIT(fi.kkeys(ckey>=992), 2, ONFAIL(TRANSFORM(RECORDOF(crec), SELF.info := '**ROW LIMIT HIT IN INDEXNORMALIZE**'; SELF := []))));
+
+
+// Under limits
+// indexread with LIMIT
+ OUTPUT(LIMIT(fi, 3, ONFAIL(TRANSFORM(RECORDOF(fi), SELF.info := '**ROW LIMIT HIT IN INDEXREAD**'; SELF := []))));
+ OUTPUT(LIMIT(fi, 5, KEYED, ONFAIL(TRANSFORM(RECORDOF(fi), SELF.info := '**KEYED LIMIT HIT IN INDEXREAD**'; SELF := []))));
+
+// indexcount with limits. NB: if exceeded, count will be 1
+ OUTPUT(COUNT(LIMIT(fi, 3, ONFAIL(TRANSFORM(RECORDOF(fi), SELF.info := '**ROW LIMIT HIT IN INDEXCOUNT**'; SELF := [])))));
+ OUTPUT(COUNT(LIMIT(fi, 5, KEYED, ONFAIL(TRANSFORM(RECORDOF(fi), SELF.info := '**KEYED LIMIT HIT IN INDEXCOUNT**'; SELF := [])))));
+ OUTPUT(EXISTS(fi));
+
+// indexread with choosen
+ OUTPUT(CHOOSEN(fi, 1));
+
+// indexnormalize
+ OUTPUT(LIMIT(fi.kkeys(ckey>=992), 3, ONFAIL(TRANSFORM(RECORDOF(crec), SELF.info := '**ROW LIMIT HIT IN INDEXNORMALIZE**'; SELF := []))));
+ OUTPUT(CHOOSEN(fi.kkeys(ckey>=994), 1));
+);

+ 52 - 0
testing/regress/ecl/key/indexlimit3.xml

@@ -0,0 +1,52 @@
+<Dataset name='Result 1'>
+</Dataset>
+<Dataset name='Result 2'>
+ <Row><key>1</key><key2>2</key2><v>6</v><kkeys><Row><ckey>992</ckey><info></info></Row></kkeys><info></info><__internal_fpos__>0</__internal_fpos__></Row>
+ <Row><key>1</key><key2>2</key2><v>7</v><kkeys><Row><ckey>993</ckey><info></info></Row></kkeys><info></info><__internal_fpos__>0</__internal_fpos__></Row>
+ <Row><key>1</key><key2>2</key2><v>8</v><kkeys><Row><ckey>994</ckey><info></info></Row></kkeys><info></info><__internal_fpos__>0</__internal_fpos__></Row>
+</Dataset>
+<Dataset name='Result 3'>
+ <Row><Result_3>3</Result_3></Row>
+</Dataset>
+<Dataset name='Result 4'>
+ <Row><key>0</key><key2>0</key2><v>0</v><kkeys></kkeys><info>**ROW LIMIT HIT IN INDEXREAD**</info><__internal_fpos__>0</__internal_fpos__></Row>
+</Dataset>
+<Dataset name='Result 5'>
+ <Row><key>0</key><key2>0</key2><v>0</v><kkeys></kkeys><info>**KEYED LIMIT HIT IN INDEXREAD**</info><__internal_fpos__>0</__internal_fpos__></Row>
+</Dataset>
+<Dataset name='Result 6'>
+ <Row><Result_6>1</Result_6></Row>
+</Dataset>
+<Dataset name='Result 7'>
+ <Row><Result_7>1</Result_7></Row>
+</Dataset>
+<Dataset name='Result 8'>
+ <Row><key>1</key><key2>2</key2><v>6</v><kkeys><Row><ckey>992</ckey><info></info></Row></kkeys><info></info><__internal_fpos__>0</__internal_fpos__></Row>
+ <Row><key>1</key><key2>2</key2><v>7</v><kkeys><Row><ckey>993</ckey><info></info></Row></kkeys><info></info><__internal_fpos__>0</__internal_fpos__></Row>
+ <Row><key>1</key><key2>2</key2><v>8</v><kkeys><Row><ckey>994</ckey><info></info></Row></kkeys><info></info><__internal_fpos__>0</__internal_fpos__></Row>
+</Dataset>
+<Dataset name='Result 9'>
+ <Row><key>1</key><key2>2</key2><v>6</v><kkeys><Row><ckey>992</ckey><info></info></Row></kkeys><info></info><__internal_fpos__>0</__internal_fpos__></Row>
+ <Row><key>1</key><key2>2</key2><v>7</v><kkeys><Row><ckey>993</ckey><info></info></Row></kkeys><info></info><__internal_fpos__>0</__internal_fpos__></Row>
+ <Row><key>1</key><key2>2</key2><v>8</v><kkeys><Row><ckey>994</ckey><info></info></Row></kkeys><info></info><__internal_fpos__>0</__internal_fpos__></Row>
+</Dataset>
+<Dataset name='Result 10'>
+ <Row><Result_10>3</Result_10></Row>
+</Dataset>
+<Dataset name='Result 11'>
+ <Row><Result_11>3</Result_11></Row>
+</Dataset>
+<Dataset name='Result 12'>
+ <Row><Result_12>true</Result_12></Row>
+</Dataset>
+<Dataset name='Result 13'>
+ <Row><key>1</key><key2>2</key2><v>6</v><kkeys><Row><ckey>992</ckey><info></info></Row></kkeys><info></info><__internal_fpos__>0</__internal_fpos__></Row>
+</Dataset>
+<Dataset name='Result 14'>
+ <Row><ckey>992</ckey><info></info></Row>
+ <Row><ckey>993</ckey><info></info></Row>
+ <Row><ckey>994</ckey><info></info></Row>
+</Dataset>
+<Dataset name='Result 15'>
+ <Row><ckey>994</ckey><info></info></Row>
+</Dataset>

+ 9 - 4
thorlcr/activities/indexread/thindexreadslave.cpp

@@ -491,8 +491,11 @@ public:
 
         if ((RCMAX != keyedLimit) && (keyedLimit+1 < remoteLimit))
             remoteLimit = keyedLimit+1; // 1 more to ensure triggered when received back.
-        if ((RCMAX != rowLimit) && (rowLimit+1 < remoteLimit))
-            remoteLimit = rowLimit+1; // 1 more to ensure triggered when received back.
+        if (!mayFilter)
+        {
+            if ((RCMAX != rowLimit) && (rowLimit+1 < remoteLimit))
+                remoteLimit = rowLimit+1; // 1 more to ensure triggered when received back.
+        }
     }
     void calcKeyedLimitCount()
     {
@@ -1208,7 +1211,8 @@ public:
         ActivityTimer s(slaveTimerStats, timeActivities);
 
         // NB: initLimits sets up remoteLimit before base start() call, because if parts are remote PARENT::start() will use remoteLimit
-        initLimits(helper->getChooseNLimit(), helper->getKeyedLimit(), helper->getRowLimit(), helper->hasMatchFilter());
+        // NB2: I'm not sure if hasMatchFilter() can ever actually be generated.
+        initLimits(helper->getChooseNLimit(), helper->getKeyedLimit(), helper->getRowLimit(), helper->hasFilter() || helper->hasMatchFilter());
         calcKeyedLimitCount();
 
         PARENT::start();
@@ -1384,7 +1388,8 @@ public:
         ActivityTimer s(slaveTimerStats, timeActivities);
 
         // NB: initLimits sets up remoteLimit before base start() call, because if parts are remote PARENT::start() will use remoteLimit
-        initLimits(helper->getChooseNLimit(), helper->getKeyedLimit(), helper->getRowLimit(), helper->hasMatchFilter());
+        // NB2: mayFilter=true assumed, because there is no flag to indicate post-filtering
+        initLimits(helper->getChooseNLimit(), helper->getKeyedLimit(), helper->getRowLimit(), true);
         calcKeyedLimitCount();
 
         PARENT::start();