Skip to content

Commit

Permalink
JSQLParser 5.0 (#1778)
Browse files Browse the repository at this point in the history
* Fixes #1684: Support CREATE MATERIALIZED VIEW with AUTO REFRESH

Support parsing create view statements in Redshift with AUTO REFRESH
option.

* Reduce cyclomatic complexity in CreateView.toString

Extract adding the force option into a dedicated method resulting in the
cyclomatic complexity reduction of the CreateView.toString method.

* Enhanced Keywords

Add Keywords and document, which keywords are allowed for what purpose

* Fix incorrect tests

* Define Reserved Keywords explicitly
Derive All Keywords from Grammar directly
Generate production for Object Names (semi-) automatically
Add parametrized Keyword Tests

* Fix test resources

* Adjust Gradle to JUnit 5

Parallel Test execution
Gradle Caching
Explicitly request for latest JavaCC 7.0.10

* Do not mark SpeedTest for concurrent execution

* Remove unused imports

* Adjust Gradle to JUnit 5

Parallel Test execution
Gradle Caching
Explicitly request for latest JavaCC 7.0.10

* Do not mark SpeedTest for concurrent execution

* Remove unused imports

* Sphinx Documentation

Update the MANTICORE Sphinx Theme, but ignore it in GIT
Add the content to the Sphinx sites
Add a Gradle function to derive Stable and Snapshot version from GIT Tags
Add a Gradle GIT change task
Add a Gradle sphinx task
Add a special Test case for illustrating the use of JSQLParser

* doc: request for `Conventional Commit` messages

* feat: make important Classes Serializable

Implement Serializable for persisting via ObjectOutputStream

* chore: Make Serializable

* doc: Better integration of the RR diagrams

- apply neutral Sphinx theme
- insert the RR diagrams into the sphinx sources
- better documentation on Gradle dependencies
- link GitHub repository

* Merge

* feat: Oracle Alternative Quoting

- add support for Oracle Alternative Quoting e.g. `q'(...)'`
- fixes #1718
- add a Logo and FavIcon to the Website
- document recent changes on Quoting/Escaping
- add an example on building SQL from Java
- rework the README.md, promote the Website
- add Spotless Formatter, using Google Java Style (with Tab=4 Spaces)

* style: Appease PMD/Codacy

* doc: fix the issue template

- fix the issue template
- fix the -SNAPSHOT version number

* Update issue templates

* Update issue templates

* feat: Support more Statement Separators

- `GO`
- Slash `/`
- Two empty lines

* feat: FETCH uses EXPRESSION

- `FETCH` uses `EXPRESSION` instead of SimpleJDBCParameter only
- Visit/Accept `FETCH` `EXPRESSION` instead of `append` to String
- Visit/Accept `OFFSET` `EXPRESSION` instead of `append` to String
- Gradle: remove obsolete/incompatible `jvmArgs` from Test()

* style: apply Spotless

* test: commit missing test

* feat: Lateral View

Implement Lateral View according to https://spark.apache.org/docs/latest/sql-ref-syntax-qry-select-lateral-view.html#syntax
Add proper tests

Fixes #1777
Fixes #239
Fixes #1723

* feat: Oracle `HAVING` before `GROUP BY`

Basic support for Oracle's `HAVING` before `GROUP BY` option.
It will be parsed without any special consideration for the order.
Special Oracle Test groupby07.sql gets parsed, but fails when the deparser reorders the clauses.

Fixes #1774

* feat: Multi-Part Names for Variables and Parameters

Fixes #1771
Fixes #1768

* feat: ClickHouse `Select...` ``FINAL` modifier

Fixes #1774

BREAKING-CHANGE: introduces reserved keyword `FINAL`

* feat: Test if a JOIN is an INNER JOIN according to the SQL:2016

An `INNER JOIN` is a qualified `JOIN` with the `INNER` qualifier or without any `LEFT` or `RIGHT` qualifier.

Fixes #1775

* feat: Switch off contradicting `JOIN` qualifiers, when setting a qualifier

* feat: implement SQL:2016 Convert() and Trim()

- Fixes #868
- Fixes #1767
- Fixes Special Oracle Test `function03.sql`

* feat: ClickHouse `LIMIT ... BY ...` clause

- LimitDeparser accepts ExpressionVisitor
- `SELECT` can have optional `LIMIT ... BY ...` clause
- Fixes #1436

* test: add specific tests for closed issues

* test: add specific tests for closed issues

* refactor: remove `SelectExpressionItem` in favor of `SelectItem`

BREAKING-CHANGE: `SelectExpressionItem` removed

* doc: Update examples

* build: Add missing import

* doc: Update the README.md

* fix: assign Enum case insensitive

Fixes #1779

* fix: assign Enum case insensitive

Remove redundant `DateTime` enum
Fixes #1779

* Revert "fix: assign Enum case insensitive"

This reverts commit 86d0ace.

* feat: Consolidate the `ExpressionList`, removing many redundant List alike Classes and Productions

- `ExpressionList` extends a `List<Expression>` directly and implements `Expression`
- `ExpressionList` has no Brackets
- introduce `ParenthesedExpressionList` which extends `ExpressionList` and has Brackets
- refactor `MultiExpressionList` to extend `List<ExpressionList>`
- replace any occurrence of `List<Expression>` with `ExpressionList` and remove lots of redundant Productions
- `RowConstructor` extends `ExpressionList`
- remove redundant `ValueExpressionList` (it was just an `ExpressionList`
- get rid of any `useBrackets` flags
- consolidate the `Cast` Functions
- use `ExpressionListDeparser` as much as possible

BREAKING-CHANGE: All `List<Expression>` and `List<Column>` related methods have changed. No `useBrackets` flags, instead use `ParenthesedExpressionList` when brackets are needed.

* fix: Remove tests for `()`, since `ParenthesedExpressionList` will catch those too

* refactor: UpdateSets for `Update` and `InsertConflictTarget`

- remove redundant code
- add license headers
- register `function06.sql` success

* build: Increase TimeOut for the GitHub CI

* style: Appease Codacy

* style: Checkstyle

* refactor: Remove `ItemsList`, `MultiExpressionList`, `Replace`

Since we have proper `ExpressionList` implementing `Expression` we can narrow down the API:

- remove `ItemsList`, `ItemsListVisitor`, `ItemsListValidator` in favor of `ExpressionList`
- remove `MultiExpressionList` in favor of `ExpressionList`
- refactor `NamedExpressionList` so it extends `ExpressionList` and uses `ExpressionListDeparser`
- simplify `InExpression` and `AnyComparisionExpression`

BREAKING-CHANGE: many Classes and Methods removed

* style: Appease Codacy

* style: Rework all the ENUMs

- assign Value only when really needed
- implement `from()` method for getting the case-insensitive Enum

* doc: Better Sphinx Tabs

Addresses issue #1784 item 2

* doc: RR chart colors cater for Dark Mode

Addresses issue #1784 item 3

* refactor: remove SimpleFunction

Remove the production `SimpleFunction`
Clean-up `InternalFunction`

* build: improve Gradle Build

- fix Version/Snapshot
- add XML Doclet (for generating API Website via XSLT later)
- fix the publishing task and add GitHub package

* refactor: `Insert` uses `ExpressionList` and `UpdateSet`

* test: Disable API Sanitation for the moment

* style: Appease Checkstyle

* style: Appease PMD

* fix: find the correct position when field belongs to an internal class

* style: replace all List<Expression> with ExpressionList<> and enforce policy via Acceptance Test

- refactor `Merge`, use `ExpressionList`, `UpdateSet` and Visitor Pattern
- refactor `Upsert`, use `ExpressionList`, `UpdateSet` and Visitor Pattern
- refactor `Set` Statement
- refactor `Limit`, `Pivot`, `Unpivot`

** Breaking Changes ** Getters/Setters of `Merge`, `Upsert`, `Set` have changed

* refactor: generify `SelectItem` and remove `FunctionItem` and `ExpressionListItem`

- generify `SelectItem<T extends Expression>`
- replace `FunctionItem` with `SelectItem<Function>`
- replace `ExpressionListItem` with `SelectItem<ExpressionList>`
- appease PMD/Codacy

** Breaking Changes ** Getters/Setters of `Pivot`, `UnPivot`, `PivotXML` have changed

* fix: Java Version 8

* feat: JdbcNamedParameter allows "&" (instead of ":")

- fixes #1785

* feat: access Elements of Array Columns
- Example `update utilisateur set listes[0] = 1`
- fixes #1083

* feat: `MEMBER OF` condition as shown at https://dev.mysql.com/doc/refman/8.0/en/json-search-functions.html#operator_member-of

- fixes #1631

* style: appease PMD/Codacy

* style: appease PMD/Codacy

* test: add unit test for issue #1778

* feat: Write API documentation to the WebSite via XMLDoclet

* Update sphinx.yml

* build: Sphinx build fixes

* build: Sphinx build fixes

* build: Sphinx build fixes

* build: improve the GIT Snapshot detection

* fix: issue #1791

- Allow `START` keyword as table `CreateParameter`

* fix: issue #1789

- allow `CREATE TABLE ...` column parameter with Postgres`nextval('public.actor_actor_id_seq'::regclass)`

* fix: issue #1789

- allow `CREATE TABLE ...` column parameter with Postgres`nextval('public.actor_actor_id_seq'::regclass)`

* refactor: simplify production `CreateParameter()`

* refactor: SHOW statement, supporting any RDBMS specific implementation

- returns any RDBMS specific implementation as `UnsupportedStatement`
- fixes #1702

* refactor: RETURNING clause

- supports Oracle's `RETURN ... INTO ...`
- fixes #1780
- fixes #686
- Special Oracle tests `insert11.sql` and `insert12.sql`

* refactor: CREATE and ALTER productions

- avoid LOOKAHEADs
- simplify the SimpleStatement() production
- use UnsupportedStatements() for any RDBMS specific syntax
- fixes #1515
- fixes #1453

* fix: Complex Parsing Approach

- optionally provide a global Executor, instead spawning one for each parse
- run into Complex Parsing only, when Complex Parsing was allowed
- provide a Logger
- fixes #1792

* style: Quieten the logger

* style: Cosmetic improvements

* feat: chaining JSON Expressions

- supports chains like '{"obj":{"field": "value"}}'::JSON -> 'obj'::TEXT ->> 'field'::TEXT
- fixes #1792

* style: remove unused imports

* refact: Statements extends List<Statement>

* build: try to work around the Maven/JDK8 issue on GitHub

* feat: parse CREATE TRIGGER as UnsupportedStatement

- fixes #1090

* feat: functions blocks, parenthesed JSON Expressions

- fixes #1792, the very complex example
- fixes #1477

* feat: functions blocks, parenthesed JSON Expressions

- fixes #1792, the very complex example
- fixes #1477
- cosmetics

* feat: Quoted Identifiers can contain double-quotes (PostgreSQL)

- `SELECT "test""column""name"`
- fixes #1335

* build: improve Upload task

* doc: Website improvements

- Show Release vs. SNAPSHOT
- FURO theme
- fix inline tab appearance

---------

Co-authored-by: zaza <tzarna@gmail.com>
  • Loading branch information
manticore-projects and zaza authored Jun 1, 2023
1 parent 3314edf commit 41b6fce
Show file tree
Hide file tree
Showing 204 changed files with 9,912 additions and 8,836 deletions.
4 changes: 2 additions & 2 deletions .github/workflows/sphinx.yml
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ jobs:
- name: Install XSLT Processor
run: sudo apt-get install xsltproc sphinx-common
- name: Install dependencies
run: pip install sphinx_rtd_theme sphinx-book-theme myst_parser sphinx-prompt sphinx_substitution_extensions sphinx_issues sphinx_tabs pygments
run: pip install sphinx_rtd_theme sphinx-book-theme myst_parser sphinx-prompt sphinx_substitution_extensions sphinx_issues sphinx-tabs sphinx_inline_tabs pygments
- name: Checkout project sources
uses: actions/checkout@v2
with:
Expand All @@ -18,7 +18,7 @@ jobs:
- name: Setup Gradle
uses: gradle/gradle-build-action@v2
- name: Run build with Gradle Wrapper
run: gradle sphinx
run: gradle --no-build-cache clean xmldoc sphinx
- name: Deploy
uses: actions/configure-pages@v2
- name: Upload artifact
Expand Down
4 changes: 4 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,8 @@

# Exclude the Auto-generated Changelog
/src/site/sphinx/changelog.rst
/src/site/sphinx/javadoc_stable.rst
/src/site/sphinx/syntax_stable.rst

# Generated by javacc-maven-plugin
/bin
Expand All @@ -27,3 +29,5 @@
/nbproject/

/.gradle
/src/site/sphinx/javadoc_snapshot.rst
/src/site/sphinx/syntax_snapshot.rst
39 changes: 22 additions & 17 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -19,29 +19,34 @@ SELECT 1 FROM dual WHERE a = b

```text
SQL Text
└─Statements: net.sf.jsqlparser.statement.select.PlainSelect
├─selectItems -> Collection<SelectExpressionItem>
│ └─selectItems: net.sf.jsqlparser.statement.select.SelectExpressionItem
│ └─LongValue: 1
├─Table: dual
└─where: net.sf.jsqlparser.expression.operators.relational.EqualsTo
├─Column: a
└─Column: b
└─Statements: net.sf.jsqlparser.statement.select.Select
├─selectItems -> Collection<SelectItem>
│ └─LongValue: 1
├─Table: dual
└─where: net.sf.jsqlparser.expression.operators.relational.EqualsTo
├─Column: a
└─Column: b
```

```java
Statement statement = CCJSqlParserUtil.parse(sqlStr);
if (statement instanceof PlainSelect) {
PlainSelect plainSelect = (PlainSelect) statement;
String sqlStr = "select 1 from dual where a=b";

SelectExpressionItem selectExpressionItem =
(SelectExpressionItem) plainSelect.getSelectItems().get(0);
PlainSelect select = (PlainSelect) CCJSqlParserUtil.parse(sqlStr);

Table table = (Table) plainSelect.getFromItem();
SelectItem selectItem =
select.getSelectItems().get(0);
Assertions.assertEquals(
new LongValue(1)
, selectItem.getExpression());

EqualsTo equalsTo = (EqualsTo) plainSelect.getWhere();
Column a = (Column) equalsTo.getLeftExpression();
Column b = (Column) equalsTo.getRightExpression();
Table table = (Table) select.getFromItem();
Assertions.assertEquals("dual", table.getName());

EqualsTo equalsTo = (EqualsTo) select.getWhere();
Column a = (Column) equalsTo.getLeftExpression();
Column b = (Column) equalsTo.getRightExpression();
Assertions.assertEquals("a", a.getColumnName());
Assertions.assertEquals("b", b.getColumnName());
}
```

Expand Down
Loading

0 comments on commit 41b6fce

Please sign in to comment.