Skip to content

Commit 5704172

Browse files
Merge branch 'master' into manticore
# Conflicts: # build.gradle # settings.gradle # src/test/java/net/sf/jsqlparser/statement/select/SpecialOracleTest.java # src/test/resources/net/sf/jsqlparser/statement/select/oracle-tests/condition11.sql
2 parents eff1d35 + 126c1a1 commit 5704172

File tree

24 files changed

+1279
-188
lines changed

24 files changed

+1279
-188
lines changed

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,11 @@ JSQLParser-5.4 Snapshot and later use JavaCC-8 Snapshots for generating the pars
7676
Unfortunately the released JSQLParser-5.2 shows a performance deterioration caused by commit [30cf5d7](https://github.com/JSQLParser/JSqlParser/commit/30cf5d7b930ae0a076f49deb5cc841d39e62b3dc) related to `FunctionAllColumns()`.
7777
This has been resolved in JSQLParser 5.3-SNAPSHOT and JMH benchmarks have been added to avoid such regressions in the future. Further all `LOOKAHEAD` have been revised one by one, and we have gained back a very good performance of the Parser.
7878

79+
As per March-2026, the productions `Condition()`, `RegularCondition()` and `AndExpression()` have been refactored successfully. This resulted in a massive performance boost and seem to have solved most of the performance issues.
80+
7981
```text
8082
Benchmark (version) Mode Cnt Score Error Units
81-
JSQLParserBenchmark.parseSQLStatements latest avgt 15 82.695 ± 2.841 ms/op
83+
JSQLParserBenchmark.parseSQLStatements latest avgt 15 33.995 ± 0.764 ms/op <-- March/26
8284
JSQLParserBenchmark.parseSQLStatements 5.3 avgt 15 84.687 ± 3.321 ms/op
8385
JSQLParserBenchmark.parseSQLStatements 5.1 avgt 15 86.592 ± 5.781 ms/op
8486
```
@@ -105,7 +107,6 @@ If you like JSqlParser then please check out its related projects:
105107
* [JSQLTranspiler](https://manticore-projects.com/JSQLTranspiler/index.html) for dialect specific rewriting, SQL Column resolution and Lineage, provided by [Starlake.ai](https://starlake.ai/)
106108

107109
## Alternatives to JSqlParser?
108-
[**General SQL Parser**](http://www.sqlparser.com/features/introduce.php?utm_source=github-jsqlparser&utm_medium=text-general) looks pretty good, with extended SQL syntax (like PL/SQL and T-SQL) and java + .NET APIs. The tool is commercial (license available online), with a free download option.
109110

110111
Alternatively the dual-licensed [JOOQ](https://www.jooq.org/doc/latest/manual/sql-building/sql-parser/) provides a handwritten Parser supporting a lot of RDBMS, translation between dialects, SQL transformation, can be used as a JDBC proxy for translation and transformation purposes.
111112

settings.gradle

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,5 @@
1-
rootProject.name = 'JSQLParser'
1+
/*
2+
* This file was generated by the Gradle 'init' task.
3+
*/
4+
5+
rootProject.name = 'JSQLParser'

src/main/java/net/sf/jsqlparser/schema/Sequence.java

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,12 @@
99
*/
1010
package net.sf.jsqlparser.schema;
1111

12-
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
13-
1412
import java.util.ArrayList;
1513
import java.util.Collection;
1614
import java.util.Collections;
1715
import java.util.List;
1816
import java.util.Optional;
17+
import net.sf.jsqlparser.parser.ASTNodeAccessImpl;
1918

2019
/**
2120
* Represents the database type for a {@code SEQUENCE}
@@ -29,6 +28,7 @@ public class Sequence extends ASTNodeAccessImpl implements MultiPartName {
2928
private List<String> partItems = new ArrayList<>();
3029

3130
private List<Parameter> parameters;
31+
private String dataType;
3232

3333
public Sequence() {}
3434

@@ -45,6 +45,19 @@ public void setParameters(List<Parameter> parameters) {
4545
this.parameters = parameters;
4646
}
4747

48+
public String getDataType() {
49+
return dataType;
50+
}
51+
52+
public void setDataType(String dataType) {
53+
this.dataType = dataType;
54+
}
55+
56+
public Sequence withDataType(String dataType) {
57+
this.setDataType(dataType);
58+
return this;
59+
}
60+
4861
public Database getDatabase() {
4962
return new Database(getIndex(DATABASE_IDX));
5063
}
@@ -129,6 +142,9 @@ public String getUnquotedName() {
129142
@Override
130143
public String toString() {
131144
StringBuilder sql = new StringBuilder(getFullyQualifiedName());
145+
if (dataType != null) {
146+
sql.append(" AS ").append(dataType);
147+
}
132148
if (parameters != null) {
133149
for (Sequence.Parameter parameter : parameters) {
134150
sql.append(" ").append(parameter.formatParameter());

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

Lines changed: 23 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,25 +9,25 @@
99
*/
1010
package net.sf.jsqlparser.statement.select;
1111

12-
import net.sf.jsqlparser.expression.Alias;
13-
import net.sf.jsqlparser.statement.ParenthesedStatement;
14-
import net.sf.jsqlparser.statement.StatementVisitor;
15-
import net.sf.jsqlparser.statement.delete.ParenthesedDelete;
16-
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
17-
import net.sf.jsqlparser.statement.update.ParenthesedUpdate;
18-
1912
import java.io.Serializable;
2013
import java.util.ArrayList;
2114
import java.util.Collection;
2215
import java.util.Collections;
2316
import java.util.List;
2417
import java.util.Optional;
18+
import net.sf.jsqlparser.expression.Alias;
19+
import net.sf.jsqlparser.statement.ParenthesedStatement;
20+
import net.sf.jsqlparser.statement.StatementVisitor;
21+
import net.sf.jsqlparser.statement.delete.ParenthesedDelete;
22+
import net.sf.jsqlparser.statement.insert.ParenthesedInsert;
23+
import net.sf.jsqlparser.statement.update.ParenthesedUpdate;
2524

2625
public class WithItem<K extends ParenthesedStatement> implements Serializable {
2726
private K statement;
2827
private Alias alias;
2928
private List<SelectItem<?>> withItemList;
3029
private WithFunctionDeclaration withFunctionDeclaration;
30+
private WithSearchClause searchClause;
3131
private boolean recursive = false;
3232
private boolean usingNot = false;
3333
private boolean materialized = false;
@@ -136,6 +136,19 @@ public WithItem<K> withWithFunctionDeclaration(
136136
return this;
137137
}
138138

139+
public WithSearchClause getSearchClause() {
140+
return searchClause;
141+
}
142+
143+
public void setSearchClause(WithSearchClause searchClause) {
144+
this.searchClause = searchClause;
145+
}
146+
147+
public WithItem<K> withSearchClause(WithSearchClause searchClause) {
148+
this.setSearchClause(searchClause);
149+
return this;
150+
}
151+
139152
@Override
140153
public String toString() {
141154
StringBuilder builder = new StringBuilder();
@@ -161,6 +174,9 @@ public String toString() {
161174
: "MATERIALIZED ");
162175
}
163176
builder.append(statement);
177+
if (searchClause != null) {
178+
builder.append(" ").append(searchClause);
179+
}
164180
}
165181
return builder.toString();
166182
}
Lines changed: 100 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,100 @@
1+
/*-
2+
* #%L
3+
* JSQLParser library
4+
* %%
5+
* Copyright (C) 2004 - 2026 JSQLParser
6+
* %%
7+
* Dual licensed under GNU LGPL 2.1 or Apache License 2.0
8+
* #L%
9+
*/
10+
package net.sf.jsqlparser.statement.select;
11+
12+
import java.io.Serializable;
13+
import java.util.Collection;
14+
15+
import net.sf.jsqlparser.expression.operators.relational.ExpressionList;
16+
import net.sf.jsqlparser.schema.Column;
17+
18+
public class WithSearchClause implements Serializable {
19+
public enum SearchOrder {
20+
BREADTH, DEPTH
21+
}
22+
23+
private SearchOrder searchOrder;
24+
private ExpressionList<Column> searchColumns;
25+
private String sequenceColumnName;
26+
27+
public WithSearchClause() {}
28+
29+
public WithSearchClause(SearchOrder searchOrder, ExpressionList<Column> searchColumns,
30+
String sequenceColumnName) {
31+
this.searchOrder = searchOrder;
32+
this.searchColumns = searchColumns;
33+
this.sequenceColumnName = sequenceColumnName;
34+
}
35+
36+
public SearchOrder getSearchOrder() {
37+
return searchOrder;
38+
}
39+
40+
public void setSearchOrder(SearchOrder searchOrder) {
41+
this.searchOrder = searchOrder;
42+
}
43+
44+
public WithSearchClause withSearchOrder(SearchOrder searchOrder) {
45+
this.setSearchOrder(searchOrder);
46+
return this;
47+
}
48+
49+
public ExpressionList<Column> getSearchColumns() {
50+
return searchColumns;
51+
}
52+
53+
public void setSearchColumns(ExpressionList<Column> searchColumns) {
54+
this.searchColumns = searchColumns;
55+
}
56+
57+
public WithSearchClause withSearchColumns(ExpressionList<Column> searchColumns) {
58+
this.setSearchColumns(searchColumns);
59+
return this;
60+
}
61+
62+
public WithSearchClause addSearchColumns(Column... searchColumns) {
63+
ExpressionList<Column> collection =
64+
getSearchColumns() != null ? getSearchColumns() : new ExpressionList<>();
65+
collection.addExpressions(searchColumns);
66+
return this.withSearchColumns(collection);
67+
}
68+
69+
public WithSearchClause addSearchColumns(Collection<? extends Column> searchColumns) {
70+
ExpressionList<Column> collection =
71+
getSearchColumns() != null ? getSearchColumns() : new ExpressionList<>();
72+
collection.addAll(searchColumns);
73+
return this.withSearchColumns(collection);
74+
}
75+
76+
public String getSequenceColumnName() {
77+
return sequenceColumnName;
78+
}
79+
80+
public void setSequenceColumnName(String sequenceColumnName) {
81+
this.sequenceColumnName = sequenceColumnName;
82+
}
83+
84+
public WithSearchClause withSequenceColumnName(String sequenceColumnName) {
85+
this.setSequenceColumnName(sequenceColumnName);
86+
return this;
87+
}
88+
89+
@Override
90+
public String toString() {
91+
return new StringBuilder()
92+
.append("SEARCH ")
93+
.append(searchOrder)
94+
.append(" FIRST BY ")
95+
.append(Select.getStringList(searchColumns))
96+
.append(" SET ")
97+
.append(sequenceColumnName)
98+
.toString();
99+
}
100+
}

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -755,6 +755,9 @@ public <S> StringBuilder visit(WithItem<?> withItem, S context) {
755755
StatementDeParser statementDeParser =
756756
new StatementDeParser((ExpressionDeParser) expressionVisitor, this, builder);
757757
statementDeParser.deParse(withItem.getParenthesedStatement());
758+
if (withItem.getSearchClause() != null) {
759+
builder.append(" ").append(withItem.getSearchClause());
760+
}
758761
} else {
759762
builder.append(withItem.getWithFunctionDeclaration().toString());
760763
}

0 commit comments

Comments
 (0)