Skip to content

Commit d4f744c

Browse files
committed
!= usage corrected
deparser for oracle hierarchical expressions corrected order by asc/desc corrected
1 parent 68938c7 commit d4f744c

File tree

15 files changed

+92
-34
lines changed

15 files changed

+92
-34
lines changed

src/main/java/net/sf/jsqlparser/expression/operators/relational/NotEqualsTo.java

100755100644
Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -25,13 +25,26 @@
2525

2626
public class NotEqualsTo extends OldOracleJoinBinaryExpression {
2727

28-
@Override
29-
public void accept(ExpressionVisitor expressionVisitor) {
30-
expressionVisitor.visit(this);
31-
}
28+
private final String operator;
3229

33-
@Override
34-
public String getStringExpression() {
35-
return "<>";
36-
}
30+
public NotEqualsTo() {
31+
operator = "<>";
32+
}
33+
34+
public NotEqualsTo(String operator) {
35+
this.operator = operator;
36+
if (!"!=".equals(operator) && !"<>".equals(operator)) {
37+
throw new IllegalArgumentException("only <> or != allowed");
38+
}
39+
}
40+
41+
@Override
42+
public void accept(ExpressionVisitor expressionVisitor) {
43+
expressionVisitor.visit(this);
44+
}
45+
46+
@Override
47+
public String getStringExpression() {
48+
return operator;
49+
}
3750
}

