@@ -19,8 +19,9 @@ package org.apache.spark.sql.sources
1919
2020import org .apache .spark .annotation .{Evolving , Stable }
2121import org .apache .spark .sql .catalyst .expressions .Literal
22+ import org .apache .spark .sql .catalyst .parser .ParseException
2223import org .apache .spark .sql .connector .catalog .CatalogV2Implicits .parseColumnPath
23- import org .apache .spark .sql .connector .expressions .{FieldReference , LiteralValue }
24+ import org .apache .spark .sql .connector .expressions .{FieldReference , LiteralValue , NamedReference }
2425import org .apache .spark .sql .connector .expressions .filter .{AlwaysFalse => V2AlwaysFalse , AlwaysTrue => V2AlwaysTrue , And => V2And , Not => V2Not , Or => V2Or , Predicate }
2526import org .apache .spark .sql .types .StringType
2627import org .apache .spark .unsafe .types .UTF8String
@@ -74,6 +75,15 @@ sealed abstract class Filter {
7475 * Converts V1 filter to V2 filter
7576 */
7677 private [sql] def toV2 : Predicate
78+
79+ protected def toV2Column (attribute : String ): NamedReference = {
80+ try {
81+ FieldReference (attribute)
82+ } catch {
83+ case _ : ParseException =>
84+ FieldReference .column(attribute)
85+ }
86+ }
7787}
7888
7989/**
@@ -91,7 +101,7 @@ case class EqualTo(attribute: String, value: Any) extends Filter {
91101 override def toV2 : Predicate = {
92102 val literal = Literal (value)
93103 new Predicate (" =" ,
94- Array (FieldReference (attribute), LiteralValue (literal.value, literal.dataType)))
104+ Array (toV2Column (attribute), LiteralValue (literal.value, literal.dataType)))
95105 }
96106}
97107
@@ -111,7 +121,7 @@ case class EqualNullSafe(attribute: String, value: Any) extends Filter {
111121 override def toV2 : Predicate = {
112122 val literal = Literal (value)
113123 new Predicate (" <=>" ,
114- Array (FieldReference (attribute), LiteralValue (literal.value, literal.dataType)))
124+ Array (toV2Column (attribute), LiteralValue (literal.value, literal.dataType)))
115125 }
116126}
117127
@@ -130,7 +140,7 @@ case class GreaterThan(attribute: String, value: Any) extends Filter {
130140 override def toV2 : Predicate = {
131141 val literal = Literal (value)
132142 new Predicate (" >" ,
133- Array (FieldReference (attribute), LiteralValue (literal.value, literal.dataType)))
143+ Array (toV2Column (attribute), LiteralValue (literal.value, literal.dataType)))
134144 }
135145}
136146
@@ -149,7 +159,7 @@ case class GreaterThanOrEqual(attribute: String, value: Any) extends Filter {
149159 override def toV2 : Predicate = {
150160 val literal = Literal (value)
151161 new Predicate (" >=" ,
152- Array (FieldReference (attribute), LiteralValue (literal.value, literal.dataType)))
162+ Array (toV2Column (attribute), LiteralValue (literal.value, literal.dataType)))
153163 }
154164}
155165
@@ -168,7 +178,7 @@ case class LessThan(attribute: String, value: Any) extends Filter {
168178 override def toV2 : Predicate = {
169179 val literal = Literal (value)
170180 new Predicate (" <" ,
171- Array (FieldReference (attribute), LiteralValue (literal.value, literal.dataType)))
181+ Array (toV2Column (attribute), LiteralValue (literal.value, literal.dataType)))
172182 }
173183}
174184
@@ -187,7 +197,7 @@ case class LessThanOrEqual(attribute: String, value: Any) extends Filter {
187197 override def toV2 : Predicate = {
188198 val literal = Literal (value)
189199 new Predicate (" <=" ,
190- Array (FieldReference (attribute), LiteralValue (literal.value, literal.dataType)))
200+ Array (toV2Column (attribute), LiteralValue (literal.value, literal.dataType)))
191201 }
192202}
193203
@@ -230,7 +240,7 @@ case class In(attribute: String, values: Array[Any]) extends Filter {
230240 val literal = Literal (value)
231241 LiteralValue (literal.value, literal.dataType)
232242 }
233- new Predicate (" IN" , FieldReference (attribute) +: literals)
243+ new Predicate (" IN" , toV2Column (attribute) +: literals)
234244 }
235245}
236246
@@ -245,7 +255,7 @@ case class In(attribute: String, values: Array[Any]) extends Filter {
245255@ Stable
246256case class IsNull (attribute : String ) extends Filter {
247257 override def references : Array [String ] = Array (attribute)
248- override def toV2 : Predicate = new Predicate (" IS_NULL" , Array (FieldReference (attribute)))
258+ override def toV2 : Predicate = new Predicate (" IS_NULL" , Array (toV2Column (attribute)))
249259}
250260
251261/**
@@ -259,7 +269,7 @@ case class IsNull(attribute: String) extends Filter {
259269@ Stable
260270case class IsNotNull (attribute : String ) extends Filter {
261271 override def references : Array [String ] = Array (attribute)
262- override def toV2 : Predicate = new Predicate (" IS_NOT_NULL" , Array (FieldReference (attribute)))
272+ override def toV2 : Predicate = new Predicate (" IS_NOT_NULL" , Array (toV2Column (attribute)))
263273}
264274
265275/**
@@ -308,7 +318,7 @@ case class Not(child: Filter) extends Filter {
308318case class StringStartsWith (attribute : String , value : String ) extends Filter {
309319 override def references : Array [String ] = Array (attribute)
310320 override def toV2 : Predicate = new Predicate (" STARTS_WITH" ,
311- Array (FieldReference (attribute), LiteralValue (UTF8String .fromString(value), StringType )))
321+ Array (toV2Column (attribute), LiteralValue (UTF8String .fromString(value), StringType )))
312322}
313323
314324/**
@@ -324,7 +334,7 @@ case class StringStartsWith(attribute: String, value: String) extends Filter {
324334case class StringEndsWith (attribute : String , value : String ) extends Filter {
325335 override def references : Array [String ] = Array (attribute)
326336 override def toV2 : Predicate = new Predicate (" ENDS_WITH" ,
327- Array (FieldReference (attribute), LiteralValue (UTF8String .fromString(value), StringType )))
337+ Array (toV2Column (attribute), LiteralValue (UTF8String .fromString(value), StringType )))
328338}
329339
330340/**
@@ -340,7 +350,7 @@ case class StringEndsWith(attribute: String, value: String) extends Filter {
340350case class StringContains (attribute : String , value : String ) extends Filter {
341351 override def references : Array [String ] = Array (attribute)
342352 override def toV2 : Predicate = new Predicate (" CONTAINS" ,
343- Array (FieldReference (attribute), LiteralValue (UTF8String .fromString(value), StringType )))
353+ Array (toV2Column (attribute), LiteralValue (UTF8String .fromString(value), StringType )))
344354}
345355
346356/**
0 commit comments