/*
* 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);
}
}