You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@carbondata.apache.org by ra...@apache.org on 2019/07/13 03:05:13 UTC
[carbondata] branch master updated: [CARBONDATA-3457][MV] Fix
Column not found issue with Query having Cast Expression
This is an automated email from the ASF dual-hosted git repository.
ravipesala 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 771d436 [CARBONDATA-3457][MV] Fix Column not found issue with Query having Cast Expression
771d436 is described below
commit 771d436fe2ed2d34ccf0ee1d8f555af30c382345
Author: Indhumathi27 <in...@gmail.com>
AuthorDate: Thu Jun 27 17:09:20 2019 +0530
[CARBONDATA-3457][MV] Fix Column not found issue with Query having Cast Expression
Problem:
For Cast(exp), alias reference is not included, hence throws column not found exception for column given inside cast expression.
Solution:
AliasMap has to be created for CAST[EXP] also and should be replaced with subsmer alias map references.
This closes #3312
---
.../carbondata/mv/rewrite/DefaultMatchMaker.scala | 16 ++++++
.../carbondata/mv/rewrite/MVCreateTestCase.scala | 58 ++++++++++++++++++++++
2 files changed, 74 insertions(+)
diff --git a/datamap/mv/core/src/main/scala/org/apache/carbondata/mv/rewrite/DefaultMatchMaker.scala b/datamap/mv/core/src/main/scala/org/apache/carbondata/mv/rewrite/DefaultMatchMaker.scala
index 9a9a2a6..5329608 100644
--- a/datamap/mv/core/src/main/scala/org/apache/carbondata/mv/rewrite/DefaultMatchMaker.scala
+++ b/datamap/mv/core/src/main/scala/org/apache/carbondata/mv/rewrite/DefaultMatchMaker.scala
@@ -53,6 +53,14 @@ abstract class DefaultMatchPattern extends MatchPattern[ModularPlan] {
(a.child.asInstanceOf[Attribute], a.toAttribute)
})
+ // Create aliasMap with Expression to alias reference attribute
+ val aliasMapExp =
+ subsumer.outputList.collect {
+ case a: Alias if a.child.isInstanceOf[Expression] &&
+ !a.child.isInstanceOf[AggregateExpression] =>
+ a.child -> a.toAttribute
+ }.toMap
+
// Check and replace all alias references with subsumer alias map references.
val compensation1 = compensation.transform {
case plan if !plan.skip && plan != subsumer =>
@@ -66,6 +74,14 @@ abstract class DefaultMatchPattern extends MatchPattern[ModularPlan] {
exprId = ref.exprId,
qualifier = a.qualifier)
}.getOrElse(a)
+ case a: Expression =>
+ aliasMapExp
+ .get(a)
+ .map { ref =>
+ AttributeReference(
+ ref.name, ref.dataType)(
+ exprId = ref.exprId)
+ }.getOrElse(a)
}
}
diff --git a/datamap/mv/core/src/test/scala/org/apache/carbondata/mv/rewrite/MVCreateTestCase.scala b/datamap/mv/core/src/test/scala/org/apache/carbondata/mv/rewrite/MVCreateTestCase.scala
index 1d259c8..ca6c0c5 100644
--- a/datamap/mv/core/src/test/scala/org/apache/carbondata/mv/rewrite/MVCreateTestCase.scala
+++ b/datamap/mv/core/src/test/scala/org/apache/carbondata/mv/rewrite/MVCreateTestCase.scala
@@ -1169,6 +1169,64 @@ class MVCreateTestCase extends QueryTest with BeforeAndAfterAll {
assert(TestUtil.verifyMVDataMap(analyzed1, "da_cast"))
}
+ test("test cast of expression with mv") {
+ sql("drop table IF EXISTS maintable")
+ sql("create table maintable (m_month bigint, c_code string, " +
+ "c_country smallint, d_dollar_value double, q_quantity double, u_unit smallint, b_country smallint, i_id int, y_year smallint) stored by 'carbondata'")
+ sql("insert into maintable select 10, 'xxx', 123, 456, 45, 5, 23, 1, 2000")
+ sql("drop datamap if exists da_cast")
+ sql(
+ "create datamap da_cast using 'mv' as select cast(floor((m_month +1000) / 900) * 900 - 2000 AS INT) as a, c_code as abc from maintable")
+ val df1 = sql(
+ " select cast(floor((m_month +1000) / 900) * 900 - 2000 AS INT) as a ,c_code as abc from maintable")
+ val df2 = sql(
+ " select cast(floor((m_month +1000) / 900) * 900 - 2000 AS INT),c_code as abc from maintable")
+ val analyzed1 = df1.queryExecution.analyzed
+ assert(TestUtil.verifyMVDataMap(analyzed1, "da_cast"))
+ }
+
+ test("test cast with & without alias") {
+ sql("drop table IF EXISTS maintable")
+ sql("create table maintable (m_month bigint, c_code string, " +
+ "c_country smallint, d_dollar_value double, q_quantity double, u_unit smallint, b_country smallint, i_id int, y_year smallint) stored by 'carbondata'")
+ sql("insert into maintable select 10, 'xxx', 123, 456, 45, 5, 23, 1, 2000")
+ sql("drop datamap if exists da_cast")
+ sql(
+ "create datamap da_cast using 'mv' as select cast(m_month + 1000 AS INT) as a, c_code as abc from maintable")
+ checkAnswer(sql("select cast(m_month + 1000 AS INT) as a, c_code as abc from maintable"), Seq(Row(1010, "xxx")))
+ var df1 = sql("select cast(m_month + 1000 AS INT) as a, c_code as abc from maintable")
+ var analyzed1 = df1.queryExecution.analyzed
+ assert(TestUtil.verifyMVDataMap(analyzed1, "da_cast"))
+ sql("drop datamap if exists da_cast")
+ sql(
+ "create datamap da_cast using 'mv' as select cast(m_month + 1000 AS INT), c_code from maintable")
+ df1 = sql("select cast(m_month + 1000 AS INT), c_code from maintable")
+ analyzed1 = df1.queryExecution.analyzed
+ assert(TestUtil.verifyMVDataMap(analyzed1, "da_cast"))
+ checkAnswer(sql("select cast(m_month + 1000 AS INT), c_code from maintable"), Seq(Row(1010, "xxx")))
+ }
+
+ test("test mv with floor & ceil exp") {
+ sql("drop table IF EXISTS maintable")
+ sql("create table maintable (m_month bigint, c_code string, " +
+ "c_country smallint, d_dollar_value double, q_quantity double, u_unit smallint, b_country smallint, i_id int, y_year smallint) stored by 'carbondata'")
+ sql("insert into maintable select 10, 'xxx', 123, 456, 45, 5, 23, 1, 2000")
+ sql("drop datamap if exists da_floor")
+ sql(
+ "create datamap da_floor using 'mv' as select floor(m_month) as a, c_code as abc from maintable")
+ checkAnswer(sql("select floor(m_month) as a, c_code as abc from maintable"), Seq(Row(10, "xxx")))
+ var df1 = sql("select floor(m_month) as a, c_code as abc from maintable")
+ var analyzed1 = df1.queryExecution.analyzed
+ assert(TestUtil.verifyMVDataMap(analyzed1, "da_floor"))
+ sql("drop datamap if exists da_ceil")
+ sql(
+ "create datamap da_ceil using 'mv' as select ceil(m_month) as a, c_code as abc from maintable")
+ checkAnswer(sql("select ceil(m_month) as a, c_code as abc from maintable"), Seq(Row(10, "xxx")))
+ var df2 = sql("select ceil(m_month) as a, c_code as abc from maintable")
+ var analyzed2 = df2.queryExecution.analyzed
+ assert(TestUtil.verifyMVDataMap(analyzed2, "da_ceil"))
+ }
+
def drop(): Unit = {
sql("drop table IF EXISTS fact_table1")
sql("drop table IF EXISTS fact_table2")