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 970eddf18..d2c418519 100644 --- a/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java +++ b/src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java @@ -292,7 +292,7 @@ public void visit(StringValue stringValue) { @Override public void visit(Subtraction subtraction) { - visitBinaryExpression(subtraction, "-"); + visitBinaryExpression(subtraction, " - "); } diff --git a/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj b/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj index 89c6943a0..848d90993 100644 --- a/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj +++ b/src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj @@ -1434,7 +1434,7 @@ Expression MultiplicativeExpression(): LOOKAHEAD(BitwiseXor()) leftExpression=BitwiseXor() | - "(" leftExpression=AdditiveExpression() ")" {leftExpression = new Parenthesis(leftExpression); } + "(" leftExpression=ConcatExpression() ")" {leftExpression = new Parenthesis(leftExpression); } ) { result = leftExpression; } ( @@ -1447,7 +1447,7 @@ Expression MultiplicativeExpression(): LOOKAHEAD(BitwiseXor()) rightExpression=BitwiseXor() | - "(" rightExpression=AdditiveExpression() ")" {rightExpression = new Parenthesis(rightExpression); } + "(" rightExpression=ConcatExpression() ")" {rightExpression = new Parenthesis(rightExpression); } ) { 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 7338fb144..509595096 100644 --- a/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java +++ b/src/test/java/net/sf/jsqlparser/test/select/SelectTest.java @@ -547,6 +547,55 @@ public void testConcat() throws JSQLParserException { assertSqlCanBeParsedAndDeparsed(statement); } + public void testConcatProblem2() throws JSQLParserException { + String stmt = "SELECT MAX(((((" + + "(SPA.SOORTAANLEVERPERIODE)::VARCHAR (2) || (VARCHAR(SPA.AANLEVERPERIODEJAAR))::VARCHAR (4)" + + ") || TO_CHAR(SPA.AANLEVERPERIODEVOLGNR, 'FM09'::VARCHAR)" + + ") || TO_CHAR((10000 - SPA.VERSCHIJNINGSVOLGNR), 'FM0999'::VARCHAR)" + + ") || (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);