Skip to content

Commit

Permalink
(refs #2)Validate subquery in ON clause
Browse files Browse the repository at this point in the history
  • Loading branch information
takezoe committed Sep 11, 2016
1 parent 9a71367 commit 543e90a
Show file tree
Hide file tree
Showing 2 changed files with 21 additions and 27 deletions.
Expand Up @@ -14,22 +14,14 @@ class SelectVisitor(c: Context) extends SelectVisitorAdapter {

override def visit(plainSelect: PlainSelect): Unit = {
Option(plainSelect.getJoins).map(_.asScala.foreach { join =>
val visitor = new FromItemVisitor(c)
val visitor = new FromItemVisitor()
join.getRightItem.accept(visitor)
select.from += visitor.table

Option(join.getOnExpression).foreach(_.accept(new ExpressionVisitorAdapter(){
override def visit(tableColumn: Column): Unit = {
val column = new ColumnModel()
column.name = tableColumn.getColumnName
column.table = Option(tableColumn.getTable.getName)
column.alias = None
select.columns += column
}
}))
Option(join.getOnExpression).foreach(_.accept(new ExpressionVisitor()))
})

val visitor = new FromItemVisitor(c)
val visitor = new FromItemVisitor()
plainSelect.getFromItem.accept(visitor)
select.from += visitor.table

Expand Down Expand Up @@ -60,21 +52,8 @@ class SelectVisitor(c: Context) extends SelectVisitorAdapter {

}

Option(plainSelect.getWhere).foreach(_.accept(new ExpressionVisitorAdapter {
override def visit(column: Column): Unit = {
val c = new ColumnModel()
c.name = column.getColumnName
c.table = Option(column.getTable).flatMap(t => Option(t.getName))
select.where += c
}
Option(plainSelect.getWhere).foreach(_.accept(new ExpressionVisitor()))

override def visit(subSelect: SubSelect): Unit = {
val visitor = new SelectVisitor(c)
subSelect.getSelectBody.accept(visitor)
select.others += visitor.select

}
}))
Option(plainSelect.getOrderByElements).foreach(_.asScala.foreach { orderBy =>
orderBy.accept(new OrderByVisitor {
override def visit(orderBy: OrderByElement): Unit = {
Expand All @@ -91,7 +70,22 @@ class SelectVisitor(c: Context) extends SelectVisitorAdapter {
})
}

class FromItemVisitor(c: Context) extends FromItemVisitorAdapter {
class ExpressionVisitor extends ExpressionVisitorAdapter {
override def visit(tableColumn: Column): Unit = {
val column = new ColumnModel()
column.name = tableColumn.getColumnName
column.table = Option(tableColumn.getTable.getName)
select.columns += column
}

override def visit(subSelect: SubSelect): Unit = {
val visitor = new SelectVisitor(c)
subSelect.getSelectBody.accept(visitor)
select.others += visitor.select
}
}

class FromItemVisitor extends FromItemVisitorAdapter {

val table = new TableModel()

Expand Down
Expand Up @@ -18,7 +18,7 @@ class SqlValidationSpec extends FunSuite {
|FROM
| USER A,
| (SELECT DEPT_ID, DEPT_NAME FROM DEPT) C
|INNER JOIN COMPANY B ON A.COMPANY_ID = B.COMPANY_ID
|INNER JOIN COMPANY B ON A.COMPANY_ID = B.COMPANY_ID AND A.DEPT_ID IN (SELECT DEPT_ID FROM DEPT)
|WHERE
| B.COMPANY_ID = ${companyId} AND
| B.COMPANY_NAME = ${companyName} AND
Expand Down

0 comments on commit 543e90a

Please sign in to comment.