package net.sf.jsqlparser.test.select;
import java.io.StringReader;
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.expression.BinaryExpression;
import net.sf.jsqlparser.expression.DoubleValue;
import net.sf.jsqlparser.expression.Function;
import net.sf.jsqlparser.expression.LongValue;
import net.sf.jsqlparser.expression.StringValue;
import net.sf.jsqlparser.expression.TimeValue;
import net.sf.jsqlparser.expression.TimestampValue;
import net.sf.jsqlparser.expression.operators.arithmetic.Multiplication;
import net.sf.jsqlparser.expression.operators.relational.EqualsTo;
import net.sf.jsqlparser.expression.operators.relational.GreaterThan;
import net.sf.jsqlparser.expression.operators.relational.InExpression;
import net.sf.jsqlparser.expression.operators.relational.LikeExpression;
import net.sf.jsqlparser.parser.CCJSqlParserManager;
import net.sf.jsqlparser.schema.Column;
import net.sf.jsqlparser.schema.Table;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.select.AllTableColumns;
import net.sf.jsqlparser.statement.select.Join;
import net.sf.jsqlparser.statement.select.OrderByElement;
import net.sf.jsqlparser.statement.select.PlainSelect;
import net.sf.jsqlparser.statement.select.Select;
import net.sf.jsqlparser.statement.select.SelectExpressionItem;
import net.sf.jsqlparser.statement.select.Union;
import net.sf.jsqlparser.util.deparser.ExpressionDeParser;
import net.sf.jsqlparser.util.deparser.SelectDeParser;
import net.sf.jsqlparser.util.deparser.StatementDeParser;
import static org.junit.Assert.*;
import org.junit.Test;
public class SelectTest {
CCJSqlParserManager parserManager = new CCJSqlParserManager();
@Test
public void testTableAlias() throws JSQLParserException {
String statement = "SELECT t1.name FROM #table1 AS t1 WHERE t1.id = 12";
Select select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
}
@Test
public void testLimit() throws JSQLParserException {
String statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT 3, ?";
Select select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(3, ((PlainSelect) select.getSelectBody()).getLimit().getOffset());
assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isRowCountJdbcParameter());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isOffsetJdbcParameter());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
// toString uses standard syntax
assertEquals(statement, "" + select);
statement = "SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(0, ((PlainSelect) select.getSelectBody()).getLimit().getRowCount());
assertTrue(((PlainSelect) select.getSelectBody()).getLimit().isOffsetJdbcParameter());
assertFalse(((PlainSelect) select.getSelectBody()).getLimit().isLimitAll());
assertEquals(statement, "" + select);
statement =
"(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION "
+ "(SELECT * FROM mytable2 WHERE mytable2.col = 9 OFFSET ?) LIMIT 3, 4";
select = (Select) parserManager.parse(new StringReader(statement));
Union union = (Union) select.getSelectBody();
assertEquals(3, union.getLimit().getOffset());
assertEquals(4, union.getLimit().getRowCount());
// toString uses standard syntax
assertEquals(statement, "" + select);
statement =
"(SELECT * FROM mytable WHERE mytable.col = 9 OFFSET ?) UNION ALL "
+ "(SELECT * FROM mytable2 WHERE mytable2.col = 9 OFFSET ?) UNION ALL "
+ "(SELECT * FROM mytable3 WHERE mytable4.col = 9 OFFSET ?) LIMIT 4 OFFSET 3";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
}
@Test
public void testTop() throws JSQLParserException {
String statement = "SELECT TOP 3 * FROM mytable WHERE mytable.col = 9";
Select select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(3, ((PlainSelect) select.getSelectBody()).getTop().getRowCount());
statement = "select top 5 foo from bar";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(5, ((PlainSelect) select.getSelectBody()).getTop().getRowCount());
}
@Test
public void testCirilicChars() throws JSQLParserException {
String statement =
"/*привет*/ SELECT /*sdfsf*/ * FROM /*sdfs*/ моятаблица WHERE моятаблица.col = 9 /*ksjdf*/";
Select select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
}
@Test
public void testComment() throws JSQLParserException {
String statement =
"/*welkjhkas*/ SELECT /*sdfsf*/ * FROM /*sdfs*/ mytable WHERE mytable.col = 9 /*ksjdf*/";
Select select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement =
"/*welkjhkas*/ SELECT /*0*/ DISTINCT /*1*/ ON /*2*/ (/*6*/ myid /*3*/ ) /*4*/ myid, /*5*/ mycol FROM mytable WHERE mytable.col = 9 /*ksjdf*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ * FROM /**/ tab1 /**/ LEFT /**/ OUTER /**/ JOIN /**/ tab2 /**/ ON tab1.id = tab2.id /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ * FROM /**/ tab1 /**/ LEFT /**/ OUTER /**/ JOIN /**/ tab2 /**/ ON tab1.id = tab2.id /**/ INNER /**/ JOIN /**/ tab3 /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ * FROM /**/ tab1 /**/ LEFT /**/ OUTER /**/ JOIN /**/ tab2 /**/ ON tab1.id = tab2.id /**/ JOIN /**/ tab3 /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ * FROM /**/ tab1 /**/ LEFT /**/ OUTER /**/ JOIN /**/ tab2 /**/ ON tab1.id = tab2.id /**/ INNER /**/ JOIN /**/ tab3 /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ * FROM /**/ TA2 /**/ LEFT /**/ OUTER /**/ JOIN /**/ O /**/ USING /**/ (/**/ col1 /**/, /**/ col2 /**/ ) WHERE D.OasSD = 'asdf' AND (kj >= 4 OR l < 'sdf') /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ * FROM /**/ tab1 /**/ INNER /**/ JOIN /**/ tab2 /**/ USING /**/ (/**/ id /**/, /**/ id2 /**/ ) /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ * FROM /**/ tab1 /**/ RIGHT /**/ OUTER /**/ JOIN /**/ tab2 /**/ USING /**/ (/**/ id /**/, /**/ id2 /**/ ) /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ * FROM /**/ foo /**/ AS /**/ f /**/ LEFT /**/ INNER /**/ JOIN (/**/ bar /**/ AS /**/ b /**/ RIGHT /**/ OUTER /**/ JOIN /**/ baz /**/ AS /**/ z /**/ ON f.id = z.id) /**/ ON f.id = b.id /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ * FROM /*2*/ mytable /**/ WHERE /**/ mytable.col /**/ = /**/ 9 /*3*/ LIMIT /*4*/ 3 /*5*/ , /*6*/ ? /*7*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
// toString uses standard syntax
statement = "/**/ SELECT /**/ * FROM /**/ mytable WHERE mytable.col = 9 /**/ LIMIT /**/ ? /**/ OFFSET /**/ 3 /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ * FROM /**/ mytable WHERE mytable.col = 9 /**/ OFFSET /**/ ? /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ * FROM /*2*/ tab1 WHERE /*3*/ a > 34 GROUP BY tab1.b ORDER BY tab1.a /*6*/ DESC, tab1.b /*8*/ ASC /*9*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ TOP /*2*/ 3 /*3*/ * FROM /*4*/ mytable WHERE mytable.col = 9 /*5*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*1*/ WITH /**/ DINFO /**/ (DEPTNO, AVGSALARY, EMPCOUNT) /**/ AS "
+ "/**/ (/**/ SELECT OTHERS.WORKDEPT, AVG(OTHERS.SALARY), COUNT(*) FROM /**/ EMPLOYEE /**/ AS /**/ OTHERS "
+ "GROUP BY OTHERS.WORKDEPT /**/) /*2*/, /**/ DINFOMAX /**/ AS /**/ (/**/ SELECT MAX(AVGSALARY) /**/ AS /**/ AVGMAX FROM /**/ DINFO /**/) "
+ "/**/ SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY, DINFO.AVGSALARY, DINFO.EMPCOUNT, DINFOMAX.AVGMAX "
+ "FROM /**/ EMPLOYEE /**/ AS /**/ THIS_EMP /**/ INNER /**/ JOIN /**/ DINFO /**/ INNER /**/ JOIN /**/ DINFOMAX "
+ "WHERE THIS_EMP.JOB = 'SALESREP' AND THIS_EMP.WORKDEPT = DINFO.DEPTNO /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ * FROM /**/ t1 WHERE t1.r IN /**/ (/**/ SELECT /**/ * FROM /**/ t2 /**/) /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement =
"/**/ (/**/ SELECT /**/ * FROM /**/ mytable WHERE mytable.col = 9 /**/ OFFSET /**/ ? /**/) /**/ UNION "
+ "/**/ (/**/ SELECT /**/ * FROM /**/ mytable2 WHERE mytable2.col = 9 /**/ OFFSET /**/ ? /**/) "
+ "/**/ ORDER /**/ BY mytable.col /**/ DESC /**/ LIMIT /**/ 3 /**/ , /**/ 4 /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement =
"/**/ SELECT /**/ * FROM /**/ mytable WHERE mytable.col = 9 /**/ OFFSET /**/ ? /**/ UNION "
+ "/**/ SELECT /**/ * FROM /**/ mytable2 WHERE mytable2.col = 9 /**/ OFFSET /**/ ? /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement =
"/**/ SELECT /**/ * FROM /**/ mytable WHERE mytable.col = 9 /**/ ORDER /**/ BY mytable.col /**/ DESC /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT MAX(tab1.b) /**/ FROM /**/ tab1 /**/ WHERE a > 34 GROUP BY tab1.b /**/ HAVING MAX(tab1.b) > 56 /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ * /*2*/ FROM /*2*/ tab1 /*2*/ WHERE /*3*/ a > 34 /*0*/ GROUP /*0*/ BY tab1.b /*0*/, tab1.a /*0*/, tab1.c /*0*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ * /*2*/ INTO /*3*/ tab2 /*4*/ FROM /*7*/ tab1 /*8*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ * /*4*/ FROM /*7*/ tab1 /*8*/ WHERE tab1.f /*2*/ NOT /*3*/ BETWEEN 3 /*5*/ AND ? /*6*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ * /*4*/ FROM /*7*/ tab1 /*8*/ WHERE tab1.f /*2*/ IS /*1*/ NOT /*3*/ NULL /*6*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ * /*4*/ FROM /*7*/ tab1 /*8*/ WHERE tab1.f /*2*/ NOT /*3*/ IN /**/ (/**/ 3 /**/, /**/ 5 /**/, /**/ ? /**/, /**/ 4 /**/ ) /*6*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ * /*4*/ FROM /*7*/ tab1 /*8*/ WHERE tab1.f /*2*/ NOT /*3*/ LIKE 'bh%' /*6*/ ESCAPE /*34*/ '1' /*56*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ * /*4*/ FROM /*7*/ tab1 /*8*/ WHERE /*5*/ NOT /*53*/ EXISTS (SELECT * FROM t1) /*56*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ * /*2*/ FROM /*3*/ tab1 /*4*/ WHERE /**/ f1 /*5*/ = /**/ 5 /*6*/ AND /**/ f2 /*7*/ <= /**/ ? /*8*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ * /*2*/ FROM /*3*/ tab1 /*4*/ WHERE /*11*/ (/**/ a /*5*/ + /**/ b /*6*/ - /**/ c /*7*/ / /**/ d /*8*/ + /**/ e /*9*/ * /**/ f /*11*/ ) /*10*/ * /*11*/ (/**/ a /*11*/ / /**/ b /*12*/ * /*11*/ (/**/ a /*13*/ + /**/ b /*11*/ ) /*11*/ ) /*14*/ > /**/ ? /*15*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/*0*/ SELECT /*1*/ a /**/, /**/ b /**/, /**/ c /*2*/ FROM /*3*/ tab1 /*4*/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ {fn /**/ MAX /**/ (/**/ a /**/, /**/ b /**/, /**/ c /**/ ) /**/ } /**/, /**/ tm.COUNT /**/ (/**/ * /**/ ) /**/, /**/ D /**/ FROM /**/ tab1 /**/ GROUP /**/ BY /**/ D";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "/**/ SELECT /**/ MAX /**/ (/**/ DISTINCT /**/ id /**/ ) /**/ AS /**/ max /**/ FROM /**/ mytable /**/";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
statement = "SELECT t1.CALC, t.NAMECALC, t2.VALUEOUT "
+ "FROM TR_SENSOR_DEFINE_PARAM t1"
+ " INNER JOIN TR_CALC_PARAMS t ON t1.CALC = t.TR_CALC_PARAMS_ID"
+ " INNER JOIN TR_SENSORS_CALIBRATION t2 ON t1.SENSOR = t2.SENSOR"
+ " AND t2.VALUEIN <= :parValue"
+ " WHERE :parSensor = t1.SENSOR";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + select);
}
@Test
public void testSelectItems() throws JSQLParserException {
String statement =
"SELECT myid AS MYID, mycol, tab.*, schema.tab.*, mytab.mycol2, myschema.mytab.mycol, myschema.mytab.* FROM mytable WHERE mytable.col = 9";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals("MYID", ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getAlias().getName());
assertEquals("mycol", ((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).getExpression()).getColumnName());
assertEquals("tab", ((AllTableColumns) plainSelect.getSelectItems().get(2)).getTable().getName());
assertEquals("schema", ((AllTableColumns) plainSelect.getSelectItems().get(3)).getTable().getSchemaName());
assertEquals("schema.tab", ((AllTableColumns) plainSelect.getSelectItems().get(3)).getTable().getWholeTableName());
assertEquals(
"mytab.mycol2",
((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(4)).getExpression()).getWholeColumnName());
assertEquals(
"myschema.mytab.mycol",
((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(5)).getExpression()).getWholeColumnName());
assertEquals("myschema.mytab", ((AllTableColumns) plainSelect.getSelectItems().get(6)).getTable().getWholeTableName());
assertEquals(statement, "" + plainSelect);
statement = "SELECT myid AS MYID, (SELECT MAX(ID) AS myid2 FROM mytable2) AS myalias FROM mytable WHERE mytable.col = 9";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals("myalias", ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).getAlias().getName());
assertEquals(statement, "" + plainSelect);
statement = "SELECT (myid + myid2) AS MYID FROM mytable WHERE mytable.col = 9";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals("MYID", ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getAlias().getName());
assertEquals(statement, "" + plainSelect);
}
@Test
public void testUnion() throws JSQLParserException {
String statement =
"SELECT * FROM mytable WHERE mytable.col = 9 UNION "
+ "SELECT * FROM mytable3 WHERE mytable3.col = ? UNION "
+ "SELECT * FROM mytable2 LIMIT 3, 4";
Union union = (Union) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(3, union.getPlainSelects().size());
assertEquals("mytable", ((Table) ((PlainSelect) union.getPlainSelects().get(0)).getFromItem()).getName());
assertEquals("mytable3", ((Table) ((PlainSelect) union.getPlainSelects().get(1)).getFromItem()).getName());
assertEquals("mytable2", ((Table) ((PlainSelect) union.getPlainSelects().get(2)).getFromItem()).getName());
assertEquals(3, ((PlainSelect) union.getPlainSelects().get(2)).getLimit().getOffset());
//use brakets for toString
//use standard limit syntax
assertEquals(statement, "" + union);
}
@Test
public void testEXCEPT() throws JSQLParserException {
String statement =
"SELECT /*sdfhjklsdh*/ * FROM mytable WHERE mytable.col = 9 EXCEPT "
+ "SELECT * FROM mytable3 WHERE mytable3.col = ? UNION "
+ "SELECT * FROM mytable2 LIMIT 3, 4";
Union union = (Union) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(3, union.getPlainSelects().size());
assertEquals("mytable", ((Table) ((PlainSelect) union.getPlainSelects().get(0)).getFromItem()).getName());
assertEquals("mytable3", ((Table) ((PlainSelect) union.getPlainSelects().get(1)).getFromItem()).getName());
assertEquals("mytable2", ((Table) ((PlainSelect) union.getPlainSelects().get(2)).getFromItem()).getName());
assertEquals(3, ((PlainSelect) union.getPlainSelects().get(2)).getLimit().getOffset());
//use brakets for toString
//use standard limit syntax
assertEquals(statement, "" + union);
statement =
"(SELECT * FROM mytable WHERE mytable.col = 9) INTERSECT "
+ "(SELECT * FROM mytable3 WHERE mytable3.col = ?) UNION "
+ "(SELECT * FROM mytable2 LIMIT 3, 4)";
union = (Union) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(3, union.getPlainSelects().size());
assertEquals("mytable", ((Table) ((PlainSelect) union.getPlainSelects().get(0)).getFromItem()).getName());
assertEquals("mytable3", ((Table) ((PlainSelect) union.getPlainSelects().get(1)).getFromItem()).getName());
assertEquals("mytable2", ((Table) ((PlainSelect) union.getPlainSelects().get(2)).getFromItem()).getName());
assertEquals(3, ((PlainSelect) union.getPlainSelects().get(2)).getLimit().getOffset());
//use brakets for toString
//use standard limit syntax
assertEquals(statement, "" + union);
}
@Test
public void testDistinct() throws JSQLParserException {
String statement = "SELECT DISTINCT ON (myid) myid, mycol FROM mytable WHERE mytable.col = 9";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(
"myid",
((Column) ((SelectExpressionItem) plainSelect.getDistinct().getOnSelectItems().get(0)).getExpression()).getColumnName());
assertEquals("mycol", ((Column) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).getExpression()).getColumnName());
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
}
@Test
public void testFrom() throws JSQLParserException {
String statement =
"SELECT * FROM mytable as mytable0, mytable1 alias_tab1, mytable2 as alias_tab2, (SELECT * FROM mytable3) AS mytable4 WHERE mytable.col = 9";
String statementToString =
"SELECT * FROM mytable as mytable0, mytable1 as alias_tab1, mytable2 as alias_tab2, (SELECT * FROM mytable3) AS mytable4 WHERE mytable.col = 9";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(3, plainSelect.getJoins().size());
assertEquals("mytable0", ((Table) plainSelect.getFromItem()).getAlias().getName());
assertEquals("alias_tab1", ((Join) plainSelect.getJoins().get(0)).getRightItem().getAlias().getName());
assertEquals("alias_tab2", ((Join) plainSelect.getJoins().get(1)).getRightItem().getAlias().getName());
assertEquals("mytable4", ((Join) plainSelect.getJoins().get(2)).getRightItem().getAlias().getName());
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
}
@Test
public void testJoin() throws JSQLParserException {
String statement = "SELECT * FROM tab1 LEFT outer JOIN tab2 ON tab1.id = tab2.id";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(1, plainSelect.getJoins().size());
assertEquals("tab2", ((Table) ((Join) plainSelect.getJoins().get(0)).getRightItem()).getWholeTableName());
assertEquals(
"tab1.id",
((Column) ((EqualsTo) ((Join) plainSelect.getJoins().get(0)).getOnExpression()).getLeftExpression()).getWholeColumnName());
assertTrue(((Join) plainSelect.getJoins().get(0)).isOuter());
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
statement = "SELECT * FROM tab1 LEFT outer JOIN tab2 ON tab1.id = tab2.id INNER JOIN tab3";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(2, plainSelect.getJoins().size());
assertEquals("tab3", ((Table) ((Join) plainSelect.getJoins().get(1)).getRightItem()).getWholeTableName());
assertFalse(((Join) plainSelect.getJoins().get(1)).isOuter());
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
statement = "SELECT * FROM tab1 LEFT outer JOIN tab2 ON tab1.id = tab2.id JOIN tab3";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(2, plainSelect.getJoins().size());
assertEquals("tab3", ((Table) ((Join) plainSelect.getJoins().get(1)).getRightItem()).getWholeTableName());
assertFalse(((Join) plainSelect.getJoins().get(1)).isOuter());
// implicit INNER
statement = "SELECT * FROM tab1 LEFT outer JOIN tab2 ON tab1.id = tab2.id INNER JOIN tab3";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
statement = "SELECT * FROM TA2 LEFT outer JOIN O USING (col1, col2) where D.OasSD = 'asdf' And (kj >= 4 OR l < 'sdf')";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
statement = "SELECT * FROM tab1 INNER JOIN tab2 USING (id, id2)";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(1, plainSelect.getJoins().size());
assertEquals("tab2", ((Table) ((Join) plainSelect.getJoins().get(0)).getRightItem()).getWholeTableName());
assertFalse(((Join) plainSelect.getJoins().get(0)).isOuter());
assertEquals(2, ((Join) plainSelect.getJoins().get(0)).getUsingColumns().size());
assertEquals("id2", ((Column) ((Join) plainSelect.getJoins().get(0)).getUsingColumns().get(1)).getWholeColumnName());
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
statement = "SELECT * FROM tab1 RIGHT OUTER JOIN tab2 USING (id, id2)";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
statement = "select * from foo as f LEFT INNER JOIN (bar as b RIGHT OUTER JOIN baz as z ON f.id = z.id) ON f.id = b.id";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
}
@Test
public void testFunctions() throws JSQLParserException {
String statement = "SELECT MAX(id) as max FROM mytable WHERE mytable.col = 9";
PlainSelect select = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals("max", ((SelectExpressionItem) select.getSelectItems().get(0)).getAlias().getName());
assertEquals(statement.toUpperCase(), select.toString().toUpperCase());
statement = "SELECT MAX(id), AVG(pro) as myavg FROM mytable WHERE mytable.col = 9 GROUP BY pro";
select = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals("myavg", ((SelectExpressionItem) select.getSelectItems().get(1)).getAlias().getName());
assertEquals(statement.toUpperCase(), select.toString().toUpperCase());
statement = "SELECT MAX(a, b, c), COUNT(*), D FROM tab1 GROUP BY D";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
Function fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getExpression();
assertEquals("MAX", fun.getName());
assertEquals("b", ((Column) fun.getParameters().getExpressions().get(1)).getWholeColumnName());
assertTrue(((Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).getExpression()).isAllColumns());
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
statement = "SELECT {fn MAX(a, b, c)}, COUNT(*), D FROM tab1 GROUP BY D";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getExpression();
assertTrue(fun.isEscaped());
assertEquals("MAX", fun.getName());
assertEquals("b", ((Column) fun.getParameters().getExpressions().get(1)).getWholeColumnName());
assertTrue(((Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).getExpression()).isAllColumns());
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
statement = "SELECT ab.MAX(a, b, c), cd.COUNT(*), D FROM tab1 GROUP BY D";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(0)).getExpression();
assertEquals("ab.MAX", fun.getName());
assertEquals("b", ((Column) fun.getParameters().getExpressions().get(1)).getWholeColumnName());
fun = (Function) ((SelectExpressionItem) plainSelect.getSelectItems().get(1)).getExpression();
assertEquals("cd.COUNT", fun.getName());
assertTrue(fun.isAllColumns());
assertEquals(statement.toUpperCase(), plainSelect.toString().toUpperCase());
}
@Test
public void testWhere() throws JSQLParserException {
String statement = "SELECT * FROM tab1 WHERE ";
String whereToString = "(a + b + c / d + e * f) * (a / b * (a + b)) > ?";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement + whereToString))).getSelectBody();
assertTrue(plainSelect.getWhere() instanceof GreaterThan);
assertTrue(((GreaterThan) plainSelect.getWhere()).getLeftExpression() instanceof Multiplication);
assertEquals(statement + whereToString, "" + plainSelect);
ExpressionDeParser expressionDeParser = new ExpressionDeParser();
StringBuilder buffer = new StringBuilder();
expressionDeParser.setBuffer(buffer);
plainSelect.getWhere().accept(expressionDeParser);
assertEquals(whereToString, buffer.toString());
whereToString = "(7 * s + 9 / 3) not between 3 and ?";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement + whereToString))).getSelectBody();
buffer = new StringBuilder();
expressionDeParser.setBuffer(buffer);
plainSelect.getWhere().accept(expressionDeParser);
assertEquals(whereToString, buffer.toString());
assertEquals((statement + whereToString).toLowerCase(), ("" + plainSelect).toLowerCase());
whereToString = "a / b NOT IN (?, 's''adf', 234.2)";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement + whereToString))).getSelectBody();
buffer = new StringBuilder();
expressionDeParser.setBuffer(buffer);
plainSelect.getWhere().accept(expressionDeParser);
assertEquals(whereToString.toLowerCase(), buffer.toString().toLowerCase());
assertEquals((statement + whereToString).toLowerCase(), ("" + plainSelect).toLowerCase());
whereToString = "NOT 0 = 0";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement + whereToString))).getSelectBody();
String where = " NOT (0 = 0)";
whereToString = "NOT (0 = 0)";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement + whereToString))).getSelectBody();
buffer = new StringBuilder();
expressionDeParser.setBuffer(buffer);
plainSelect.getWhere().accept(expressionDeParser);
assertEquals(where.toLowerCase(), buffer.toString().toLowerCase());
assertEquals((statement + whereToString).toLowerCase(), ("" + plainSelect).toLowerCase());
}
@Test
public void testDebug() throws JSQLParserException {
String statement = "Select t1.CALC, t.NAMECALC, t2.VALUEOUT "
+ "From TR_SENSOR_DEFINE_PARAM t1"
+ " Inner Join TR_CALC_PARAMS t on t1.CALC = t.TR_CALC_PARAMS_ID"
+ " Inner Join TR_SENSORS_CALIBRATION t2 on t1.SENSOR = t2.SENSOR"
+ " and t2.VALUEIN <= :parValue"
+ " Where :parSensor = t1.SENSOR";
Select select = (Select) parserManager.parse(new StringReader(statement));
StringBuilder buf = new StringBuilder();
StatementDeParser deparser = new StatementDeParser(buf);
deparser.visit(select);
}
@Test
public void testGroupBy() throws JSQLParserException {
String statement = "SELECT * FROM tab1 WHERE a > 34 GROUP BY tab1.b";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(1, plainSelect.getGroupByColumnReferences().size());
assertEquals("tab1.b", ((Column) plainSelect.getGroupByColumnReferences().get(0)).getWholeColumnName());
assertEquals(statement, "" + plainSelect);
statement = "SELECT * FROM tab1 WHERE a > 34 GROUP BY 2, 3";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(2, plainSelect.getGroupByColumnReferences().size());
assertEquals(2, ((LongValue) plainSelect.getGroupByColumnReferences().get(0)).getValue());
assertEquals(3, ((LongValue) plainSelect.getGroupByColumnReferences().get(1)).getValue());
assertEquals(statement, "" + plainSelect);
}
@Test
public void testHaving() throws JSQLParserException {
String statement = "SELECT MAX(tab1.b) FROM tab1 WHERE a > 34 GROUP BY tab1.b HAVING MAX(tab1.b) > 56";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertTrue(plainSelect.getHaving() instanceof GreaterThan);
assertEquals(statement, "" + plainSelect);
statement = "SELECT MAX(tab1.b) FROM tab1 WHERE a > 34 HAVING MAX(tab1.b) IN (56, 32, 3, ?)";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertTrue(plainSelect.getHaving() instanceof InExpression);
assertEquals(statement, "" + plainSelect);
}
@Test
public void testExists() throws JSQLParserException {
String statement = "SELECT * FROM tab1 WHERE";
String where = " EXISTS (SELECT * FROM tab2)";
statement += where;
Statement parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
PlainSelect plainSelect = (PlainSelect) ((Select) parsed).getSelectBody();
ExpressionDeParser expressionDeParser = new ExpressionDeParser();
StringBuilder buffer = new StringBuilder();
expressionDeParser.setBuffer(buffer);
SelectDeParser deParser = new SelectDeParser(expressionDeParser, buffer);
expressionDeParser.setSelectVisitor(deParser);
plainSelect.getWhere().accept(expressionDeParser);
assertEquals(where.toLowerCase(), buffer.toString().replaceAll("[\n\r]+", "").toLowerCase());
}
@Test
public void testOrderBy() throws JSQLParserException {
//TODO: should there be a DESC marker in the OrderByElement class?
String statement = "SELECT * FROM tab1 WHERE a > 34 GROUP BY tab1.b ORDER BY tab1.a DESC, tab1.b ASC";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(2, plainSelect.getOrderByElements().size());
assertEquals("tab1.a", ((Column) ((OrderByElement) plainSelect.getOrderByElements().get(0)).getExpression()).getWholeColumnName());
assertEquals("b", ((Column) ((OrderByElement) plainSelect.getOrderByElements().get(1)).getExpression()).getColumnName());
assertTrue(((OrderByElement) plainSelect.getOrderByElements().get(1)).isAsc());
assertFalse(((OrderByElement) plainSelect.getOrderByElements().get(0)).isAsc());
assertEquals(statement, "" + plainSelect);
ExpressionDeParser expressionDeParser = new ExpressionDeParser();
StringBuilder buffer = new StringBuilder();
SelectDeParser deParser = new SelectDeParser(expressionDeParser, buffer);
expressionDeParser.setSelectVisitor(deParser);
expressionDeParser.setBuffer(buffer);
plainSelect.accept(deParser);
assertEquals(statement.toString().toUpperCase(), buffer.toString().toUpperCase().replaceAll(ExpressionDeParser.LINE_SEPARATOR, ""));
statement = "SELECT * FROM tab1 WHERE a > 34 GROUP BY tab1.b ORDER BY tab1.a, 2";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals(2, plainSelect.getOrderByElements().size());
assertEquals("a", ((Column) ((OrderByElement) plainSelect.getOrderByElements().get(0)).getExpression()).getColumnName());
assertEquals(2, ((LongValue) ((OrderByElement) plainSelect.getOrderByElements().get(1)).getExpression()).getValue());
assertEquals(statement, "" + plainSelect);
}
@Test
public void testTimestamp() throws JSQLParserException {
String statement = "SELECT * FROM tab1 WHERE a > {ts '2004-04-30 04:05:34.56'}";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals("2004-04-30 04:05:34.56", ((TimestampValue) ((GreaterThan) plainSelect.getWhere()).getRightExpression()).getValue().toString());
assertEquals(statement, "" + plainSelect);
}
@Test
public void testTime() throws JSQLParserException {
String statement = "SELECT * FROM tab1 WHERE a > {t '04:05:34'}";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals("04:05:34", (((TimeValue) ((GreaterThan) plainSelect.getWhere()).getRightExpression()).getValue()).toString());
assertEquals(statement, "" + plainSelect);
}
@Test
public void testCase() throws JSQLParserException {
String statement = "SELECT a, CASE b WHEN 1 THEN 2 END FROM tab1";
Statement parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
statement = "SELECT a, (CASE WHEN (a > 2) THEN 3 END) AS b FROM tab1";
parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
statement = "SELECT a, (CASE WHEN a > 2 THEN 3 ELSE 4 END) AS b FROM tab1";
parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
statement = "SELECT a, (CASE b WHEN 1 THEN 2 WHEN 3 THEN 4 ELSE 5 END) FROM tab1";
parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
statement = "SELECT a, (CASE "
+ "WHEN b > 1 THEN 'BBB' "
+ "WHEN a = 3 THEN 'AAA' "
+ "END) FROM tab1";
parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
statement = "SELECT a, (CASE "
+ "WHEN b > 1 THEN 'BBB' "
+ "WHEN a = 3 THEN 'AAA' "
+ "END) FROM tab1 "
+ "WHERE c = (CASE "
+ "WHEN d <> 3 THEN 5 "
+ "ELSE 10 "
+ "END)";
parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
statement = "SELECT a, CASE a "
+ "WHEN 'b' THEN 'BBB' "
+ "WHEN 'a' THEN 'AAA' "
+ "END AS b FROM tab1";
parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
statement = "SELECT a FROM tab1 WHERE CASE b WHEN 1 THEN 2 WHEN 3 THEN 4 ELSE 5 END > 34";
parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
statement = "SELECT a FROM tab1 WHERE CASE b WHEN 1 THEN 2 + 3 ELSE 4 END > 34";
parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
statement = "SELECT a, (CASE "
+ "WHEN (CASE a WHEN 1 THEN 10 ELSE 20 END) > 15 THEN 'BBB' "
+ // "WHEN (SELECT c FROM tab2 WHERE d = 2) = 3 THEN 'AAA' " +
"END) FROM tab1";
parsed = parserManager.parse(new StringReader(statement));
//System.out.println(""+statement);
//System.out.println(""+parsed);
assertEquals(statement, "" + parsed);
}
@Test
public void testReplaceAsFunction() throws JSQLParserException {
String statement = "SELECT REPLACE(a, 'b', c) FROM tab1";
Statement parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
}
@Test
public void testLike() throws JSQLParserException {
String statement = "SELECT * FROM tab1 WHERE a LIKE 'test'";
PlainSelect plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals("test", (((StringValue) ((LikeExpression) plainSelect.getWhere()).getRightExpression()).getValue()).toString());
assertEquals(statement, "" + plainSelect);
statement = "SELECT * FROM tab1 WHERE a LIKE 'test' ESCAPE 'test2'";
plainSelect = (PlainSelect) ((Select) parserManager.parse(new StringReader(statement))).getSelectBody();
assertEquals("test", (((StringValue) ((LikeExpression) plainSelect.getWhere()).getRightExpression()).getValue()).toString());
assertEquals("test2", (((LikeExpression) plainSelect.getWhere()).getEscape()));
assertEquals(statement, "" + plainSelect);
}
@Test
public void testSelectOrderHaving() throws JSQLParserException {
String statement = "SELECT units, count(units) AS num FROM currency GROUP BY units HAVING count(units) > 1 ORDER BY num";
Statement parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
}
@Test
public void testDouble() throws JSQLParserException {
String statement = "SELECT 1e2, * FROM mytable WHERE mytable.col = 9";
Select select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(1e2, ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()).getSelectItems().get(0)).getExpression()).getValue(), 0);
statement = "SELECT * FROM mytable WHERE mytable.col = 1.e2";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(1e2, ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()).getWhere()).getRightExpression()).getValue(), 0);
statement = "SELECT * FROM mytable WHERE mytable.col = 1.2e2";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(1.2e2, ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()).getWhere()).getRightExpression()).getValue(), 0);
statement = "SELECT * FROM mytable WHERE mytable.col = 2e2";
select = (Select) parserManager.parse(new StringReader(statement));
assertEquals(2e2, ((DoubleValue) ((BinaryExpression) ((PlainSelect) select.getSelectBody()).getWhere()).getRightExpression()).getValue(), 0);
}
@Test
public void testWith() throws JSQLParserException {
String statement = "WITH DINFO (DEPTNO, AVGSALARY, EMPCOUNT) AS "
+ "(SELECT OTHERS.WORKDEPT, AVG(OTHERS.SALARY), COUNT(*) FROM EMPLOYEE AS OTHERS "
+ "GROUP BY OTHERS.WORKDEPT), DINFOMAX AS (SELECT MAX(AVGSALARY) AS AVGMAX FROM DINFO) "
+ "SELECT THIS_EMP.EMPNO, THIS_EMP.SALARY, DINFO.AVGSALARY, DINFO.EMPCOUNT, DINFOMAX.AVGMAX "
+ "FROM EMPLOYEE AS THIS_EMP INNER JOIN DINFO INNER JOIN DINFOMAX "
+ "WHERE THIS_EMP.JOB = 'SALESREP' AND THIS_EMP.WORKDEPT = DINFO.DEPTNO";
Select select = (Select) parserManager.parse(new StringReader(statement));
Statement parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
}
@Test
public void testSelectAliasInQuotes() throws JSQLParserException {
String statement = "SELECT mycolumn AS \"My Column Name\" FROM mytable";
Statement parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
}
@Test
public void testSelectJoinWithComma() throws JSQLParserException {
String statement = "SELECT cb.Genus, cb.Species FROM Coleccion_de_Briofitas AS cb, unigeoestados AS es "
+ "WHERE es.nombre = \"Tamaulipas\" AND cb.the_geom = es.geom";
Statement parsed = parserManager.parse(new StringReader(statement));
assertEquals(statement, "" + parsed);
}
@Test
public void testDeparser() throws JSQLParserException {
String statement = "SELECT a.OWNERLASTNAME, a.OWNERFIRSTNAME "
+ "FROM ANTIQUEOWNERS AS a, ANTIQUES AS b "
+ "WHERE b.BUYERID = a.OWNERID AND b.ITEM = 'Chair'";
Statement parsed = parserManager.parse(new StringReader(statement));
StatementDeParser deParser = new StatementDeParser(new StringBuilder());
parsed.accept(deParser);
assertEquals(statement.toLowerCase(), deParser.getBuffer().toString().replaceAll("[\r\n]+", "").toLowerCase());
statement = "SELECT count(DISTINCT f + 4) FROM a";
parsed = parserManager.parse(new StringReader(statement));
deParser = new StatementDeParser(new StringBuilder());
parsed.accept(deParser);
assertEquals(statement.toLowerCase(), parsed.toString().replaceAll("[\r\n]+", "").toLowerCase());
assertEquals(statement.toLowerCase(), deParser.getBuffer().toString().replaceAll("[\r\n]+", "").toLowerCase());
statement = "SELECT count(DISTINCT f, g, h) FROM a";
parsed = parserManager.parse(new StringReader(statement));
deParser = new StatementDeParser(new StringBuilder());
parsed.accept(deParser);
assertEquals(statement.toLowerCase(), parsed.toString().replaceAll("[\r\n]+", "").toLowerCase());
assertEquals(statement.toLowerCase(), deParser.getBuffer().toString().replaceAll("[\r\n]+", "").toLowerCase());
}
@Test
public void testMysqlQuote() throws JSQLParserException {
String statement = "SELECT `a.OWNERLASTNAME`, `OWNERFIRSTNAME` "
+ "FROM `ANTIQUEOWNERS` AS a, ANTIQUES AS b "
+ "WHERE b.BUYERID = a.OWNERID AND b.ITEM = 'Chair'";
Statement parsed = parserManager.parse(new StringReader(statement));
StatementDeParser deParser = new StatementDeParser(new StringBuilder());
parsed.accept(deParser);
assertEquals(statement, parsed.toString());
assertEquals(statement.toLowerCase(), deParser.getBuffer().toString().replaceAll("[\r\n]+", "").toLowerCase());
}
@Test
public void testConcat() throws JSQLParserException {
String statement = "SELECT a || b || c + 4 FROM t";
Statement parsed = parserManager.parse(new StringReader(statement));
StatementDeParser deParser = new StatementDeParser(new StringBuilder());
parsed.accept(deParser);
assertEquals(statement, parsed.toString());
assertEquals(statement.toLowerCase(), deParser.getBuffer().toString().replaceAll("[\r\n]+", "").toLowerCase());
}
@Test
public void testMatches() throws JSQLParserException {
String statement = "SELECT * FROM team WHERE team.search_column @@ to_tsquery('new & york & yankees')";
Statement parsed = parserManager.parse(new StringReader(statement));
StatementDeParser deParser = new StatementDeParser(new StringBuilder());
parsed.accept(deParser);
assertEquals(statement, parsed.toString());
assertEquals(statement.toLowerCase(), deParser.getBuffer().toString().replaceAll("[\r\n]+", "").toLowerCase());
}
@Test
public void testGroupByExpression() throws JSQLParserException {
String statement =
"SELECT col1, col2, col1 + col2, sum(col8)"
+ " FROM table1 "
+ "GROUP BY col1, col2, col1 + col2";
Statement parsed = parserManager.parse(new StringReader(statement));
StatementDeParser deParser = new StatementDeParser(new StringBuilder());
parsed.accept(deParser);
assertEquals(statement, parsed.toString());
assertEquals(statement.toLowerCase(), deParser.getBuffer().toString().replaceAll("[\r\n]+", "").toLowerCase());
}
@Test
public void testBitwise() throws JSQLParserException {
String statement =
"SELECT col1 & 32, col2 ^ col1, col1 | col2"
+ " FROM table1";
Statement parsed = parserManager.parse(new StringReader(statement));
StatementDeParser deParser = new StatementDeParser(new StringBuilder());
parsed.accept(deParser);
assertEquals(statement, parsed.toString());
assertEquals(statement.toLowerCase(), deParser.getBuffer().toString().replaceAll("[\r\n]+", "").toLowerCase());
}
}