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")
+ }
}