Skip to content
Snippets Groups Projects
Commit 1f5ddf17 authored by Daoyuan Wang's avatar Daoyuan Wang Committed by Michael Armbrust
Browse files

[SPARK-4670] [SQL] wrong symbol for bitwise not

We should use `~` instead of `-` for bitwise NOT.

Author: Daoyuan Wang <daoyuan.wang@intel.com>

Closes #3528 from adrian-wang/symbol and squashes the following commits:

affd4ad [Daoyuan Wang] fix code gen test case
56efb79 [Daoyuan Wang] ensure bitwise NOT over byte and short persist data type
f55fbae [Daoyuan Wang] wrong symbol for bitwise not
parent f6df609d
No related branches found
No related tags found
No related merge requests found
...@@ -42,7 +42,7 @@ case class Sqrt(child: Expression) extends UnaryExpression { ...@@ -42,7 +42,7 @@ case class Sqrt(child: Expression) extends UnaryExpression {
override def toString = s"SQRT($child)" override def toString = s"SQRT($child)"
override def eval(input: Row): Any = { override def eval(input: Row): Any = {
n1(child, input, ((na,a) => math.sqrt(na.toDouble(a)))) n1(child, input, (na,a) => math.sqrt(na.toDouble(a)))
} }
} }
...@@ -138,7 +138,7 @@ case class BitwiseAnd(left: Expression, right: Expression) extends BinaryArithme ...@@ -138,7 +138,7 @@ case class BitwiseAnd(left: Expression, right: Expression) extends BinaryArithme
case ShortType => (evalE1.asInstanceOf[Short] & evalE2.asInstanceOf[Short]).toShort case ShortType => (evalE1.asInstanceOf[Short] & evalE2.asInstanceOf[Short]).toShort
case IntegerType => evalE1.asInstanceOf[Int] & evalE2.asInstanceOf[Int] case IntegerType => evalE1.asInstanceOf[Int] & evalE2.asInstanceOf[Int]
case LongType => evalE1.asInstanceOf[Long] & evalE2.asInstanceOf[Long] case LongType => evalE1.asInstanceOf[Long] & evalE2.asInstanceOf[Long]
case other => sys.error(s"Unsupported bitwise & operation on ${other}") case other => sys.error(s"Unsupported bitwise & operation on $other")
} }
} }
...@@ -153,7 +153,7 @@ case class BitwiseOr(left: Expression, right: Expression) extends BinaryArithmet ...@@ -153,7 +153,7 @@ case class BitwiseOr(left: Expression, right: Expression) extends BinaryArithmet
case ShortType => (evalE1.asInstanceOf[Short] | evalE2.asInstanceOf[Short]).toShort case ShortType => (evalE1.asInstanceOf[Short] | evalE2.asInstanceOf[Short]).toShort
case IntegerType => evalE1.asInstanceOf[Int] | evalE2.asInstanceOf[Int] case IntegerType => evalE1.asInstanceOf[Int] | evalE2.asInstanceOf[Int]
case LongType => evalE1.asInstanceOf[Long] | evalE2.asInstanceOf[Long] case LongType => evalE1.asInstanceOf[Long] | evalE2.asInstanceOf[Long]
case other => sys.error(s"Unsupported bitwise | operation on ${other}") case other => sys.error(s"Unsupported bitwise | operation on $other")
} }
} }
...@@ -168,7 +168,7 @@ case class BitwiseXor(left: Expression, right: Expression) extends BinaryArithme ...@@ -168,7 +168,7 @@ case class BitwiseXor(left: Expression, right: Expression) extends BinaryArithme
case ShortType => (evalE1.asInstanceOf[Short] ^ evalE2.asInstanceOf[Short]).toShort case ShortType => (evalE1.asInstanceOf[Short] ^ evalE2.asInstanceOf[Short]).toShort
case IntegerType => evalE1.asInstanceOf[Int] ^ evalE2.asInstanceOf[Int] case IntegerType => evalE1.asInstanceOf[Int] ^ evalE2.asInstanceOf[Int]
case LongType => evalE1.asInstanceOf[Long] ^ evalE2.asInstanceOf[Long] case LongType => evalE1.asInstanceOf[Long] ^ evalE2.asInstanceOf[Long]
case other => sys.error(s"Unsupported bitwise ^ operation on ${other}") case other => sys.error(s"Unsupported bitwise ^ operation on $other")
} }
} }
...@@ -181,7 +181,7 @@ case class BitwiseNot(child: Expression) extends UnaryExpression { ...@@ -181,7 +181,7 @@ case class BitwiseNot(child: Expression) extends UnaryExpression {
def dataType = child.dataType def dataType = child.dataType
override def foldable = child.foldable override def foldable = child.foldable
def nullable = child.nullable def nullable = child.nullable
override def toString = s"-$child" override def toString = s"~$child"
override def eval(input: Row): Any = { override def eval(input: Row): Any = {
val evalE = child.eval(input) val evalE = child.eval(input)
...@@ -189,11 +189,11 @@ case class BitwiseNot(child: Expression) extends UnaryExpression { ...@@ -189,11 +189,11 @@ case class BitwiseNot(child: Expression) extends UnaryExpression {
null null
} else { } else {
dataType match { dataType match {
case ByteType => (~(evalE.asInstanceOf[Byte])).toByte case ByteType => (~evalE.asInstanceOf[Byte]).toByte
case ShortType => (~(evalE.asInstanceOf[Short])).toShort case ShortType => (~evalE.asInstanceOf[Short]).toShort
case IntegerType => ~(evalE.asInstanceOf[Int]) case IntegerType => ~evalE.asInstanceOf[Int]
case LongType => ~(evalE.asInstanceOf[Long]) case LongType => ~evalE.asInstanceOf[Long]
case other => sys.error(s"Unsupported bitwise ~ operation on ${other}") case other => sys.error(s"Unsupported bitwise ~ operation on $other")
} }
} }
} }
......
...@@ -42,6 +42,21 @@ class ExpressionEvaluationSuite extends FunSuite { ...@@ -42,6 +42,21 @@ class ExpressionEvaluationSuite extends FunSuite {
checkEvaluation(Literal(1) + Literal(1), 2) checkEvaluation(Literal(1) + Literal(1), 2)
} }
test("unary BitwiseNOT") {
checkEvaluation(BitwiseNot(1), -2)
assert(BitwiseNot(1).dataType === IntegerType)
assert(BitwiseNot(1).eval(EmptyRow).isInstanceOf[Int])
checkEvaluation(BitwiseNot(1.toLong), -2.toLong)
assert(BitwiseNot(1.toLong).dataType === LongType)
assert(BitwiseNot(1.toLong).eval(EmptyRow).isInstanceOf[Long])
checkEvaluation(BitwiseNot(1.toShort), -2.toShort)
assert(BitwiseNot(1.toShort).dataType === ShortType)
assert(BitwiseNot(1.toShort).eval(EmptyRow).isInstanceOf[Short])
checkEvaluation(BitwiseNot(1.toByte), -2.toByte)
assert(BitwiseNot(1.toByte).dataType === ByteType)
assert(BitwiseNot(1.toByte).eval(EmptyRow).isInstanceOf[Byte])
}
/** /**
* Checks for three-valued-logic. Based on: * Checks for three-valued-logic. Based on:
* http://en.wikipedia.org/wiki/Null_(SQL)#Comparisons_with_NULL_and_the_three-valued_logic_.283VL.29 * http://en.wikipedia.org/wiki/Null_(SQL)#Comparisons_with_NULL_and_the_three-valued_logic_.283VL.29
......
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