This is an automated email from the ASF dual-hosted git repository.
jackylk 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 6833af6 [CARBONDATA-3732] Fix ClassCastException with rand() udf
function
6833af6 is described below
commit 6833af68834edb6f6463be14cb9c531ffb57b79a
Author: Indhumathi27 <[email protected]>
AuthorDate: Mon Mar 2 12:32:44 2020 +0530
[CARBONDATA-3732] Fix ClassCastException with rand() udf function
Why is this PR needed?
ClassCastException is thrown, while running queries with cast of rand()
function. This is because, while making a deterministic expression, we are
converting an alias of CustomDeterministic expression to CustomDeterministic
expression again, which is not needed.
What changes were proposed in this PR?
Do not convert an Alias of CustomDeterministic expression to
CustomDeterministic expression again
Does this PR introduce any user interface change?
No
Is any new testcase added?
Yes
This closes #3648
---
.../execution/strategy/CarbonLateDecodeStrategy.scala | 16 ++++++++++++++--
.../spark/testsuite/detailquery/CastColumnTestCase.scala | 15 +++++++++++----
2 files changed, 25 insertions(+), 6 deletions(-)
diff --git
a/integration/spark/src/main/scala/org/apache/spark/sql/execution/strategy/CarbonLateDecodeStrategy.scala
b/integration/spark/src/main/scala/org/apache/spark/sql/execution/strategy/CarbonLateDecodeStrategy.scala
index 4080ce9..ae7ab11 100644
---
a/integration/spark/src/main/scala/org/apache/spark/sql/execution/strategy/CarbonLateDecodeStrategy.scala
+++
b/integration/spark/src/main/scala/org/apache/spark/sql/execution/strategy/CarbonLateDecodeStrategy.scala
@@ -201,6 +201,18 @@ private[sql] class CarbonLateDecodeStrategy extends
SparkStrategy {
}
/**
+ * get deterministic expression for NamedExpression
+ */
+ private def makeDeterministicExp(exp: NamedExpression): Expression = {
+ exp match {
+ case alias: Alias if
alias.child.isInstanceOf[CustomDeterministicExpression] =>
+ alias
+ case _ =>
+ CustomDeterministicExpression(exp)
+ }
+ }
+
+ /**
* Convert all Expression to deterministic Expression
*/
private def makeDeterministic(plan: LogicalPlan): LogicalPlan = {
@@ -220,7 +232,7 @@ private[sql] class CarbonLateDecodeStrategy extends
SparkStrategy {
Some(a))
case exp: NamedExpression
if !exp.deterministic &&
!exp.isInstanceOf[CustomDeterministicExpression] =>
- CustomDeterministicExpression(exp)
+ makeDeterministicExp(exp)
}
} else {
p
@@ -239,7 +251,7 @@ private[sql] class CarbonLateDecodeStrategy extends
SparkStrategy {
Some(a))
case exp: NamedExpression
if !exp.deterministic &&
!exp.isInstanceOf[CustomDeterministicExpression] =>
- CustomDeterministicExpression(exp)
+ makeDeterministicExp(exp)
}
} else {
f
diff --git
a/integration/spark/src/test/scala/org/apache/carbondata/spark/testsuite/detailquery/CastColumnTestCase.scala
b/integration/spark/src/test/scala/org/apache/carbondata/spark/testsuite/detailquery/CastColumnTestCase.scala
index 22df0ff..8e076d7 100644
---
a/integration/spark/src/test/scala/org/apache/carbondata/spark/testsuite/detailquery/CastColumnTestCase.scala
+++
b/integration/spark/src/test/scala/org/apache/carbondata/spark/testsuite/detailquery/CastColumnTestCase.scala
@@ -953,10 +953,16 @@ class CastColumnTestCase extends QueryTest with
BeforeAndAfterAll {
)
}
- // Direct Dictionary and Timestamp Column.
-
-
-
+ test("test cast with rand UDF") {
+ sql("drop table if exists cast_rand")
+ sql("create table cast_rand(name string,gender string,age int) stored as
carbondata")
+ sql("insert into cast_rand values('xxx','male',10)")
+ sql("select * from (select name, rand() from cast_rand) where
name='xxx'").collect()
+ sql("select * from (select name, cast(floor(rand() * 5) as int) as `yyy`
from cast_rand) where yyy<1").collect()
+ sql("select * from (select name, cast((rand() * 5) as int) as `yyy` from
cast_rand) where yyy<1").collect()
+ sql("select * from (select name, floor(rand() * 5) from cast_rand) where
name='xxx'").collect()
+ sql("drop table if exists cast_rand")
+ }
override def afterAll {
CarbonProperties.getInstance()
@@ -966,5 +972,6 @@ class CastColumnTestCase extends QueryTest with
BeforeAndAfterAll {
sql("drop table if exists DICTIONARY_HIVE_1")
sql("drop table if exists NO_DICTIONARY_CARBON_2")
sql("drop table if exists NO_DICTIONARY_HIVE_2")
+ sql("drop table if exists cast_rand")
}
}
\ No newline at end of file