aboutsummaryrefslogtreecommitdiff
path: root/sql/catalyst/src/test/scala/org/apache/spark
diff options
context:
space:
mode:
authorReynold Xin <rxin@databricks.com>2017-04-12 01:30:00 -0700
committerReynold Xin <rxin@databricks.com>2017-04-12 01:30:00 -0700
commitffc57b0118b58de57520967d8e8730b11baad507 (patch)
tree5d97391e4280eabf11cc896ad720556bddbc4d46 /sql/catalyst/src/test/scala/org/apache/spark
parent044f7ecbfd75ac5a13bfc8cd01990e195c9bd178 (diff)
downloadspark-ffc57b0118b58de57520967d8e8730b11baad507.tar.gz
spark-ffc57b0118b58de57520967d8e8730b11baad507.tar.bz2
spark-ffc57b0118b58de57520967d8e8730b11baad507.zip
[SPARK-20302][SQL] Short circuit cast when from and to types are structurally the same
## What changes were proposed in this pull request? When we perform a cast expression and the from and to types are structurally the same (having the same structure but different field names), we should be able to skip the actual cast. ## How was this patch tested? Added unit tests for the newly introduced functions. Author: Reynold Xin <rxin@databricks.com> Closes #17614 from rxin/SPARK-20302.
Diffstat (limited to 'sql/catalyst/src/test/scala/org/apache/spark')
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala14
-rw-r--r--sql/catalyst/src/test/scala/org/apache/spark/sql/types/DataTypeSuite.scala31
2 files changed, 45 insertions, 0 deletions
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala
index 8eccadbdd8..a7ffa884d2 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/catalyst/expressions/CastSuite.scala
@@ -813,4 +813,18 @@ class CastSuite extends SparkFunSuite with ExpressionEvalHelper {
assert(cast(1.0.toFloat, DateType).checkInputDataTypes().isFailure)
assert(cast(1.0, DateType).checkInputDataTypes().isFailure)
}
+
+ test("SPARK-20302 cast with same structure") {
+ val from = new StructType()
+ .add("a", IntegerType)
+ .add("b", new StructType().add("b1", LongType))
+
+ val to = new StructType()
+ .add("a1", IntegerType)
+ .add("b1", new StructType().add("b11", LongType))
+
+ val input = Row(10, Row(12L))
+
+ checkEvaluation(cast(Literal.create(input, from), to), input)
+ }
}
diff --git a/sql/catalyst/src/test/scala/org/apache/spark/sql/types/DataTypeSuite.scala b/sql/catalyst/src/test/scala/org/apache/spark/sql/types/DataTypeSuite.scala
index f078ef0133..c4635c8f12 100644
--- a/sql/catalyst/src/test/scala/org/apache/spark/sql/types/DataTypeSuite.scala
+++ b/sql/catalyst/src/test/scala/org/apache/spark/sql/types/DataTypeSuite.scala
@@ -411,4 +411,35 @@ class DataTypeSuite extends SparkFunSuite {
checkCatalogString(ArrayType(createStruct(40)))
checkCatalogString(MapType(IntegerType, StringType))
checkCatalogString(MapType(IntegerType, createStruct(40)))
+
+ def checkEqualsStructurally(from: DataType, to: DataType, expected: Boolean): Unit = {
+ val testName = s"equalsStructurally: (from: $from, to: $to)"
+ test(testName) {
+ assert(DataType.equalsStructurally(from, to) === expected)
+ }
+ }
+
+ checkEqualsStructurally(BooleanType, BooleanType, true)
+ checkEqualsStructurally(IntegerType, IntegerType, true)
+ checkEqualsStructurally(IntegerType, LongType, false)
+ checkEqualsStructurally(ArrayType(IntegerType, true), ArrayType(IntegerType, true), true)
+ checkEqualsStructurally(ArrayType(IntegerType, true), ArrayType(IntegerType, false), false)
+
+ checkEqualsStructurally(
+ new StructType().add("f1", IntegerType),
+ new StructType().add("f2", IntegerType),
+ true)
+ checkEqualsStructurally(
+ new StructType().add("f1", IntegerType),
+ new StructType().add("f2", IntegerType, false),
+ false)
+
+ checkEqualsStructurally(
+ new StructType().add("f1", IntegerType).add("f", new StructType().add("f2", StringType)),
+ new StructType().add("f2", IntegerType).add("g", new StructType().add("f1", StringType)),
+ true)
+ checkEqualsStructurally(
+ new StructType().add("f1", IntegerType).add("f", new StructType().add("f2", StringType, false)),
+ new StructType().add("f2", IntegerType).add("g", new StructType().add("f1", StringType)),
+ false)
}