diff --git a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java index d83af31f1..d09318f6e 100644 --- a/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java +++ b/src/main/java/net/sf/jsqlparser/expression/ExpressionVisitor.java @@ -5,16 +5,16 @@ * Copyright (C) 2004 - 2013 JSQLParser * %% * This program 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 + * 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 program 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 General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public + * + * You should have received a copy of the GNU General Lesser Public * License along with this program. If not, see * . * #L% @@ -54,11 +54,11 @@ public interface ExpressionVisitor { void visit(Function function); - void visit(InverseExpression inverseExpression); + void visit(SignedExpression signedExpression); void visit(JdbcParameter jdbcParameter); - - void visit(JdbcNamedParameter jdbcNamedParameter); + + void visit(JdbcNamedParameter jdbcNamedParameter); void visit(DoubleValue doubleValue); @@ -137,10 +137,10 @@ public interface ExpressionVisitor { void visit(AnalyticExpression aexpr); void visit(ExtractExpression eexpr); - + void visit(IntervalExpression iexpr); - + void visit(OracleHierarchicalExpression oexpr); - + void visit(RegExpMatchOperator rexpr); } diff --git a/src/main/java/net/sf/jsqlparser/expression/InverseExpression.java b/src/main/java/net/sf/jsqlparser/expression/SignedExpression.java similarity index 64% rename from src/main/java/net/sf/jsqlparser/expression/InverseExpression.java rename to src/main/java/net/sf/jsqlparser/expression/SignedExpression.java index 7a71afd28..a1fa5b3d4 100644 --- a/src/main/java/net/sf/jsqlparser/expression/InverseExpression.java +++ b/src/main/java/net/sf/jsqlparser/expression/SignedExpression.java @@ -5,16 +5,16 @@ * Copyright (C) 2004 - 2013 JSQLParser * %% * This program 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 + * 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 program 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 General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public + * + * You should have received a copy of the GNU General Lesser Public * License along with this program. If not, see * . * #L% @@ -22,20 +22,27 @@ package net.sf.jsqlparser.expression; /** - * It represents a "-" before an expression + * It represents a "-" or "+" before an expression */ -public class InverseExpression implements Expression { +public class SignedExpression implements Expression { - private Expression expression; + private char sign; + private Expression expression; - public InverseExpression() { + public SignedExpression(char sign, Expression expression) { + this.sign = sign; + setExpression(expression); } - public InverseExpression(Expression expression) { - setExpression(expression); - } + public char getSign() { + return sign; + } + + public void setSign(char sign) { + this.sign = sign; + } - public Expression getExpression() { + public Expression getExpression() { return expression; } @@ -47,4 +54,9 @@ public final void setExpression(Expression expression) { public void accept(ExpressionVisitor expressionVisitor) { expressionVisitor.visit(this); } + + @Override + public String toString() { + return getSign() + expression.toString(); + } } diff --git a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java index bd7d73ad5..7d69b9f98 100644 --- a/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java +++ b/src/main/java/net/sf/jsqlparser/util/TablesNamesFinder.java @@ -5,93 +5,38 @@ * Copyright (C) 2004 - 2013 JSQLParser * %% * This program 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 + * 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 program 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 General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public + * + * You should have received a copy of the GNU General Lesser Public * License along with this program. If not, see * . * #L% */ package net.sf.jsqlparser.util; -import java.util.ArrayList; -import java.util.List; -import net.sf.jsqlparser.expression.AllComparisonExpression; -import net.sf.jsqlparser.expression.AnalyticExpression; -import net.sf.jsqlparser.expression.AnyComparisonExpression; -import net.sf.jsqlparser.expression.BinaryExpression; -import net.sf.jsqlparser.expression.CaseExpression; -import net.sf.jsqlparser.expression.CastExpression; -import net.sf.jsqlparser.expression.DateValue; -import net.sf.jsqlparser.expression.DoubleValue; -import net.sf.jsqlparser.expression.Expression; -import net.sf.jsqlparser.expression.ExpressionVisitor; -import net.sf.jsqlparser.expression.ExtractExpression; -import net.sf.jsqlparser.expression.Function; -import net.sf.jsqlparser.expression.IntervalExpression; -import net.sf.jsqlparser.expression.InverseExpression; -import net.sf.jsqlparser.expression.JdbcNamedParameter; -import net.sf.jsqlparser.expression.JdbcParameter; -import net.sf.jsqlparser.expression.LongValue; -import net.sf.jsqlparser.expression.NullValue; -import net.sf.jsqlparser.expression.OracleHierarchicalExpression; -import net.sf.jsqlparser.expression.Parenthesis; -import net.sf.jsqlparser.expression.StringValue; -import net.sf.jsqlparser.expression.TimeValue; -import net.sf.jsqlparser.expression.TimestampValue; -import net.sf.jsqlparser.expression.WhenClause; -import net.sf.jsqlparser.expression.operators.arithmetic.Addition; -import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseAnd; -import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseOr; -import net.sf.jsqlparser.expression.operators.arithmetic.BitwiseXor; -import net.sf.jsqlparser.expression.operators.arithmetic.Concat; -import net.sf.jsqlparser.expression.operators.arithmetic.Division; -import net.sf.jsqlparser.expression.operators.arithmetic.Modulo; -import net.sf.jsqlparser.expression.operators.arithmetic.Multiplication; -import net.sf.jsqlparser.expression.operators.arithmetic.Subtraction; +import net.sf.jsqlparser.expression.*; +import net.sf.jsqlparser.expression.operators.arithmetic.*; import net.sf.jsqlparser.expression.operators.conditional.AndExpression; import net.sf.jsqlparser.expression.operators.conditional.OrExpression; -import net.sf.jsqlparser.expression.operators.relational.Between; -import net.sf.jsqlparser.expression.operators.relational.EqualsTo; -import net.sf.jsqlparser.expression.operators.relational.ExistsExpression; -import net.sf.jsqlparser.expression.operators.relational.ExpressionList; -import net.sf.jsqlparser.expression.operators.relational.GreaterThan; -import net.sf.jsqlparser.expression.operators.relational.GreaterThanEquals; -import net.sf.jsqlparser.expression.operators.relational.InExpression; -import net.sf.jsqlparser.expression.operators.relational.IsNullExpression; -import net.sf.jsqlparser.expression.operators.relational.ItemsListVisitor; -import net.sf.jsqlparser.expression.operators.relational.LikeExpression; -import net.sf.jsqlparser.expression.operators.relational.Matches; -import net.sf.jsqlparser.expression.operators.relational.MinorThan; -import net.sf.jsqlparser.expression.operators.relational.MinorThanEquals; -import net.sf.jsqlparser.expression.operators.relational.MultiExpressionList; -import net.sf.jsqlparser.expression.operators.relational.NotEqualsTo; -import net.sf.jsqlparser.expression.operators.relational.RegExpMatchOperator; +import net.sf.jsqlparser.expression.operators.relational.*; import net.sf.jsqlparser.schema.Column; import net.sf.jsqlparser.schema.Table; import net.sf.jsqlparser.statement.delete.Delete; import net.sf.jsqlparser.statement.insert.Insert; import net.sf.jsqlparser.statement.replace.Replace; -import net.sf.jsqlparser.statement.select.FromItemVisitor; -import net.sf.jsqlparser.statement.select.Join; -import net.sf.jsqlparser.statement.select.LateralSubSelect; -import net.sf.jsqlparser.statement.select.PlainSelect; -import net.sf.jsqlparser.statement.select.Select; -import net.sf.jsqlparser.statement.select.SelectVisitor; -import net.sf.jsqlparser.statement.select.SetOperationList; -import net.sf.jsqlparser.statement.select.SubJoin; -import net.sf.jsqlparser.statement.select.SubSelect; -import net.sf.jsqlparser.statement.select.ValuesList; -import net.sf.jsqlparser.statement.select.WithItem; +import net.sf.jsqlparser.statement.select.*; import net.sf.jsqlparser.statement.update.Update; +import java.util.ArrayList; +import java.util.List; + /** * Find all used tables within an select statement. */ @@ -297,8 +242,8 @@ public void visit(InExpression inExpression) { } @Override - public void visit(InverseExpression inverseExpression) { - inverseExpression.getExpression().accept(this); + public void visit(SignedExpression signedExpression) { + signedExpression.getExpression().accept(this); } @Override @@ -393,7 +338,7 @@ public void visit(TimeValue timeValue) { /* * (non-Javadoc) - * + * * @see net.sf.jsqlparser.expression.ExpressionVisitor#visit(net.sf.jsqlparser.expression.CaseExpression) */ @Override @@ -402,7 +347,7 @@ public void visit(CaseExpression caseExpression) { /* * (non-Javadoc) - * + * * @see net.sf.jsqlparser.expression.ExpressionVisitor#visit(net.sf.jsqlparser.expression.WhenClause) */ @Override diff --git a/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java b/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java index 4f9c9919b..a2978c73d 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java @@ -5,16 +5,16 @@ * Copyright (C) 2004 - 2013 JSQLParser * %% * This program 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 + * 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 program 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 General Lesser Public License for more details. - * - * You should have received a copy of the GNU General Lesser Public + * + * You should have received a copy of the GNU General Lesser Public * License along with this program. If not, see * . * #L% @@ -159,9 +159,9 @@ public void visit(InExpression inExpression) { } @Override - public void visit(InverseExpression inverseExpression) { - buffer.append("-"); - inverseExpression.getExpression().accept(this); + public void visit(SignedExpression signedExpression) { + buffer.append(signedExpression.getSign()); + signedExpression.getExpression().accept(this); } @Override diff --git a/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj b/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj index 45c6ea452..0015d01c5 100644 --- a/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj +++ b/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj @@ -369,7 +369,7 @@ Insert Insert(): [LOOKAHEAD(2) "(" ] ( { insert.setUseValues(false); } - itemsList = SubSelect() + itemsList= SubSelect() ) [ ")" ] ) @@ -419,7 +419,7 @@ Column Column(): } else { table = new Table(null, null); colName = name1; - } + } return new Column(table, colName); } @@ -1585,7 +1585,7 @@ Expression PrimaryExpression(): Expression retval = null; CastExpression castExpr = null; Token token = null; - boolean isInverse = false; + Token sign = null; String tmp = ""; ColDataType type = null; } @@ -1603,27 +1603,28 @@ Expression PrimaryExpression(): | LOOKAHEAD(ExtractExpression()) retval=ExtractExpression() - | LOOKAHEAD([ "+" | "-"] Function()) [ "+" | "-" { isInverse = true; }] retval=Function() + | LOOKAHEAD(["+" | "-"] Function()) [sign="+" | sign="-"] retval=Function() - | LOOKAHEAD([ "+" | "-"] ) [ "+" | "-" { tmp = "-"; }] token= { retval = new DoubleValue(tmp+token.image); } + | LOOKAHEAD(["+" | "-"] ) [sign="+" | sign="-"] token= { retval = new DoubleValue(token.image); } - | LOOKAHEAD([ "+" | "-"] ) [ "+" | "-" { tmp = "-"; }] token= { retval = new LongValue(tmp+token.image); } + | LOOKAHEAD(["+" | "-"] ) [sign="+" | sign="-"] token= { retval = new LongValue(token.image); } - | LOOKAHEAD(CastExpression()) [ "+" | "-" { isInverse = true; }] retval=CastExpression() + | LOOKAHEAD(["+" | "-"] CastExpression()) [sign="+" | sign="-"] retval=CastExpression() - | LOOKAHEAD(Column()) [ "+" | "-" { isInverse = true; }] retval=Column() + | LOOKAHEAD(["+" | "-"] Column()) [sign="+" | sign="-"] retval=Column() - | LOOKAHEAD(2) [ "+" | "-" { isInverse = true; }] "(" retval=PrimaryExpression() ")" {retval = new Parenthesis(retval); } + | LOOKAHEAD(2) [sign="+" | sign="-"] "(" retval=PrimaryExpression() ")" {retval = new Parenthesis(retval); } + + | [sign="+" | sign="-"] "(" retval=SubSelect() ")" | token= { retval = new StringValue(token.image); } - | [ "+" | "-" { isInverse = true; }] "(" retval=SubSelect() ")" - | "{d" token= "}" { retval = new DateValue(token.image); } + | "{d" token= "}" { retval = new DateValue(token.image); } - | "{t" token= "}" { retval = new TimeValue(token.image); } + | "{t" token= "}" { retval = new TimeValue(token.image); } - | "{ts" token= "}" { retval = new TimestampValue(token.image); } + | "{ts" token= "}" { retval = new TimestampValue(token.image); } | retval = IntervalExpression() ) @@ -1637,8 +1638,8 @@ Expression PrimaryExpression(): } ] { - if (isInverse) { - retval = new InverseExpression(retval); + if (sign != null) { + retval = new SignedExpression(sign.image.charAt(0), retval); } return retval; } diff --git a/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java b/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java index 3b78154e9..a8d7cf191 100644 --- a/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java @@ -19,7 +19,6 @@ import java.io.IOException; import java.io.StringReader; -import static junit.framework.Assert.assertEquals; import static net.sf.jsqlparser.test.TestUtils.*; @@ -31,7 +30,35 @@ public SelectTest(String arg0) { super(arg0); } - public void testLimit() throws JSQLParserException { + public void testSimpleSigns() throws Exception { + final String statement = "SELECT +1, -1 FROM tableName"; + Select select = (Select) parserManager.parse(new StringReader(statement)); + + assertStatementCanBeDeparsedAs(select, statement); + } + + public void testSimpleAdditionsAndSubtractions() throws Exception { + final String statement = "SELECT 1 - 1, 1 + 1, -1 - 1, -1 + 1, +1 + 1, +1 - 1 FROM tableName"; + Select select = (Select) parserManager.parse(new StringReader(statement)); + + assertStatementCanBeDeparsedAs(select, statement); + } + + public void testSignedColumns() throws Exception { + final String statement = "SELECT -columnName, +columnName, +(columnName), -(columnName) FROM tableName"; + Select select = (Select) parserManager.parse(new StringReader(statement)); + + assertStatementCanBeDeparsedAs(select, statement); + } + + public void testSigns() throws Exception { + final String statement = "SELECT (-(1)), -(1), (-(columnName)), -(columnName), (-1), -1, (-columnName), -columnName FROM tableName"; + Select select = (Select) parserManager.parse(new StringReader(statement)); + + assertStatementCanBeDeparsedAs(select, statement); + } + + public void testLimit() throws JSQLParserException { String statement = "SELECT * FROM mytable WHERE mytable.col = 9 LIMIT 3, ?"; Select select = (Select) parserManager.parse(new StringReader(statement)); @@ -436,11 +463,11 @@ public void testCase() throws JSQLParserException { public void testReplaceAsFunction() throws JSQLParserException { String statement = "SELECT REPLACE(a, 'b', c) FROM tab1"; assertSqlCanBeParsedAndDeparsed(statement); - + Statement stmt = CCJSqlParserUtil.parse(statement); Select select = (Select) stmt; PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); - + assertEquals(1,plainSelect.getSelectItems().size()); Expression expression = ((SelectExpressionItem)plainSelect.getSelectItems().get(0)).getExpression(); assertTrue(expression instanceof Function); @@ -503,7 +530,7 @@ public void testDouble() throws JSQLParserException { .getRightExpression()).getValue(), 0); assertStatementCanBeDeparsedAs(select, statement); } - + public void testDouble2() throws JSQLParserException { String statement = "SELECT 1.e22 FROM mytable"; Select select = (Select) parserManager.parse(new StringReader(statement)); @@ -511,7 +538,7 @@ public void testDouble2() throws JSQLParserException { assertEquals(1e22, ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) .getSelectItems().get(0)).getExpression()).getValue(), 0); } - + public void testDouble3() throws JSQLParserException { String statement = "SELECT 1. FROM mytable"; Select select = (Select) parserManager.parse(new StringReader(statement)); @@ -519,7 +546,7 @@ public void testDouble3() throws JSQLParserException { assertEquals(1.0, ((DoubleValue) ((SelectExpressionItem) ((PlainSelect) select.getSelectBody()) .getSelectItems().get(0)).getExpression()).getValue(), 0); } - + public void testDouble4() throws JSQLParserException { String statement = "SELECT 1.2e22 FROM mytable"; Select select = (Select) parserManager.parse(new StringReader(statement)); @@ -542,7 +569,7 @@ public void testSelectAliasInQuotes() throws JSQLParserException { String statement = "SELECT mycolumn AS \"My Column Name\" FROM mytable"; assertSqlCanBeParsedAndDeparsed(statement); } - + public void testSelectAliasWithoutAs() throws JSQLParserException { String statement = "SELECT mycolumn \"My Column Name\" FROM mytable"; assertSqlCanBeParsedAndDeparsed(statement); @@ -585,47 +612,47 @@ public void testConcatProblem2() throws JSQLParserException { ") || (SPA.GESLACHT)::VARCHAR (1))) AS GESLACHT_TMP FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testConcatProblem2_1() throws JSQLParserException { String stmt = "SELECT TO_CHAR(SPA.AANLEVERPERIODEVOLGNR, 'FM09'::VARCHAR) FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testConcatProblem2_2() throws JSQLParserException { String stmt = "SELECT MAX((SPA.SOORTAANLEVERPERIODE)::VARCHAR (2) || (VARCHAR(SPA.AANLEVERPERIODEJAAR))::VARCHAR (4)) AS GESLACHT_TMP FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testConcatProblem2_3() throws JSQLParserException { String stmt = "SELECT TO_CHAR((10000 - SPA.VERSCHIJNINGSVOLGNR), 'FM0999'::VARCHAR) FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testConcatProblem2_4() throws JSQLParserException { String stmt = "SELECT (SPA.GESLACHT)::VARCHAR (1) FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testConcatProblem2_5() throws JSQLParserException { String stmt = "SELECT max((a || b) || c) FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testConcatProblem2_5_1() throws JSQLParserException { String stmt = "SELECT (a || b) || c FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testConcatProblem2_5_2() throws JSQLParserException { String stmt = "SELECT (a + b) + c FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testConcatProblem2_6() throws JSQLParserException { String stmt = "SELECT max(a || b || c) FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testMatches() throws JSQLParserException { String statement = "SELECT * FROM team WHERE team.search_column @@ to_tsquery('new & york & yankees')"; assertSqlCanBeParsedAndDeparsed(statement); @@ -668,37 +695,37 @@ public void testCastInCast2() throws JSQLParserException { String stmt = "SELECT CAST('test' + CAST(assertEqual AS numeric) AS varchar) FROM tabelle1"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testCastTypeProblem() throws JSQLParserException { String stmt = "SELECT CAST(col1 AS varchar (256)) FROM tabelle1"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testCastTypeProblem2() throws JSQLParserException { String stmt = "SELECT col1::varchar FROM tabelle1"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testCastTypeProblem3() throws JSQLParserException { String stmt = "SELECT col1::varchar (256) FROM tabelle1"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testCastTypeProblem4() throws JSQLParserException { String stmt = "SELECT 5::varchar (256) FROM tabelle1"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testCastTypeProblem5() throws JSQLParserException { String stmt = "SELECT 5.67::varchar (256) FROM tabelle1"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testCastTypeProblem6() throws JSQLParserException { String stmt = "SELECT 'test'::character varying FROM tabelle1"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testCastTypeProblem7() throws JSQLParserException { String stmt = "SELECT CAST('test' AS character varying) FROM tabelle1"; assertSqlCanBeParsedAndDeparsed(stmt); @@ -785,7 +812,7 @@ public void testProblemSqlAnalytic8Complex() throws JSQLParserException { String stmt = "SELECT ID, NAME, SALARY, SUM(SALARY) OVER () AS SUM_SAL, AVG(SALARY) OVER () AS AVG_SAL, MIN(SALARY) OVER () AS MIN_SAL, MAX(SALARY) OVER () AS MAX_SAL, COUNT(*) OVER () AS ROWS FROM STAFF WHERE ID < 60 ORDER BY ID"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testProblemSqlAnalytic9CommaListPartition() throws JSQLParserException { String stmt = "SELECT a, row_number() OVER (PARTITION BY c, d ORDER BY a, b) AS n FROM table1"; assertSqlCanBeParsedAndDeparsed(stmt); @@ -815,7 +842,7 @@ public void testOracleJoin3() throws JSQLParserException { String stmt = "SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.a(+) > tabelle2.b"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testOracleJoin3_1() throws JSQLParserException { String stmt = "SELECT * FROM tabelle1, tabelle2 WHERE tabelle1.a > tabelle2.b(+)"; assertSqlCanBeParsedAndDeparsed(stmt); @@ -897,12 +924,12 @@ public void testExtractFrom2() throws JSQLParserException { String stmt = "SELECT EXTRACT(year FROM now()) FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testExtractFrom3() throws JSQLParserException { String stmt = "SELECT EXTRACT(year FROM (now() - 2)) FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testExtractFrom4() throws JSQLParserException { String stmt = "SELECT EXTRACT(minutes FROM now() - '01:22:00') FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); @@ -924,7 +951,7 @@ public void testProblemFunction2() throws JSQLParserException { String stmt = "SELECT sysdate FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testProblemFunction3() throws JSQLParserException { String stmt = "SELECT TRUNCATE(col) FROM testtable"; assertSqlCanBeParsedAndDeparsed(stmt); @@ -945,7 +972,7 @@ public void testMultiTableJoin() throws JSQLParserException { String stmt = "SELECT * FROM taba INNER JOIN tabb ON taba.a = tabb.a, tabc LEFT JOIN tabd ON tabc.c = tabd.c"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testTableCrossJoin() throws JSQLParserException { String stmt = "SELECT * FROM taba CROSS JOIN tabb"; assertSqlCanBeParsedAndDeparsed(stmt); @@ -991,45 +1018,45 @@ public void testValues6BothVariants() throws JSQLParserException { String stmt = "SELECT I FROM (VALUES 1, 2, 3) AS MY_TEMP_TABLE(I) WHERE I IN (SELECT * FROM (VALUES 1, 2) AS TEST)"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testInterval1() throws JSQLParserException { String stmt = "SELECT 5 + INTERVAL '3 days'"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testInterval2() throws JSQLParserException { String stmt = "SELECT to_timestamp(to_char(now() - INTERVAL '45 MINUTE', 'YYYY-MM-DD-HH24:')) AS START_TIME FROM tab1"; assertSqlCanBeParsedAndDeparsed(stmt); - + Statement st = CCJSqlParserUtil.parse(stmt); Select select = (Select) st; PlainSelect plainSelect = (PlainSelect) select.getSelectBody(); - + assertEquals(1, plainSelect.getSelectItems().size()); SelectExpressionItem item = (SelectExpressionItem) plainSelect.getSelectItems().get(0); Function function = (Function)item.getExpression(); - + assertEquals("to_timestamp", function.getName()); - + assertEquals(1, function.getParameters().getExpressions().size()); - + Function func2 = (Function) function.getParameters().getExpressions().get(0); - + assertEquals("to_char", func2.getName()); - + assertEquals(2, func2.getParameters().getExpressions().size()); Subtraction sub = (Subtraction) func2.getParameters().getExpressions().get(0); assertTrue(sub.getRightExpression() instanceof IntervalExpression); IntervalExpression iexpr = (IntervalExpression) sub.getRightExpression(); - + assertEquals("'45 MINUTE'", iexpr.getParameter()); } - + public void testMultiValueIn() throws JSQLParserException { String stmt = "SELECT * FROM mytable WHERE (a, b, c) IN (SELECT a, b, c FROM mytable2)"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testMultiValueIn2() throws JSQLParserException { String stmt = "SELECT * FROM mytable WHERE (trim(a), trim(b)) IN (SELECT a, b FROM mytable2)"; assertSqlCanBeParsedAndDeparsed(stmt); @@ -1084,12 +1111,12 @@ public void testRegexpLike2() throws JSQLParserException { String stmt = "SELECT CASE WHEN REGEXP_LIKE(first_name, '^Ste(v|ph)en$') THEN 1 ELSE 2 END FROM mytable"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testBooleanFunction1() throws JSQLParserException { String stmt = "SELECT * FROM mytable WHERE test_func(col1)"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testNamedParameter() throws JSQLParserException { String stmt = "SELECT * FROM mytable WHERE b = :param"; assertSqlCanBeParsedAndDeparsed(stmt); @@ -1101,9 +1128,9 @@ public void testNamedParameter() throws JSQLParserException { assertTrue(exp instanceof JdbcNamedParameter); JdbcNamedParameter namedParameter = (JdbcNamedParameter) exp; assertEquals("param", namedParameter.getName()); - + } - + public void testNamedParameter2() throws JSQLParserException { String stmt = "SELECT * FROM mytable WHERE a = :param OR a = :param2 AND b = :param3"; assertSqlCanBeParsedAndDeparsed(stmt); @@ -1116,59 +1143,59 @@ public void testNamedParameter2() throws JSQLParserException { Expression exp_r = ((BinaryExpression) plainSelect.getWhere()).getRightExpression(); Expression exp_rl = ((BinaryExpression) exp_r).getLeftExpression(); Expression exp_rr = ((BinaryExpression) exp_r).getRightExpression(); - + Expression exp_param1 = ((BinaryExpression) exp_l).getRightExpression(); Expression exp_param2 = ((BinaryExpression) exp_rl).getRightExpression(); Expression exp_param3 = ((BinaryExpression) exp_rr).getRightExpression(); - + assertTrue(exp_param1 instanceof JdbcNamedParameter); assertTrue(exp_param2 instanceof JdbcNamedParameter); assertTrue(exp_param3 instanceof JdbcNamedParameter); - + JdbcNamedParameter namedParameter1 = (JdbcNamedParameter) exp_param1; JdbcNamedParameter namedParameter2 = (JdbcNamedParameter) exp_param2; JdbcNamedParameter namedParameter3 = (JdbcNamedParameter) exp_param3; - + assertEquals("param", namedParameter1.getName()); assertEquals("param2", namedParameter2.getName()); assertEquals("param3", namedParameter3.getName()); } - + public void testComplexUnion1() throws IOException, JSQLParserException { String stmt = "(SELECT 'abc-' || coalesce(mytab.a::varchar, '') AS a, mytab.b, mytab.c AS st, mytab.d, mytab.e FROM mytab WHERE mytab.del = 0) UNION (SELECT 'cde-' || coalesce(mytab2.a::varchar, '') AS a, mytab2.b, mytab2.bezeichnung AS c, 0 AS d, 0 AS e FROM mytab2 WHERE mytab2.del = 0)"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testOracleHierarchicalQuery() throws JSQLParserException { String stmt= "SELECT last_name, employee_id, manager_id FROM employees CONNECT BY employee_id = manager_id ORDER BY last_name"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testOracleHierarchicalQuery2() throws JSQLParserException { String stmt= "SELECT employee_id, last_name, manager_id FROM employees CONNECT BY PRIOR employee_id = manager_id"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testOracleHierarchicalQuery3() throws JSQLParserException { String stmt= "SELECT last_name, employee_id, manager_id, LEVEL FROM employees START WITH employee_id = 100 CONNECT BY PRIOR employee_id = manager_id ORDER SIBLINGS BY last_name"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testPostgreSQLRegExpCaseSensitiveMatch() throws JSQLParserException { String stmt= "SELECT a, b FROM foo WHERE a ~ '[help].*'"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testPostgreSQLRegExpCaseSensitiveMatch2() throws JSQLParserException { String stmt= "SELECT a, b FROM foo WHERE a ~* '[help].*'"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testPostgreSQLRegExpCaseSensitiveMatch3() throws JSQLParserException { String stmt= "SELECT a, b FROM foo WHERE a !~ '[help].*'"; assertSqlCanBeParsedAndDeparsed(stmt); } - + public void testPostgreSQLRegExpCaseSensitiveMatch4() throws JSQLParserException { String stmt= "SELECT a, b FROM foo WHERE a !~* '[help].*'"; assertSqlCanBeParsedAndDeparsed(stmt);