Skip to content

Commit 2f1ada3

Browse files
committed
fix partition where clause pushdown
1 parent bcfef46 commit 2f1ada3

File tree

2 files changed

+27
-5
lines changed

2 files changed

+27
-5
lines changed

sql/core/src/main/scala/org/apache/spark/sql/execution/datasources/jdbc/JDBCRDD.scala

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -312,7 +312,7 @@ private[sql] class JDBCRDD(
312312
*/
313313
private def getWhereClause(part: JDBCPartition): String = {
314314
if (part.whereClause != null && filterWhereClause.length > 0) {
315-
"WHERE " + filterWhereClause + " AND " + part.whereClause
315+
"WHERE " + s"($filterWhereClause)" + " AND " + s"(${part.whereClause})"
316316
} else if (part.whereClause != null) {
317317
"WHERE " + part.whereClause
318318
} else if (filterWhereClause.length > 0) {

sql/core/src/test/scala/org/apache/spark/sql/jdbc/JDBCSuite.scala

Lines changed: 26 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,10 +233,6 @@ class JDBCSuite extends SparkFunSuite
233233
assert(checkPushdown(sql("SELECT * FROM foobar WHERE NAME LIKE 'fr%'")).collect().size == 1)
234234
assert(checkPushdown(sql("SELECT * FROM foobar WHERE NAME LIKE '%ed'")).collect().size == 1)
235235
assert(checkPushdown(sql("SELECT * FROM foobar WHERE NAME LIKE '%re%'")).collect().size == 1)
236-
val orPrecedenceSql =
237-
"SELECT * FROM foobar WHERE (NAME = 'fred' OR THEID = 100) AND THEID < 1"
238-
assert(checkPushdown(sql(orPrecedenceSql)).collect().size == 0)
239-
240236
assert(checkPushdown(sql("SELECT * FROM nulltypes WHERE A IS NULL")).collect().size == 1)
241237
assert(checkPushdown(sql("SELECT * FROM nulltypes WHERE A IS NOT NULL")).collect().size == 0)
242238

@@ -665,4 +661,30 @@ class JDBCSuite extends SparkFunSuite
665661
assert(oracleDialect.getJDBCType(StringType).
666662
map(_.databaseTypeDefinition).get == "VARCHAR2(255)")
667663
}
664+
665+
private def assertEmptyQuery(sqlString: String): Unit = {
666+
assert(sql(sqlString).collect().isEmpty)
667+
}
668+
669+
test("SPARK-15916: JDBC filter operator push down should respect operator precedence") {
670+
val TRUE = "NAME != 'non_exists'"
671+
val FALSE1 = "THEID > 1000000000"
672+
val FALSE2 = "THEID < -1000000000"
673+
674+
assertEmptyQuery(s"SELECT * FROM foobar WHERE ($TRUE OR $FALSE1) AND $FALSE2")
675+
assertEmptyQuery(s"SELECT * FROM foobar WHERE $FALSE1 AND ($FALSE2 OR $TRUE)")
676+
677+
// Tests JDBCPartition whereClause clause push down.
678+
withTempTable("tempFrame") {
679+
val jdbcPartitionWhereClause = s"$FALSE1 OR $TRUE"
680+
val df = spark.read.jdbc(
681+
urlWithUserAndPass,
682+
"TEST.PEOPLE",
683+
predicates = Array[String](jdbcPartitionWhereClause),
684+
new Properties)
685+
686+
df.createOrReplaceTempView("tempFrame")
687+
assertEmptyQuery(s"SELECT * FROM tempFrame where $FALSE2")
688+
}
689+
}
668690
}

0 commit comments

Comments
 (0)