maropu commented on a change in pull request #29728:
URL: https://github.com/apache/spark/pull/29728#discussion_r487862589
##########
File path:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
##########
@@ -1327,22 +1327,29 @@ class AstBuilder(conf: SQLConf) extends
SqlBaseBaseVisitor[AnyRef] with Logging
override def visitComparison(ctx: ComparisonContext): Expression =
withOrigin(ctx) {
val left = expression(ctx.left)
val right = expression(ctx.right)
+ val isUnsupportedComparison = (left, right) match {
+ case (_: Attribute, _: Predicate) => true
+ case (_: Predicate, _: Attribute) => true
+ case _ => false
+ }
val operator =
ctx.comparisonOperator().getChild(0).asInstanceOf[TerminalNode]
operator.getSymbol.getType match {
- case SqlBaseParser.EQ =>
+ case SqlBaseParser.EQ if !isUnsupportedComparison =>
EqualTo(left, right)
- case SqlBaseParser.NSEQ =>
+ case SqlBaseParser.NSEQ if !isUnsupportedComparison =>
EqualNullSafe(left, right)
- case SqlBaseParser.NEQ | SqlBaseParser.NEQJ =>
+ case SqlBaseParser.NEQ | SqlBaseParser.NEQJ if !isUnsupportedComparison
=>
Not(EqualTo(left, right))
- case SqlBaseParser.LT =>
+ case SqlBaseParser.LT if !isUnsupportedComparison =>
LessThan(left, right)
- case SqlBaseParser.LTE =>
+ case SqlBaseParser.LTE if !isUnsupportedComparison =>
LessThanOrEqual(left, right)
- case SqlBaseParser.GT =>
+ case SqlBaseParser.GT if !isUnsupportedComparison =>
GreaterThan(left, right)
- case SqlBaseParser.GTE =>
+ case SqlBaseParser.GTE if !isUnsupportedComparison =>
GreaterThanOrEqual(left, right)
+ case _ =>
+ throw new ParseException("Syntax error at or near", ctx)
Review comment:
Could we check this error case at the beginning of this function?
```
override def visitComparison(ctx: ComparisonContext): Expression =
withOrigin(ctx) {
val left = expression(ctx.left)
val right = expression(ctx.right)
if (<Error checks>) {
throw new ParseException("Syntax error at or near", ctx)
}
val operator =
ctx.comparisonOperator().getChild(0).asInstanceOf[TerminalNode]
operator.getSymbol.getType match {
case SqlBaseParser.EQ =>
EqualTo(left, right)
case SqlBaseParser.NSEQ =>
EqualNullSafe(left, right)
case SqlBaseParser.NEQ | SqlBaseParser.NEQJ =>
Not(EqualTo(left, right))
...
case SqlBaseParser.GTE =>
GreaterThanOrEqual(left, right)
}
```
##########
File path:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
##########
@@ -1327,22 +1327,29 @@ class AstBuilder(conf: SQLConf) extends
SqlBaseBaseVisitor[AnyRef] with Logging
override def visitComparison(ctx: ComparisonContext): Expression =
withOrigin(ctx) {
val left = expression(ctx.left)
val right = expression(ctx.right)
+ val isUnsupportedComparison = (left, right) match {
Review comment:
How about the case, `select * from t1 where (a > 3) = (b < 5) = (c > 3)`
?
##########
File path:
sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/parser/AstBuilder.scala
##########
@@ -1327,22 +1327,29 @@ class AstBuilder(conf: SQLConf) extends
SqlBaseBaseVisitor[AnyRef] with Logging
override def visitComparison(ctx: ComparisonContext): Expression =
withOrigin(ctx) {
val left = expression(ctx.left)
val right = expression(ctx.right)
+ val isUnsupportedComparison = (left, right) match {
Review comment:
btw, have you check if we could update the ANTLR parser rules to prevent
this case?
----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.
For queries about this service, please contact Infrastructure at:
[email protected]
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]