aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
author云峤 <chensong.cs@alibaba-inc.com>2015-04-16 17:32:42 -0700
committerMichael Armbrust <michael@databricks.com>2015-04-16 17:32:42 -0700
commit5fe43433529346788e8c343d338a5b7dc169cf58 (patch)
treee3901f40ddad761b807188229121a08e4307c6ee
parent04e44b37cc04f62fbf9e08c7076349e0a4d12ea8 (diff)
downloadspark-5fe43433529346788e8c343d338a5b7dc169cf58.tar.gz
spark-5fe43433529346788e8c343d338a5b7dc169cf58.tar.bz2
spark-5fe43433529346788e8c343d338a5b7dc169cf58.zip
SPARK-6927 [SQL] Sorting Error when codegen on
Fix this error by adding BinaryType comparor in GenerateOrdering. JIRA https://issues.apache.org/jira/browse/SPARK-6927 Author: 云峤 <chensong.cs@alibaba-inc.com> Closes #5524 from kaka1992/fix-codegen-sort and squashes the following commits: d7e2afe [云峤] fix codegen sorting error
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/GenerateOrdering.scala14
-rw-r--r--sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala20
2 files changed, 33 insertions, 1 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/GenerateOrdering.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/GenerateOrdering.scala
index 0db29eb404..fc2a2b6070 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/GenerateOrdering.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/codegen/GenerateOrdering.scala
@@ -19,7 +19,7 @@ package org.apache.spark.sql.catalyst.expressions.codegen
import org.apache.spark.Logging
import org.apache.spark.sql.catalyst.expressions._
-import org.apache.spark.sql.types.{StringType, NumericType}
+import org.apache.spark.sql.types.{BinaryType, StringType, NumericType}
/**
* Generates bytecode for an [[Ordering]] of [[Row Rows]] for a given set of
@@ -43,6 +43,18 @@ object GenerateOrdering extends CodeGenerator[Seq[SortOrder], Ordering[Row]] wit
val evalB = expressionEvaluator(order.child)
val compare = order.child.dataType match {
+ case BinaryType =>
+ q"""
+ val x = ${if (order.direction == Ascending) evalA.primitiveTerm else evalB.primitiveTerm}
+ val y = ${if (order.direction != Ascending) evalB.primitiveTerm else evalA.primitiveTerm}
+ var i = 0
+ while (i < x.length && i < y.length) {
+ val res = x(i).compareTo(y(i))
+ if (res != 0) return res
+ i = i+1
+ }
+ return x.length - y.length
+ """
case _: NumericType =>
q"""
val comp = ${evalA.primitiveTerm} - ${evalB.primitiveTerm}
diff --git a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
index d739e550f3..9e02e69fda 100644
--- a/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
+++ b/sql/core/src/test/scala/org/apache/spark/sql/SQLQuerySuite.scala
@@ -398,6 +398,26 @@ class SQLQuerySuite extends QueryTest with BeforeAndAfterAll {
setConf(SQLConf.EXTERNAL_SORT, before.toString)
}
+ test("SPARK-6927 sorting with codegen on") {
+ val externalbefore = conf.externalSortEnabled
+ val codegenbefore = conf.codegenEnabled
+ setConf(SQLConf.EXTERNAL_SORT, "false")
+ setConf(SQLConf.CODEGEN_ENABLED, "true")
+ sortTest()
+ setConf(SQLConf.EXTERNAL_SORT, externalbefore.toString)
+ setConf(SQLConf.CODEGEN_ENABLED, codegenbefore.toString)
+ }
+
+ test("SPARK-6927 external sorting with codegen on") {
+ val externalbefore = conf.externalSortEnabled
+ val codegenbefore = conf.codegenEnabled
+ setConf(SQLConf.CODEGEN_ENABLED, "true")
+ setConf(SQLConf.EXTERNAL_SORT, "true")
+ sortTest()
+ setConf(SQLConf.EXTERNAL_SORT, externalbefore.toString)
+ setConf(SQLConf.CODEGEN_ENABLED, codegenbefore.toString)
+ }
+
test("limit") {
checkAnswer(
sql("SELECT * FROM testData LIMIT 10"),