@@ -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