src/main/java/net/sf/jsqlparser/statement/select/OrderByElement.java

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public enum NullOrdering {
3737
private Expression expression;
3838
private boolean asc = true;
3939
private NullOrdering nullOrdering;
40+
private boolean ascDesc = false;
4041

4142
public boolean isAsc() {
4243
return asc;
@@ -53,6 +54,14 @@ public void setNullOrdering(NullOrdering nullOrdering) {
5354
public void setAsc(boolean b) {
5455
asc = b;
5556
}
57+
58+
public void setAscDescPresent(boolean b) {
59+
ascDesc = b;
60+
}
61+
62+
public boolean isAscDescPresent() {
63+
return ascDesc;
64+
}
5665

5766
public void accept(OrderByVisitor orderByVisitor) {
5867
orderByVisitor.visit(this);
@@ -70,9 +79,13 @@ public void setExpression(Expression expression) {
7079
public String toString() {
7180
StringBuilder b = new StringBuilder();
7281
b.append(expression.toString());
82+
7383
if (!asc) {
7484
b.append(" DESC");
85+
} else if (ascDesc) {
86+
b.append(" ASC");
7587
}
88+
7689
if (nullOrdering != null) {
7790
b.append(' ');
7891
b.append(nullOrdering == NullOrdering.NULLS_FIRST ? "NULLS FIRST" : "NULLS LAST");

src/main/java/net/sf/jsqlparser/util/deparser/ExpressionDeParser.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -225,7 +225,7 @@ public void visit(Multiplication multiplication) {
225225

226226
@Override
227227
public void visit(NotEqualsTo notEqualsTo) {
228-
visitOldOracleJoinBinaryExpression(notEqualsTo, " <> ");
228+
visitOldOracleJoinBinaryExpression(notEqualsTo, " " + notEqualsTo.getStringExpression() + " ");
229229

230230
}
231231

src/main/java/net/sf/jsqlparser/util/deparser/SelectDeParser.java

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -92,14 +92,14 @@ public void visit(PlainSelect plainSelect) {
9292
}
9393
}
9494

95-
if (plainSelect.getOracleHierarchical() != null) {
96-
plainSelect.getOracleHierarchical().accept(expressionVisitor);
97-
}
98-
9995
if (plainSelect.getWhere() != null) {
10096
buffer.append(" WHERE ");
10197
plainSelect.getWhere().accept(expressionVisitor);
10298
}
99+
100+
if (plainSelect.getOracleHierarchical() != null) {
101+
plainSelect.getOracleHierarchical().accept(expressionVisitor);
102+
}
103103

104104
if (plainSelect.getGroupByColumnReferences() != null) {
105105
buffer.append(" GROUP BY ");
@@ -132,6 +132,8 @@ public void visit(OrderByElement orderBy) {
132132
orderBy.getExpression().accept(expressionVisitor);
133133
if (!orderBy.isAsc()) {
134134
buffer.append(" DESC");
135+
} else if (orderBy.isAscDescPresent()) {
136+
buffer.append(" ASC");
135137
}
136138
if (orderBy.getNullOrdering() != null) {
137139
buffer.append(' ');

src/main/javacc/net/sf/jsqlparser/parser/JSqlParserCC.jj

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1065,7 +1065,7 @@ OrderByElement OrderByElement():
10651065
}
10661066
{
10671067
columnReference = SimpleExpression()
1068-
[<K_ASC> | (<K_DESC> { orderByElement.setAsc(false); } ) ]
1068+
[ ( <K_ASC> | (<K_DESC> { orderByElement.setAsc(false); } )) { orderByElement.setAscDescPresent(true); } ]
10691069
[<K_NULLS> (
10701070
<K_FIRST> { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_FIRST); } |
10711071
<K_LAST> { orderByElement.setNullOrdering(OrderByElement.NullOrdering.NULLS_LAST); }
@@ -1253,7 +1253,8 @@ Expression RegularCondition():
12531253
| "=" { result = new EqualsTo(); }
12541254
| ">=" { result = new GreaterThanEquals(); }
12551255
| "<=" { result = new MinorThanEquals(); }
1256-
| ("<>" | "!=") { result = new NotEqualsTo(); }
1256+
| "<>" { result = new NotEqualsTo(); }
1257+
| "!=" { result = new NotEqualsTo("!="); }
12571258
| "@@" { result = new Matches(); }
12581259
| "~" { result = new RegExpMatchOperator(RegExpMatchOperatorType.MATCH_CASESENSITIVE); }
12591260
| "~*" { result = new RegExpMatchOperator(RegExpMatchOperatorType.MATCH_CASEINSENSITIVE); }

src/test/java/net/sf/jsqlparser/test/TestUtils.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,16 +68,16 @@ public static void assertStatementCanBeDeparsedAs(Statement parsed, String state
6868

6969
public static String buildSqlString(String sql, boolean laxDeparsingCheck) {
7070
if (laxDeparsingCheck) {
71-
return sql.replaceAll("\\s", " ").replaceAll("\\s+", " ").replaceAll("\\s*([,()])\\s*", "$1").toLowerCase().trim();
71+
return sql.replaceAll("\\s", " ").replaceAll("\\s+", " ").replaceAll("\\s*([,()=+\\-*|\\]<>])\\s*", "$1").toLowerCase().trim();
7272
} else {
7373
return sql;
7474
}
7575
}
7676

7777
@Test
7878
public void testBuildSqlString() {
79-
assertEquals("select * from test", buildSqlString(" SELECT * FROM \r\n \t TEST \n", true));
80-
assertEquals("select * from test", buildSqlString("select * from test", false));
79+
assertEquals("select col from test", buildSqlString(" SELECT col FROM \r\n \t TEST \n", true));
80+
assertEquals("select col from test", buildSqlString("select col from test", false));
8181
}
8282

8383
public static void assertExpressionCanBeDeparsedAs(final Expression parsed, String expression) {

src/test/java/net/sf/jsqlparser/test/select/SelectTest.java

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -549,7 +549,7 @@ public void testExists() throws JSQLParserException {
549549
public void testOrderBy() throws JSQLParserException {
550550
// TODO: should there be a DESC marker in the OrderByElement class?
551551
String statement = "SELECT * FROM tab1 WHERE a > 34 GROUP BY tab1.b ORDER BY tab1.a DESC, tab1.b ASC";
552-
String statementToString = "SELECT * FROM tab1 WHERE a > 34 GROUP BY tab1.b ORDER BY tab1.a DESC, tab1.b";
552+
String statementToString = "SELECT * FROM tab1 WHERE a > 34 GROUP BY tab1.b ORDER BY tab1.a DESC, tab1.b ASC";
553553
Select select = (Select) parserManager.parse(new StringReader(statement));
554554
PlainSelect plainSelect = (PlainSelect) select.getSelectBody();
555555
assertEquals(2, plainSelect.getOrderByElements().size());
@@ -1415,4 +1415,9 @@ public void testCharacterSetClause() throws JSQLParserException {
14151415
String stmt="SELECT DISTINCT CAST(`view0`.`nick2` AS CHAR (8000) CHARACTER SET utf8) AS `v0` FROM people `view0` WHERE `view0`.`nick2` IS NOT NULL";
14161416
assertSqlCanBeParsedAndDeparsed(stmt);
14171417
}
1418+
1419+
public void testNotEqualsTo() throws JSQLParserException {
1420+
assertSqlCanBeParsedAndDeparsed("SELECT * FROM foo WHERE a != b");
1421+
assertSqlCanBeParsedAndDeparsed("SELECT * FROM foo WHERE a <> b");
1422+
}
14181423
}

src/test/java/net/sf/jsqlparser/test/select/SpecialOracleTests.java

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -23,29 +23,56 @@
2323
import java.util.logging.Level;
2424
import java.util.logging.Logger;
2525
import net.sf.jsqlparser.JSQLParserException;
26+
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
2627
import static net.sf.jsqlparser.test.TestUtils.*;
2728
import org.apache.commons.io.FileUtils;
2829
import org.junit.Test;
2930

3031
/**
31-
* Tries to parse and deparse all statments in net.sf.jsqlparser.test.oracle-tests.
32+
* Tries to parse and deparse all statments in
33+
* net.sf.jsqlparser.test.oracle-tests.
34+
*
3235
* @author toben
3336
*/
3437
public class SpecialOracleTests {
35-
36-
private static final File SQLS_DIR = new File("target/test-classes/net/sf/jsqlparser/test/oracle-tests");
38+
39+
private static final File SQLS_DIR = new File("target/test-classes/net/sf/jsqlparser/test/oracle-tests");
3740
private static final Logger LOG = Logger.getLogger(SpecialOracleTests.class.getName());
38-
41+
3942
@Test
40-
public void testAllSqls() throws IOException {
43+
public void testAllSqlsParseDeparse() throws IOException {
44+
int count=0;
45+
int success=0;
4146
File[] sqlTestFiles = SQLS_DIR.listFiles();
47+
48+
for (File file : sqlTestFiles) {
49+
if (file.isFile()) {
50+
count++;
51+
LOG.log(Level.INFO, "testing {0}", file.getName());
52+
String sql = FileUtils.readFileToString(file);
53+
try {
54+
assertSqlCanBeParsedAndDeparsed(sql, true);
55+
success++;
56+
LOG.info(" -> SUCCESS");
57+
} catch (JSQLParserException ex) {
58+
LOG.log(Level.SEVERE, null, ex);
59+
}
60+
}
61+
}
4262

63+
LOG.log(Level.INFO, "tested {0} files. got {1} correct parse results", new Object[]{count, success});
64+
}
65+
66+
@Test
67+
public void testAllSqlsOnlyParse() throws IOException {
68+
File[] sqlTestFiles = new File(SQLS_DIR, "only-parse-test").listFiles();
69+
4370
for (File file : sqlTestFiles) {
4471
LOG.log(Level.INFO, "testing {0}", file.getName());
4572
String sql = FileUtils.readFileToString(file);
4673
try {
47-
assertSqlCanBeParsedAndDeparsed(sql, true);
48-
74+
CCJSqlParserUtil.parse(sql);
75+
4976
LOG.info(" -> SUCCESS");
5077
} catch (JSQLParserException ex) {
5178
LOG.log(Level.SEVERE, null, ex);
Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1 @@
11
select decode(decode(decode( (select count(1) from dual), a, 1, 0), 0, 1), 1, 0) from dual
2-
-- select decode(decode(decode(decode(x, 0, 1) , 0, 1), 1, 0 ), 0, 1) from dual

src/test/resources/net/sf/jsqlparser/test/oracle-tests/groupby08.sql

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
select
22
c.constraint_name
3-
-- max(a.constraint_name) as constraint_name
4-
-- , c.constraint_name
53
, max(r.constraint_name) as r_constraint_name
64
, max(c.owner) as owner
75
, max(c.table_name) as table_name

0 commit comments

Comments
 (0)