Skip to content

Commit 04d908f

Browse files
committed
[SPARK-8420][SQL] Fix comparision of timestamps/dates with strings
1 parent 9b20027 commit 04d908f

File tree

2 files changed

+62
-3
lines changed

2 files changed

+62
-3
lines changed

sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/analysis/HiveTypeCoercion.scala

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -277,15 +277,18 @@ trait HiveTypeCoercion {
277277
case a @ BinaryArithmetic(left, right @ StringType()) =>
278278
a.makeCopy(Array(left, Cast(right, DoubleType)))
279279

280-
// we should cast all timestamp/date/string compare into string compare
280+
// We should cast all timestamp/date/string compare into string comparisions
281+
// This behaves as a user would expect because timestamp strings sort lexicographically.
281282
case p @ BinaryComparison(left @ StringType(), right @ DateType()) =>
282283
p.makeCopy(Array(left, Cast(right, StringType)))
283284
case p @ BinaryComparison(left @ DateType(), right @ StringType()) =>
284285
p.makeCopy(Array(Cast(left, StringType), right))
285286
case p @ BinaryComparison(left @ StringType(), right @ TimestampType()) =>
286-
p.makeCopy(Array(Cast(left, TimestampType), right))
287+
p.makeCopy(Array(left, Cast(right, StringType)))
287288
case p @ BinaryComparison(left @ TimestampType(), right @ StringType()) =>
288-
p.makeCopy(Array(left, Cast(right, TimestampType)))
289+
p.makeCopy(Array(Cast(left, StringType), right))
290+
291+
// Comparisons between dates and timestamps.
289292
case p @ BinaryComparison(left @ TimestampType(), right @ DateType()) =>
290293
p.makeCopy(Array(Cast(left, StringType), Cast(right, StringType)))
291294
case p @ BinaryComparison(left @ DateType(), right @ TimestampType()) =>
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Licensed to the Apache Software Foundation (ASF) under one or more
3+
* contributor license agreements. See the NOTICE file distributed with
4+
* this work for additional information regarding copyright ownership.
5+
* The ASF licenses this file to You under the Apache License, Version 2.0
6+
* (the "License"); you may not use this file except in compliance with
7+
* the License. You may obtain a copy of the License at
8+
*
9+
* http://www.apache.org/licenses/LICENSE-2.0
10+
*
11+
* Unless required by applicable law or agreed to in writing, software
12+
* distributed under the License is distributed on an "AS IS" BASIS,
13+
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14+
* See the License for the specific language governing permissions and
15+
* limitations under the License.
16+
*/
17+
18+
package org.apache.spark.sql
19+
20+
import java.sql.{Date, Timestamp}
21+
22+
class DataFrameDateTimeSuite extends QueryTest {
23+
24+
private lazy val ctx = org.apache.spark.sql.test.TestSQLContext
25+
import ctx.implicits._
26+
27+
test("timestamp comparison with date strings") {
28+
val df = Seq(
29+
(1, Timestamp.valueOf("2015-01-01 00:00:00")),
30+
(2, Timestamp.valueOf("2014-01-01 00:00:00"))).toDF("i", "t")
31+
32+
checkAnswer(
33+
df.select("t").filter($"t" <= "2014-06-01"),
34+
Row(Timestamp.valueOf("2014-01-01 00:00:00")) :: Nil)
35+
36+
37+
checkAnswer(
38+
df.select("t").filter($"t" >= "2014-06-01"),
39+
Row(Timestamp.valueOf("2015-01-01 00:00:00")) :: Nil)
40+
}
41+
42+
test("date comparison with date strings") {
43+
val df = Seq(
44+
(1, Date.valueOf("2015-01-01")),
45+
(2, Date.valueOf("2014-01-01"))).toDF("i", "t")
46+
47+
checkAnswer(
48+
df.select("t").filter($"t" <= "2014-06-01"),
49+
Row(Date.valueOf("2014-01-01")) :: Nil)
50+
51+
52+
checkAnswer(
53+
df.select("t").filter($"t" >= "2014-06-01"),
54+
Row(Date.valueOf("2015-01-01")) :: Nil)
55+
}
56+
}

0 commit comments

Comments
 (0)