Skip to content
Snippets Groups Projects
Commit 5fe43433 authored by 云峤's avatar 云峤 Committed by Michael Armbrust
Browse files

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
parent 04e44b37
No related branches found
No related tags found
No related merge requests found
......@@ -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}
......
......@@ -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"),
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment