/* * Copyright (C) 2015 JSQLParser. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ package net.sf.jsqlparser.expression; import java.util.ArrayList; import java.util.List; import net.sf.jsqlparser.JSQLParserException; import net.sf.jsqlparser.expression.operators.relational.InExpression; import net.sf.jsqlparser.expression.operators.relational.ItemsList; import net.sf.jsqlparser.parser.CCJSqlParserUtil; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.statement.select.PlainSelect; import net.sf.jsqlparser.statement.select.Select; import net.sf.jsqlparser.statement.select.SelectVisitorAdapter; import org.junit.After; import org.junit.AfterClass; import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertNull; import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertEquals; import static org.junit.Assert.fail; import org.junit.Before; import org.junit.BeforeClass; import org.junit.Test; /** * * @author tw */ public class ExpressionVisitorAdapterTest { public ExpressionVisitorAdapterTest() { } @BeforeClass public static void setUpClass() { } @AfterClass public static void tearDownClass() { } @Before public void setUp() { } @After public void tearDown() { } @Test public void testInExpressionProblem() throws JSQLParserException { final List exprList = new ArrayList(); Select select = (Select) CCJSqlParserUtil.parse("select * from foo where x in (?,?,?)"); PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); Expression where = plainSelect.getWhere(); where.accept(new ExpressionVisitorAdapter() { @Override public void visit(InExpression expr) { super.visit(expr); exprList.add(expr.getLeftExpression()); exprList.add(expr.getLeftItemsList()); exprList.add(expr.getRightItemsList()); } }); assertTrue(exprList.get(0) instanceof Expression); assertNull(exprList.get(1)); assertTrue(exprList.get(2) instanceof ItemsList); } @Test public void testInExpression() throws JSQLParserException { final List exprList = new ArrayList(); Select select = (Select) CCJSqlParserUtil. parse("select * from foo where (a,b) in (select a,b from foo2)"); PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); Expression where = plainSelect.getWhere(); where.accept(new ExpressionVisitorAdapter() { @Override public void visit(InExpression expr) { super.visit(expr); exprList.add(expr.getLeftExpression()); exprList.add(expr.getLeftItemsList()); exprList.add(expr.getRightItemsList()); } }); assertNull(exprList.get(0)); assertTrue(exprList.get(1) instanceof ItemsList); assertTrue(exprList.get(2) instanceof ItemsList); } @Test public void testOracleHintExpressions() throws JSQLParserException { testOracleHintExpression("select --+ MYHINT \n * from foo", "MYHINT", true); testOracleHintExpression("select /*+ MYHINT */ * from foo", "MYHINT", false); } public static void testOracleHintExpression(String sql, String hint, boolean singleLine) throws JSQLParserException { Select select = (Select) CCJSqlParserUtil.parse(sql); PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); final OracleHint[] holder = new OracleHint[1]; assertNotNull(plainSelect.getOracleHint()); plainSelect.getOracleHint().accept(new ExpressionVisitorAdapter() { @Override public void visit(OracleHint hint) { super.visit(hint); holder[0] = hint; } }); assertNotNull(holder[0]); assertEquals(singleLine, holder[0].isSingleLine()); assertEquals(hint, holder[0].getValue()); } @Test public void testCurrentTimestampExpression() throws JSQLParserException { final List<String> columnList = new ArrayList<String>(); Select select = (Select) CCJSqlParserUtil. parse("select * from foo where bar < CURRENT_TIMESTAMP"); PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); Expression where = plainSelect.getWhere(); where.accept(new ExpressionVisitorAdapter() { @Override public void visit(Column column) { super.visit(column); columnList.add(column.getColumnName()); } }); assertEquals(1, columnList.size()); assertEquals("bar", columnList.get(0)); } @Test public void testCurrentDateExpression() throws JSQLParserException { final List<String> columnList = new ArrayList<String>(); Select select = (Select) CCJSqlParserUtil. parse("select * from foo where bar < CURRENT_DATE"); PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); Expression where = plainSelect.getWhere(); where.accept(new ExpressionVisitorAdapter() { @Override public void visit(Column column) { super.visit(column); columnList.add(column.getColumnName()); } }); assertEquals(1, columnList.size()); assertEquals("bar", columnList.get(0)); } @Test public void testSubSelectExpressionProblem() throws JSQLParserException { Select select = (Select) CCJSqlParserUtil. parse("SELECT * FROM t1 WHERE EXISTS (SELECT * FROM t2 WHERE t2.col2 = t1.col1)"); PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); Expression where = plainSelect.getWhere(); ExpressionVisitorAdapter adapter = new ExpressionVisitorAdapter(); adapter.setSelectVisitor(new SelectVisitorAdapter()); try { where.accept(adapter); } catch (NullPointerException npe) { fail(); } } @Test public void testCaseWithoutElse() throws JSQLParserException { Expression expr = CCJSqlParserUtil.parseExpression("CASE WHEN 1 then 0 END"); ExpressionVisitorAdapter adapter = new ExpressionVisitorAdapter(); expr.accept(adapter); } @Test public void testCaseWithoutElse2() throws JSQLParserException { Expression expr = CCJSqlParserUtil.parseExpression("CASE WHEN 1 then 0 ELSE -1 END"); ExpressionVisitorAdapter adapter = new ExpressionVisitorAdapter(); expr.accept(adapter); } @Test public void testCaseWithoutElse3() throws JSQLParserException { Expression expr = CCJSqlParserUtil.parseExpression("CASE 3+4 WHEN 1 then 0 END"); ExpressionVisitorAdapter adapter = new ExpressionVisitorAdapter(); expr.accept(adapter); } }