This is an automated email from the ASF dual-hosted git repository.

shaofengshi pushed a commit to branch 2.4.x
in repository https://gitbox.apache.org/repos/asf/kylin.git


The following commit(s) were added to refs/heads/2.4.x by this push:
     new 3cb77ac  KYLIN-3634 when filter column has null value may cause 
incorrect query result
3cb77ac is described below

commit 3cb77ac7279b49fdd3dc59cceedd8a090515d7ff
Author: wangbo <506340...@qq.com>
AuthorDate: Wed Oct 17 14:04:39 2018 +0800

    KYLIN-3634 when filter column has null value may cause incorrect query 
result
---
 .../src/main/java/org/apache/kylin/gridtable/GTUtil.java     | 12 +++++++++---
 .../org/apache/kylin/storage/gtrecord/DictGridTableTest.java |  7 +++++--
 2 files changed, 14 insertions(+), 5 deletions(-)

diff --git a/core-cube/src/main/java/org/apache/kylin/gridtable/GTUtil.java 
b/core-cube/src/main/java/org/apache/kylin/gridtable/GTUtil.java
index 62053a3..15cf541 100644
--- a/core-cube/src/main/java/org/apache/kylin/gridtable/GTUtil.java
+++ b/core-cube/src/main/java/org/apache/kylin/gridtable/GTUtil.java
@@ -295,7 +295,7 @@ public class GTUtil {
             case NEQ:
                 code = translate(col, firstValue, 0);
                 if (code == null) {
-                    result = ConstantTupleFilter.TRUE;
+                    result = 
newCompareFilter(TupleFilter.FilterOperatorEnum.ISNOTNULL, externalCol);
                 } else {
                     newCompareFilter.addChild(new ConstantTupleFilter(code));
                     result = newCompareFilter;
@@ -306,7 +306,7 @@ public class GTUtil {
                 if (code == null) {
                     code = translate(col, firstValue, -1);
                     if (code == null)
-                        result = ConstantTupleFilter.FALSE;
+                        result = 
newCompareFilter(TupleFilter.FilterOperatorEnum.ISNOTNULL, externalCol);
                     else
                         result = newCompareFilter(FilterOperatorEnum.LTE, 
externalCol, code);
                 } else {
@@ -328,7 +328,7 @@ public class GTUtil {
                 if (code == null) {
                     code = translate(col, firstValue, 1);
                     if (code == null)
-                        result = ConstantTupleFilter.FALSE;
+                        result = 
newCompareFilter(TupleFilter.FilterOperatorEnum.ISNOTNULL, externalCol);
                     else
                         result = newCompareFilter(FilterOperatorEnum.GTE, 
externalCol, code);
                 } else {
@@ -358,6 +358,12 @@ public class GTUtil {
             return r;
         }
 
+        private TupleFilter newCompareFilter(TupleFilter.FilterOperatorEnum 
op, TblColRef col) {
+            CompareTupleFilter r = new CompareTupleFilter(op);
+            r.addChild(new ColumnTupleFilter(col));
+            return r;
+        }
+
         transient ByteBuffer buf;
 
         protected ByteArray translate(int col, Object value, int roundingFlag) 
{
diff --git 
a/core-storage/src/test/java/org/apache/kylin/storage/gtrecord/DictGridTableTest.java
 
b/core-storage/src/test/java/org/apache/kylin/storage/gtrecord/DictGridTableTest.java
index 073c12c..a9728cb 100644
--- 
a/core-storage/src/test/java/org/apache/kylin/storage/gtrecord/DictGridTableTest.java
+++ 
b/core-storage/src/test/java/org/apache/kylin/storage/gtrecord/DictGridTableTest.java
@@ -451,7 +451,9 @@ public class DictGridTableTest extends 
LocalFileMetadataTestCase {
         {
             LogicalTupleFilter filter = and(fComp1, compare(extColB, 
FilterOperatorEnum.LT, "9"));
             TupleFilter newFilter = 
GTUtil.convertFilterColumnsAndConstants(filter, info, colMapping, null);
-            assertEquals(ConstantTupleFilter.FALSE, newFilter);
+            assertEquals(
+                    "AND [UNKNOWN_MODEL:NULL.GT_MOCKUP_TABLE.0 GT 
[\\x00\\x00\\x01J\\xE5\\xBD\\x5C\\x00], UNKNOWN_MODEL:NULL.GT_MOCKUP_TABLE.1 
ISNOTNULL []]",
+                    newFilter.toString());
         }
 
         // $1<"10" needs no rounding
@@ -516,7 +518,8 @@ public class DictGridTableTest extends 
LocalFileMetadataTestCase {
         {
             LogicalTupleFilter filter = and(fComp1, compare(extColB, 
FilterOperatorEnum.GT, "101"));
             TupleFilter newFilter = 
GTUtil.convertFilterColumnsAndConstants(filter, info, colMapping, null);
-            assertEquals(ConstantTupleFilter.FALSE, newFilter);
+            assertEquals("AND [UNKNOWN_MODEL:NULL.GT_MOCKUP_TABLE.0 GT 
[\\x00\\x00\\x01J\\xE5\\xBD\\x5C\\x00], UNKNOWN_MODEL:NULL.GT_MOCKUP_TABLE.1 
ISNOTNULL []]",
+                    newFilter.toString());
         }
 
         // $1>"100" needs no rounding

Reply via email to