aboutsummaryrefslogtreecommitdiff
path: root/sql
diff options
context:
space:
mode:
authorTarek Auel <tarek.auel@googlemail.com>2015-08-20 15:10:13 -0700
committerDavies Liu <davies.liu@gmail.com>2015-08-20 15:10:13 -0700
commitafe9f03fd964d1e8604d02feee8d6970efbe6009 (patch)
tree1dbefa8e6951dec6a5977937b6e770355a37a28b /sql
parenteaafe139f881d6105996373c9b11f2ccd91b5b3e (diff)
downloadspark-afe9f03fd964d1e8604d02feee8d6970efbe6009.tar.gz
spark-afe9f03fd964d1e8604d02feee8d6970efbe6009.tar.bz2
spark-afe9f03fd964d1e8604d02feee8d6970efbe6009.zip
[SPARK-9400] [SQL] codegen for StringLocate
This is based on #7779 , thanks to tarekauel . Fix the conflict and nullability. Closes #7779 and #8274 . Author: Tarek Auel <tarek.auel@googlemail.com> Author: Davies Liu <davies@databricks.com> Closes #8330 from davies/stringLocate.
Diffstat (limited to 'sql')
-rw-r--r--sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala28
1 files changed, 27 insertions, 1 deletions
diff --git a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
index 3c23f2ecfb..b60d318534 100644
--- a/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
+++ b/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/expressions/stringExpressions.scala
@@ -409,13 +409,14 @@ case class SubstringIndex(strExpr: Expression, delimExpr: Expression, countExpr:
* in given string after position pos.
*/
case class StringLocate(substr: Expression, str: Expression, start: Expression)
- extends TernaryExpression with ImplicitCastInputTypes with CodegenFallback {
+ extends TernaryExpression with ImplicitCastInputTypes {
def this(substr: Expression, str: Expression) = {
this(substr, str, Literal(0))
}
override def children: Seq[Expression] = substr :: str :: start :: Nil
+ override def nullable: Boolean = substr.nullable || str.nullable
override def dataType: DataType = IntegerType
override def inputTypes: Seq[DataType] = Seq(StringType, StringType, IntegerType)
@@ -441,6 +442,31 @@ case class StringLocate(substr: Expression, str: Expression, start: Expression)
}
}
+ override protected def genCode(ctx: CodeGenContext, ev: GeneratedExpressionCode): String = {
+ val substrGen = substr.gen(ctx)
+ val strGen = str.gen(ctx)
+ val startGen = start.gen(ctx)
+ s"""
+ int ${ev.primitive} = 0;
+ boolean ${ev.isNull} = false;
+ ${startGen.code}
+ if (!${startGen.isNull}) {
+ ${substrGen.code}
+ if (!${substrGen.isNull}) {
+ ${strGen.code}
+ if (!${strGen.isNull}) {
+ ${ev.primitive} = ${strGen.primitive}.indexOf(${substrGen.primitive},
+ ${startGen.primitive}) + 1;
+ } else {
+ ${ev.isNull} = true;
+ }
+ } else {
+ ${ev.isNull} = true;
+ }
+ }
+ """
+ }
+
override def prettyName: String = "locate"
}