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

kumarvishal09 pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/carbondata.git


The following commit(s) were added to refs/heads/master by this push:
     new 10149eb  [CARBONDATA-3584] Fix Select Query failure for Boolean 
dictionary column when Codegen is diasbled
10149eb is described below

commit 10149eb9f58dce578702cc7e7266671201198412
Author: Indhumathi27 <[email protected]>
AuthorDate: Fri Nov 15 16:51:28 2019 +0530

    [CARBONDATA-3584] Fix Select Query failure for Boolean dictionary column 
when Codegen is diasbled
    
    Problem:
    Select query fails for boolean dictionary column with CastException when 
codegen is disabled.
    
    Solution:
    Added Boolean case in getDataBasedOnDataType and decode Boolean in 
CodegenContext
    
    This closes #3463
---
 .../org/apache/carbondata/core/util/DataTypeUtil.java   |  6 ++++++
 .../org/apache/spark/sql/CarbonDictionaryDecoder.scala  | 16 ++++++++++++++++
 .../booleantype/BooleanDataTypesBaseTest.scala          | 17 +++++++++++++++++
 3 files changed, 39 insertions(+)

diff --git 
a/core/src/main/java/org/apache/carbondata/core/util/DataTypeUtil.java 
b/core/src/main/java/org/apache/carbondata/core/util/DataTypeUtil.java
index 660c705..f138323 100644
--- a/core/src/main/java/org/apache/carbondata/core/util/DataTypeUtil.java
+++ b/core/src/main/java/org/apache/carbondata/core/util/DataTypeUtil.java
@@ -715,6 +715,12 @@ public final class DataTypeUtil {
           javaDecVal = 
javaDecVal.setScale(dimension.getColumnSchema().getScale());
         }
         return 
getDataTypeConverter().convertFromBigDecimalToDecimal(javaDecVal);
+      } else if (dataType == DataTypes.BOOLEAN) {
+        String data8 = new String(dataInBytes, 
CarbonCommonConstants.DEFAULT_CHARSET_CLASS);
+        if (data8.isEmpty()) {
+          return null;
+        }
+        return BooleanConvert.parseBoolean(data8);
       } else {
         return getDataTypeConverter().convertFromByteToUTF8String(dataInBytes);
       }
diff --git 
a/integration/spark2/src/main/scala/org/apache/spark/sql/CarbonDictionaryDecoder.scala
 
b/integration/spark2/src/main/scala/org/apache/spark/sql/CarbonDictionaryDecoder.scala
index 3b20c2f..9b9d7a6 100644
--- 
a/integration/spark2/src/main/scala/org/apache/spark/sql/CarbonDictionaryDecoder.scala
+++ 
b/integration/spark2/src/main/scala/org/apache/spark/sql/CarbonDictionaryDecoder.scala
@@ -231,6 +231,17 @@ case class CarbonDictionaryDecoder(
            |  tuple.setValue(UTF8String.fromBytes((byte[])tuple.getValue()));
            |  return tuple;
            |}""".stripMargin)
+      val decodeBool = ctx.freshName("deDictBool")
+      ctx.addNewFunction(decodeStr,
+        s"""
+           |private org.apache.spark.sql.DictTuple $decodeBool(
+           |  org.apache.spark.sql.ForwardDictionaryWrapper dict, int surg)
+           | throws java.io.IOException {
+           |  org.apache.spark.sql.DictTuple tuple = $decodeDictionary(dict, 
surg);
+           |  tuple.setValue(Boolean.parseBoolean(new 
String((byte[])tuple.getValue(),
+           |  
org.apache.carbondata.core.constants.CarbonCommonConstants.DEFAULT_CHARSET_CLASS)));
+           |  return tuple;
+           |}""".stripMargin)
 
 
       val resultVars = exprs.zipWithIndex.map { case (expr, index) =>
@@ -271,6 +282,11 @@ case class CarbonDictionaryDecoder(
                     |org.apache.spark.sql.DictTuple $value = 
$decodeLong($dictRef, ${ ev.value });
                  """.stripMargin
                 ExprCode(code, s"$value.getIsNull()", 
s"((Long)$value.getValue())")
+              case CarbonDataTypes.BOOLEAN => code +=
+                s"""
+                   |org.apache.spark.sql.DictTuple $value = 
$decodeBool($dictRef, ${ ev.value });
+                 """.stripMargin
+                ExprCode(code, s"$value.getIsNull()", 
s"((Boolean)$value.getValue())")
               case _ => code +=
                 s"""
                    |org.apache.spark.sql.DictTuple $value = 
$decodeStr($dictRef, ${ev.value});
diff --git 
a/integration/spark2/src/test/scala/org/apache/carbondata/spark/testsuite/booleantype/BooleanDataTypesBaseTest.scala
 
b/integration/spark2/src/test/scala/org/apache/carbondata/spark/testsuite/booleantype/BooleanDataTypesBaseTest.scala
index c0087a8..82894d4 100644
--- 
a/integration/spark2/src/test/scala/org/apache/carbondata/spark/testsuite/booleantype/BooleanDataTypesBaseTest.scala
+++ 
b/integration/spark2/src/test/scala/org/apache/carbondata/spark/testsuite/booleantype/BooleanDataTypesBaseTest.scala
@@ -154,4 +154,21 @@ class BooleanDataTypesBaseTest extends QueryTest with 
BeforeAndAfterEach with Be
     sql("delete from carbon_table where cc=true")
     checkAnswer(sql("select COUNT(*) from carbon_table"), Row(0))
   }
+
+  test("test boolean as dictionary include column and codegen=false"){
+    sql("drop table if exists carbon_table")
+    sql("create table carbon_table(a1 boolean,a2 string,a3 int) stored by 
'carbondata' tblproperties('dictionary_include'='a1')")
+    sql("insert into carbon_table select false,'a',1")
+    sql("set spark.sql.codegen.wholestage=false")
+    checkAnswer(sql("select a1 from carbon_table"), Seq(Row(false)))
+    sql("set spark.sql.codegen.wholestage=true")
+    checkAnswer(sql("select a1 from carbon_table"), Seq(Row(false)))
+    sql("insert into carbon_table select true,'a',1")
+    sql("set spark.sql.codegen.wholestage=false")
+    checkAnswer(sql("select a1 from carbon_table"), Seq(Row(false), Row(true)))
+    sql("set spark.sql.codegen.wholestage=true")
+    checkAnswer(sql("select a1 from carbon_table"), Seq(Row(false), Row(true)))
+    sql("reset")
+    sql("drop table if exists carbon_table")
+  }
 }

Reply via email to